2
0

printer.service.test.ts 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. import { describe, it, expect, vi, beforeEach } from 'vitest';
  2. import { DataSource } from 'typeorm';
  3. import { PrinterService } from '../../src/services/printer.service';
  4. import { FeiePrinterMt } from '../../src/entities/feie-printer.mt.entity';
  5. import type { FeieApiConfig, PrinterDto } from '../../src/types/feie.types';
  6. // Mock dependencies
  7. vi.mock('../../src/services/feie-api.service', () => {
  8. return {
  9. FeieApiService: vi.fn().mockImplementation(() => ({
  10. validatePrinterConfig: vi.fn().mockResolvedValue(true),
  11. addPrinter: vi.fn().mockResolvedValue({ ret: 0, msg: 'success' }),
  12. deletePrinter: vi.fn().mockResolvedValue({ ret: 0, msg: 'success' }),
  13. queryPrinterStatus: vi.fn().mockResolvedValue({ ret: 0, data: [] }),
  14. batchQueryPrinterStatus: vi.fn().mockResolvedValue({ ret: 0, data: [] })
  15. }))
  16. };
  17. });
  18. vi.mock('@d8d/shared-crud', () => {
  19. return {
  20. GenericCrudService: vi.fn().mockImplementation(() => ({
  21. create: vi.fn(),
  22. findOne: vi.fn(),
  23. findMany: vi.fn(),
  24. update: vi.fn(),
  25. delete: vi.fn()
  26. }))
  27. };
  28. });
  29. describe('PrinterService', () => {
  30. let printerService: PrinterService;
  31. let mockDataSource: DataSource;
  32. const mockFeieConfig: FeieApiConfig = {
  33. baseUrl: 'http://api.feieyun.cn/Api/Open/',
  34. user: 'test_user',
  35. ukey: 'test_ukey'
  36. };
  37. beforeEach(() => {
  38. vi.clearAllMocks();
  39. mockDataSource = {
  40. getRepository: vi.fn()
  41. } as unknown as DataSource;
  42. printerService = new PrinterService(mockDataSource, mockFeieConfig);
  43. // 手动设置模拟的方法,因为PrinterService继承自GenericCrudService
  44. // 而模拟可能没有正确应用到实例上
  45. (printerService as any).create = vi.fn();
  46. (printerService as any).findOne = vi.fn();
  47. (printerService as any).findMany = vi.fn();
  48. (printerService as any).update = vi.fn();
  49. (printerService as any).delete = vi.fn();
  50. });
  51. describe('addPrinter', () => {
  52. it('应该成功添加打印机', async () => {
  53. const tenantId = 1;
  54. const printerDto: PrinterDto = {
  55. printerSn: 'TEST123456',
  56. printerKey: 'test_key',
  57. printerName: '测试打印机',
  58. printerType: '58mm',
  59. isDefault: false
  60. };
  61. const mockPrinter: Partial<FeiePrinterMt> = {
  62. id: 1,
  63. tenantId,
  64. ...printerDto,
  65. printerStatus: 'ACTIVE',
  66. isDefault: 0
  67. };
  68. // Mock the create method
  69. (printerService as any).create = vi.fn().mockResolvedValue(mockPrinter);
  70. const result = await printerService.addPrinter(tenantId, printerDto);
  71. expect(result).toEqual(mockPrinter);
  72. expect((printerService as any).create).toHaveBeenCalledWith({
  73. tenantId,
  74. printerSn: printerDto.printerSn,
  75. printerKey: printerDto.printerKey,
  76. printerName: printerDto.printerName,
  77. printerType: printerDto.printerType,
  78. printerStatus: 'ACTIVE',
  79. isDefault: 0
  80. });
  81. });
  82. it('应该在打印机配置验证失败时抛出错误', async () => {
  83. const tenantId = 1;
  84. const printerDto: PrinterDto = {
  85. printerSn: 'TEST123456',
  86. printerKey: 'test_key'
  87. };
  88. // Mock validatePrinterConfig to return false
  89. const mockFeieApiService = {
  90. validatePrinterConfig: vi.fn().mockResolvedValue(false)
  91. };
  92. (printerService as any).feieApiService = mockFeieApiService;
  93. await expect(printerService.addPrinter(tenantId, printerDto))
  94. .rejects
  95. .toThrow('打印机配置验证失败,请检查序列号和密钥');
  96. });
  97. it('应该在设置为默认打印机时清除其他默认打印机', async () => {
  98. const tenantId = 1;
  99. const printerDto: PrinterDto = {
  100. printerSn: 'TEST123456',
  101. printerKey: 'test_key',
  102. isDefault: true
  103. };
  104. const mockPrinter: Partial<FeiePrinterMt> = {
  105. id: 1,
  106. tenantId,
  107. ...printerDto,
  108. printerStatus: 'ACTIVE',
  109. isDefault: 1
  110. };
  111. // Mock the create method
  112. (printerService as any).create = vi.fn().mockResolvedValue(mockPrinter);
  113. // Mock clearDefaultPrinter
  114. (printerService as any).clearDefaultPrinter = vi.fn().mockResolvedValue(undefined);
  115. await printerService.addPrinter(tenantId, printerDto);
  116. expect((printerService as any).clearDefaultPrinter).toHaveBeenCalledWith(tenantId);
  117. });
  118. });
  119. describe('updatePrinter', () => {
  120. it('应该成功更新打印机', async () => {
  121. const tenantId = 1;
  122. const printerSn = 'TEST123456';
  123. const updateDto = {
  124. printerName: '更新后的打印机名称',
  125. isDefault: true
  126. };
  127. const existingPrinter: Partial<FeiePrinterMt> = {
  128. id: 1,
  129. tenantId,
  130. printerSn,
  131. printerName: '原打印机名称',
  132. isDefault: 0
  133. };
  134. const updatedPrinter: Partial<FeiePrinterMt> = {
  135. ...existingPrinter,
  136. printerName: updateDto.printerName,
  137. isDefault: 1
  138. };
  139. // Mock findOne and update methods
  140. (printerService as any).findOne = vi.fn().mockResolvedValue(existingPrinter);
  141. (printerService as any).update = vi.fn().mockResolvedValue(updatedPrinter);
  142. (printerService as any).clearDefaultPrinter = vi.fn().mockResolvedValue(undefined);
  143. const result = await printerService.updatePrinter(tenantId, printerSn, updateDto);
  144. expect(result).toEqual(updatedPrinter);
  145. expect((printerService as any).clearDefaultPrinter).toHaveBeenCalledWith(tenantId);
  146. });
  147. it('应该在打印机不存在时抛出错误', async () => {
  148. const tenantId = 1;
  149. const printerSn = 'NONEXISTENT';
  150. const updateDto = { printerName: '新名称' };
  151. // Mock findOne to return null
  152. (printerService as any).findOne = vi.fn().mockResolvedValue(null);
  153. await expect(printerService.updatePrinter(tenantId, printerSn, updateDto))
  154. .rejects
  155. .toThrow('打印机不存在');
  156. });
  157. });
  158. describe('deletePrinter', () => {
  159. it('应该成功删除打印机', async () => {
  160. const tenantId = 1;
  161. const printerSn = 'TEST123456';
  162. const existingPrinter: Partial<FeiePrinterMt> = {
  163. id: 1,
  164. tenantId,
  165. printerSn
  166. };
  167. // Mock findOne and delete methods
  168. (printerService as any).findOne = vi.fn().mockResolvedValue(existingPrinter);
  169. (printerService as any).delete = vi.fn().mockResolvedValue(undefined);
  170. await printerService.deletePrinter(tenantId, printerSn);
  171. expect((printerService as any).delete).toHaveBeenCalledWith(existingPrinter.id);
  172. });
  173. it('应该在打印机不存在时抛出错误', async () => {
  174. const tenantId = 1;
  175. const printerSn = 'NONEXISTENT';
  176. // Mock findOne to return null
  177. (printerService as any).findOne = vi.fn().mockResolvedValue(null);
  178. await expect(printerService.deletePrinter(tenantId, printerSn))
  179. .rejects
  180. .toThrow('打印机不存在');
  181. });
  182. });
  183. describe('getPrinters', () => {
  184. it('应该返回打印机列表', async () => {
  185. const tenantId = 1;
  186. const mockPrinters: Partial<FeiePrinterMt>[] = [
  187. { id: 1, tenantId, printerSn: 'PRINTER1', isDefault: 1 },
  188. { id: 2, tenantId, printerSn: 'PRINTER2', isDefault: 0 }
  189. ];
  190. // Mock findMany method
  191. (printerService as any).findMany = vi.fn().mockResolvedValue(mockPrinters);
  192. const result = await printerService.getPrinters(tenantId);
  193. expect(result).toEqual(mockPrinters);
  194. expect((printerService as any).findMany).toHaveBeenCalledWith({
  195. where: { tenantId },
  196. order: { isDefault: 'DESC', createdAt: 'DESC' }
  197. });
  198. });
  199. });
  200. describe('getDefaultPrinter', () => {
  201. it('应该返回默认打印机', async () => {
  202. const tenantId = 1;
  203. const mockPrinter: Partial<FeiePrinterMt> = {
  204. id: 1,
  205. tenantId,
  206. printerSn: 'PRINTER1',
  207. isDefault: 1
  208. };
  209. // Mock findOne method
  210. (printerService as any).findOne = vi.fn().mockResolvedValue(mockPrinter);
  211. const result = await printerService.getDefaultPrinter(tenantId);
  212. expect(result).toEqual(mockPrinter);
  213. expect((printerService as any).findOne).toHaveBeenCalledWith({
  214. where: { tenantId, isDefault: 1 }
  215. });
  216. });
  217. it('应该在无默认打印机时返回null', async () => {
  218. const tenantId = 1;
  219. // Mock findOne to return null
  220. (printerService as any).findOne = vi.fn().mockResolvedValue(null);
  221. const result = await printerService.getDefaultPrinter(tenantId);
  222. expect(result).toBeNull();
  223. });
  224. });
  225. });