feie-api.integration.test.ts 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. import { describe, it, expect, beforeAll, afterAll } from 'vitest';
  2. import { DataSource } from 'typeorm';
  3. import { createTestDataSource } from '@d8d/shared-test-util';
  4. import { FeieApiService } from '../../src/services/feie-api.service';
  5. import { PrinterService } from '../../src/services/printer.service';
  6. import { PrintTaskService } from '../../src/services/print-task.service';
  7. import { FeiePrinterMt } from '../../src/entities/feie-printer.mt.entity';
  8. import { FeiePrintTaskMt } from '../../src/entities/feie-print-task.mt.entity';
  9. import { FeieConfigMt } from '../../src/entities/feie-config.mt.entity';
  10. import type { FeieApiConfig, PrinterDto, CreatePrintTaskDto } from '../../src/types/feie.types';
  11. describe('飞鹅打印模块集成测试', () => {
  12. let dataSource: DataSource;
  13. let feieApiService: FeieApiService;
  14. let printerService: PrinterService;
  15. let printTaskService: PrintTaskService;
  16. // 测试配置 - 使用模拟配置,实际测试应该使用测试环境的飞鹅账号
  17. const testFeieConfig: FeieApiConfig = {
  18. baseUrl: process.env.TEST_FEIE_API_BASE_URL || 'http://api.feieyun.cn/Api/Open/',
  19. user: process.env.TEST_FEIE_API_USER || 'test_user',
  20. ukey: process.env.TEST_FEIE_API_UKEY || 'test_ukey',
  21. timeout: 5000,
  22. maxRetries: 1
  23. };
  24. beforeAll(async () => {
  25. // 创建测试数据库连接
  26. dataSource = await createTestDataSource({
  27. entities: [FeiePrinterMt, FeiePrintTaskMt, FeieConfigMt],
  28. synchronize: true,
  29. dropSchema: true
  30. });
  31. // 初始化服务
  32. feieApiService = new FeieApiService(testFeieConfig);
  33. printerService = new PrinterService(dataSource, testFeieConfig);
  34. printTaskService = new PrintTaskService(dataSource, testFeieConfig);
  35. });
  36. afterAll(async () => {
  37. if (dataSource && dataSource.isInitialized) {
  38. await dataSource.destroy();
  39. }
  40. });
  41. describe('数据库连接', () => {
  42. it('应该成功连接数据库', () => {
  43. expect(dataSource.isInitialized).toBe(true);
  44. });
  45. it('应该能够访问实体仓库', () => {
  46. const printerRepository = dataSource.getRepository(FeiePrinterMt);
  47. const taskRepository = dataSource.getRepository(FeiePrintTaskMt);
  48. const configRepository = dataSource.getRepository(FeieConfigMt);
  49. expect(printerRepository).toBeDefined();
  50. expect(taskRepository).toBeDefined();
  51. expect(configRepository).toBeDefined();
  52. });
  53. });
  54. describe('打印机管理', () => {
  55. const tenantId = 1;
  56. const testPrinter: PrinterDto = {
  57. printerSn: 'TEST_SN_' + Date.now(),
  58. printerKey: 'TEST_KEY_' + Date.now(),
  59. printerName: '测试打印机',
  60. printerType: '58mm',
  61. isDefault: true
  62. };
  63. it('应该能够添加打印机(模拟)', async () => {
  64. // 注意:实际测试需要有效的飞鹅账号
  65. // 这里我们主要测试服务层的逻辑,API调用会被模拟
  66. console.log('打印机添加测试(使用模拟配置)');
  67. // 由于我们使用测试配置,实际API调用会失败
  68. // 我们主要验证服务层的错误处理
  69. try {
  70. await printerService.addPrinter(tenantId, testPrinter);
  71. // 如果成功,验证打印机被创建
  72. const printers = await printerService.getPrinters(tenantId);
  73. expect(printers.length).toBeGreaterThan(0);
  74. } catch (error) {
  75. // 预期会失败,因为测试配置无效
  76. console.log('预期中的API调用失败:', error.message);
  77. expect(error).toBeDefined();
  78. }
  79. });
  80. it('应该能够查询打印机列表', async () => {
  81. // 直接测试数据库操作
  82. const printerRepository = dataSource.getRepository(FeiePrinterMt);
  83. // 创建测试数据
  84. const testPrinterData = printerRepository.create({
  85. tenantId,
  86. printerSn: 'TEST_QUERY_SN',
  87. printerKey: 'TEST_QUERY_KEY',
  88. printerName: '查询测试打印机',
  89. printerType: '80mm',
  90. printerStatus: 'ACTIVE',
  91. isDefault: 0
  92. });
  93. await printerRepository.save(testPrinterData);
  94. // 查询
  95. const printers = await printerService.getPrinters(tenantId);
  96. expect(Array.isArray(printers)).toBe(true);
  97. });
  98. it('应该能够设置默认打印机', async () => {
  99. // 创建两个打印机
  100. const printerRepository = dataSource.getRepository(FeiePrinterMt);
  101. const printer1 = printerRepository.create({
  102. tenantId,
  103. printerSn: 'DEFAULT_TEST_1',
  104. printerKey: 'KEY1',
  105. printerName: '打印机1',
  106. printerType: '58mm',
  107. printerStatus: 'ACTIVE',
  108. isDefault: 1
  109. });
  110. const printer2 = printerRepository.create({
  111. tenantId,
  112. printerSn: 'DEFAULT_TEST_2',
  113. printerKey: 'KEY2',
  114. printerName: '打印机2',
  115. printerType: '80mm',
  116. printerStatus: 'ACTIVE',
  117. isDefault: 0
  118. });
  119. await printerRepository.save([printer1, printer2]);
  120. // 设置打印机2为默认
  121. await printerService.setDefaultPrinter(tenantId, 'DEFAULT_TEST_2');
  122. // 验证
  123. const defaultPrinter = await printerService.getDefaultPrinter(tenantId);
  124. expect(defaultPrinter).toBeDefined();
  125. expect(defaultPrinter?.printerSn).toBe('DEFAULT_TEST_2');
  126. expect(defaultPrinter?.isDefault).toBe(1);
  127. });
  128. });
  129. describe('打印任务管理', () => {
  130. const tenantId = 2;
  131. let testPrinterSn: string;
  132. beforeAll(async () => {
  133. // 创建测试打印机
  134. const printerRepository = dataSource.getRepository(FeiePrinterMt);
  135. testPrinterSn = 'TASK_TEST_SN_' + Date.now();
  136. const testPrinter = printerRepository.create({
  137. tenantId,
  138. printerSn: testPrinterSn,
  139. printerKey: 'TASK_TEST_KEY',
  140. printerName: '任务测试打印机',
  141. printerType: '58mm',
  142. printerStatus: 'ACTIVE',
  143. isDefault: 1
  144. });
  145. await printerRepository.save(testPrinter);
  146. });
  147. it('应该能够创建立即打印任务', async () => {
  148. const taskDto: CreatePrintTaskDto = {
  149. printerSn: testPrinterSn,
  150. content: '<CB>测试打印内容</CB><BR>',
  151. printType: 'RECEIPT',
  152. delaySeconds: 0
  153. };
  154. const task = await printTaskService.createPrintTask(tenantId, taskDto);
  155. expect(task).toBeDefined();
  156. expect(task.taskId).toBeDefined();
  157. expect(task.printerSn).toBe(testPrinterSn);
  158. expect(task.printType).toBe('RECEIPT');
  159. expect(task.printStatus).toBe('PENDING'); // 立即打印任务状态为PENDING
  160. });
  161. it('应该能够创建延迟打印任务', async () => {
  162. const taskDto: CreatePrintTaskDto = {
  163. printerSn: testPrinterSn,
  164. content: '<CB>延迟打印测试</CB><BR>',
  165. printType: 'RECEIPT',
  166. delaySeconds: 10 // 10秒延迟
  167. };
  168. const task = await printTaskService.createPrintTask(tenantId, taskDto);
  169. expect(task).toBeDefined();
  170. expect(task.printStatus).toBe('DELAYED');
  171. expect(task.scheduledAt).toBeDefined();
  172. expect(task.scheduledAt).toBeInstanceOf(Date);
  173. });
  174. it('应该能够查询打印任务列表', async () => {
  175. const result = await printTaskService.getPrintTasks(tenantId, {}, 1, 10);
  176. expect(result).toBeDefined();
  177. expect(result.tasks).toBeInstanceOf(Array);
  178. expect(result.total).toBeGreaterThanOrEqual(0);
  179. });
  180. it('应该能够根据条件筛选打印任务', async () => {
  181. const filters = {
  182. printerSn: testPrinterSn,
  183. printType: 'RECEIPT' as const
  184. };
  185. const result = await printTaskService.getPrintTasks(tenantId, filters, 1, 10);
  186. expect(result).toBeDefined();
  187. // 验证筛选条件
  188. if (result.tasks.length > 0) {
  189. result.tasks.forEach(task => {
  190. expect(task.printerSn).toBe(testPrinterSn);
  191. expect(task.printType).toBe('RECEIPT');
  192. });
  193. }
  194. });
  195. });
  196. describe('错误处理', () => {
  197. const tenantId = 3;
  198. it('应该在打印机不存在时抛出错误', async () => {
  199. const taskDto: CreatePrintTaskDto = {
  200. printerSn: 'NONEXISTENT_PRINTER',
  201. content: '测试内容',
  202. printType: 'RECEIPT'
  203. };
  204. await expect(printTaskService.createPrintTask(tenantId, taskDto))
  205. .rejects
  206. .toThrow('打印机不存在');
  207. });
  208. it('应该在打印任务不存在时抛出错误', async () => {
  209. await expect(printTaskService.getPrintTaskStatus(tenantId, 'NONEXISTENT_TASK'))
  210. .rejects
  211. .toThrow('打印任务不存在');
  212. });
  213. });
  214. });