printer.service.test.ts 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  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. });
  44. describe('addPrinter', () => {
  45. it('应该成功添加打印机', async () => {
  46. const tenantId = 1;
  47. const printerDto: PrinterDto = {
  48. printerSn: 'TEST123456',
  49. printerKey: 'test_key',
  50. printerName: '测试打印机',
  51. printerType: '58mm',
  52. isDefault: false
  53. };
  54. const mockPrinter: Partial<FeiePrinterMt> = {
  55. id: 1,
  56. tenantId,
  57. ...printerDto,
  58. printerStatus: 'ACTIVE',
  59. isDefault: 0
  60. };
  61. // Mock the create method
  62. (printerService as any).create = vi.fn().mockResolvedValue(mockPrinter);
  63. const result = await printerService.addPrinter(tenantId, printerDto);
  64. expect(result).toEqual(mockPrinter);
  65. expect((printerService as any).create).toHaveBeenCalledWith({
  66. tenantId,
  67. printerSn: printerDto.printerSn,
  68. printerKey: printerDto.printerKey,
  69. printerName: printerDto.printerName,
  70. printerType: printerDto.printerType,
  71. printerStatus: 'ACTIVE',
  72. isDefault: 0
  73. });
  74. });
  75. it('应该在打印机配置验证失败时抛出错误', async () => {
  76. const tenantId = 1;
  77. const printerDto: PrinterDto = {
  78. printerSn: 'TEST123456',
  79. printerKey: 'test_key'
  80. };
  81. // Mock validatePrinterConfig to return false
  82. const mockFeieApiService = {
  83. validatePrinterConfig: vi.fn().mockResolvedValue(false)
  84. };
  85. (printerService as any).feieApiService = mockFeieApiService;
  86. await expect(printerService.addPrinter(tenantId, printerDto))
  87. .rejects
  88. .toThrow('打印机配置验证失败,请检查序列号和密钥');
  89. });
  90. it('应该在设置为默认打印机时清除其他默认打印机', async () => {
  91. const tenantId = 1;
  92. const printerDto: PrinterDto = {
  93. printerSn: 'TEST123456',
  94. printerKey: 'test_key',
  95. isDefault: true
  96. };
  97. const mockPrinter: Partial<FeiePrinterMt> = {
  98. id: 1,
  99. tenantId,
  100. ...printerDto,
  101. printerStatus: 'ACTIVE',
  102. isDefault: 1
  103. };
  104. // Mock the create method
  105. (printerService as any).create = vi.fn().mockResolvedValue(mockPrinter);
  106. // Mock clearDefaultPrinter
  107. (printerService as any).clearDefaultPrinter = vi.fn().mockResolvedValue(undefined);
  108. await printerService.addPrinter(tenantId, printerDto);
  109. expect((printerService as any).clearDefaultPrinter).toHaveBeenCalledWith(tenantId);
  110. });
  111. });
  112. describe('updatePrinter', () => {
  113. it('应该成功更新打印机', async () => {
  114. const tenantId = 1;
  115. const printerSn = 'TEST123456';
  116. const updateDto = {
  117. printerName: '更新后的打印机名称',
  118. isDefault: true
  119. };
  120. const existingPrinter: Partial<FeiePrinterMt> = {
  121. id: 1,
  122. tenantId,
  123. printerSn,
  124. printerName: '原打印机名称',
  125. isDefault: 0
  126. };
  127. const updatedPrinter: Partial<FeiePrinterMt> = {
  128. ...existingPrinter,
  129. printerName: updateDto.printerName,
  130. isDefault: 1
  131. };
  132. // Mock findOne and update methods
  133. (printerService as any).findOne = vi.fn().mockResolvedValue(existingPrinter);
  134. (printerService as any).update = vi.fn().mockResolvedValue(updatedPrinter);
  135. (printerService as any).clearDefaultPrinter = vi.fn().mockResolvedValue(undefined);
  136. const result = await printerService.updatePrinter(tenantId, printerSn, updateDto);
  137. expect(result).toEqual(updatedPrinter);
  138. expect((printerService as any).clearDefaultPrinter).toHaveBeenCalledWith(tenantId);
  139. });
  140. it('应该在打印机不存在时抛出错误', async () => {
  141. const tenantId = 1;
  142. const printerSn = 'NONEXISTENT';
  143. const updateDto = { printerName: '新名称' };
  144. // Mock findOne to return null
  145. (printerService as any).findOne = vi.fn().mockResolvedValue(null);
  146. await expect(printerService.updatePrinter(tenantId, printerSn, updateDto))
  147. .rejects
  148. .toThrow('打印机不存在');
  149. });
  150. });
  151. describe('deletePrinter', () => {
  152. it('应该成功删除打印机', async () => {
  153. const tenantId = 1;
  154. const printerSn = 'TEST123456';
  155. const existingPrinter: Partial<FeiePrinterMt> = {
  156. id: 1,
  157. tenantId,
  158. printerSn
  159. };
  160. // Mock findOne and delete methods
  161. (printerService as any).findOne = vi.fn().mockResolvedValue(existingPrinter);
  162. (printerService as any).delete = vi.fn().mockResolvedValue(undefined);
  163. await printerService.deletePrinter(tenantId, printerSn);
  164. expect((printerService as any).delete).toHaveBeenCalledWith(existingPrinter.id);
  165. });
  166. it('应该在打印机不存在时抛出错误', async () => {
  167. const tenantId = 1;
  168. const printerSn = 'NONEXISTENT';
  169. // Mock findOne to return null
  170. (printerService as any).findOne = vi.fn().mockResolvedValue(null);
  171. await expect(printerService.deletePrinter(tenantId, printerSn))
  172. .rejects
  173. .toThrow('打印机不存在');
  174. });
  175. });
  176. describe('getPrinters', () => {
  177. it('应该返回打印机列表', async () => {
  178. const tenantId = 1;
  179. const mockPrinters: Partial<FeiePrinterMt>[] = [
  180. { id: 1, tenantId, printerSn: 'PRINTER1', isDefault: 1 },
  181. { id: 2, tenantId, printerSn: 'PRINTER2', isDefault: 0 }
  182. ];
  183. // Mock findMany method
  184. (printerService as any).findMany = vi.fn().mockResolvedValue(mockPrinters);
  185. const result = await printerService.getPrinters(tenantId);
  186. expect(result).toEqual(mockPrinters);
  187. expect((printerService as any).findMany).toHaveBeenCalledWith({
  188. where: { tenantId },
  189. order: { isDefault: 'DESC', createdAt: 'DESC' }
  190. });
  191. });
  192. });
  193. describe('getDefaultPrinter', () => {
  194. it('应该返回默认打印机', async () => {
  195. const tenantId = 1;
  196. const mockPrinter: Partial<FeiePrinterMt> = {
  197. id: 1,
  198. tenantId,
  199. printerSn: 'PRINTER1',
  200. isDefault: 1
  201. };
  202. // Mock findOne method
  203. (printerService as any).findOne = vi.fn().mockResolvedValue(mockPrinter);
  204. const result = await printerService.getDefaultPrinter(tenantId);
  205. expect(result).toEqual(mockPrinter);
  206. expect((printerService as any).findOne).toHaveBeenCalledWith({
  207. where: { tenantId, isDefault: 1 }
  208. });
  209. });
  210. it('应该在无默认打印机时返回null', async () => {
  211. const tenantId = 1;
  212. // Mock findOne to return null
  213. (printerService as any).findOne = vi.fn().mockResolvedValue(null);
  214. const result = await printerService.getDefaultPrinter(tenantId);
  215. expect(result).toBeNull();
  216. });
  217. });
  218. });