order.integration.test.ts 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991
  1. import { describe, it, expect, beforeEach } from 'vitest';
  2. import { testClient } from 'hono/testing';
  3. import { IntegrationTestDatabase, setupIntegrationDatabaseHooksWithEntities } from '@d8d/shared-test-util';
  4. import { JWTUtil } from '@d8d/shared-utils';
  5. import { UserEntity, Role } from '@d8d/user-module';
  6. import { File } from '@d8d/file-module';
  7. import orderRoutes from '../../src/routes/order.routes';
  8. import { EmploymentOrder } from '../../src/entities/employment-order.entity';
  9. import { OrderPerson } from '../../src/entities/order-person.entity';
  10. import { OrderPersonAsset } from '../../src/entities/order-person-asset.entity';
  11. import { AssetType, AssetFileType } from '../../src/schemas/order.schema';
  12. import { OrderStatus, WorkStatus } from '@d8d/allin-enums';
  13. import { OrderTestDataFactory } from '../utils/test-data-factory';
  14. // 设置集成测试钩子
  15. setupIntegrationDatabaseHooksWithEntities([UserEntity, File, Role, EmploymentOrder, OrderPerson, OrderPersonAsset])
  16. describe('订单管理API集成测试', () => {
  17. let client: ReturnType<typeof testClient<typeof orderRoutes>>;
  18. let testToken: string;
  19. let testUser: UserEntity;
  20. let testFile: File;
  21. beforeEach(async () => {
  22. // 创建测试客户端
  23. client = testClient(orderRoutes);
  24. // 获取数据源
  25. const dataSource = await IntegrationTestDatabase.getDataSource();
  26. // 创建测试用户
  27. const userRepository = dataSource.getRepository(UserEntity);
  28. testUser = userRepository.create({
  29. username: `test_user_${Date.now()}`,
  30. password: 'test_password',
  31. nickname: '测试用户',
  32. registrationSource: 'web'
  33. });
  34. await userRepository.save(testUser);
  35. // 生成测试用户的token
  36. testToken = JWTUtil.generateToken({
  37. id: testUser.id,
  38. username: testUser.username,
  39. roles: [{name:'user'}]
  40. });
  41. // 创建测试文件
  42. const fileRepository = dataSource.getRepository(File);
  43. testFile = fileRepository.create({
  44. name: 'test_file.pdf',
  45. type: 'application/pdf',
  46. size: 1024,
  47. path: `test/${Date.now()}_test_file.pdf`,
  48. uploadUserId: testUser.id,
  49. uploadTime: new Date(),
  50. createdAt: new Date(),
  51. updatedAt: new Date()
  52. });
  53. await fileRepository.save(testFile);
  54. });
  55. describe('POST /order/create', () => {
  56. it('应该成功创建订单', async () => {
  57. const createData = {
  58. orderName: '测试订单',
  59. platformId: 1,
  60. companyId: 1,
  61. channelId: 1,
  62. expectedStartDate: new Date().toISOString(),
  63. orderStatus: OrderStatus.DRAFT,
  64. workStatus: WorkStatus.NOT_WORKING
  65. };
  66. const response = await client.create.$post({
  67. json: createData
  68. }, {
  69. headers: {
  70. 'Authorization': `Bearer ${testToken}`
  71. }
  72. });
  73. if (response.status !== 200) {
  74. const error = await response.json();
  75. console.debug('创建订单失败:', JSON.stringify(error, null, 2));
  76. }
  77. expect(response.status).toBe(200);
  78. if (response.status === 200) {
  79. const data = await response.json();
  80. expect(data.id).toBeDefined();
  81. expect(data.orderName).toBe('测试订单');
  82. expect(data.orderStatus).toBe(OrderStatus.DRAFT);
  83. expect(data.workStatus).toBe(WorkStatus.NOT_WORKING);
  84. }
  85. });
  86. it('应该验证订单状态枚举值', async () => {
  87. const createData = {
  88. orderName: '测试订单',
  89. platformId: 1,
  90. companyId: 1,
  91. channelId: 1,
  92. expectedStartDate: new Date().toISOString(),
  93. orderStatus: 'invalid_status', // 无效的状态
  94. workStatus: WorkStatus.NOT_WORKING
  95. };
  96. const response = await client.create.$post({
  97. json: createData as any // 使用any绕过类型检查,因为这里故意测试无效的枚举值
  98. }, {
  99. headers: {
  100. 'Authorization': `Bearer ${testToken}`
  101. }
  102. });
  103. expect(response.status).toBe(400);
  104. });
  105. it('应该验证工作状态枚举值', async () => {
  106. const createData = {
  107. orderName: '测试订单',
  108. platformId: 1,
  109. companyId: 1,
  110. channelId: 1,
  111. expectedStartDate: new Date().toISOString(),
  112. orderStatus: OrderStatus.DRAFT,
  113. workStatus: 'invalid_status' // 无效的状态
  114. };
  115. const response = await client.create.$post({
  116. json: createData as any // 使用any绕过类型检查,因为这里故意测试无效的枚举值
  117. }, {
  118. headers: {
  119. 'Authorization': `Bearer ${testToken}`
  120. }
  121. });
  122. expect(response.status).toBe(400);
  123. });
  124. });
  125. describe('GET /order/list', () => {
  126. let testOrder: EmploymentOrder;
  127. beforeEach(async () => {
  128. // 创建测试订单数据
  129. const dataSource = await IntegrationTestDatabase.getDataSource();
  130. const orderRepository = dataSource.getRepository(EmploymentOrder);
  131. testOrder = new EmploymentOrder({
  132. orderName: '测试订单1',
  133. platformId: 1,
  134. companyId: 1,
  135. channelId: 1,
  136. expectedStartDate: new Date(),
  137. orderStatus: OrderStatus.DRAFT,
  138. workStatus: WorkStatus.NOT_WORKING
  139. });
  140. await orderRepository.save(testOrder);
  141. const testOrder2 = new EmploymentOrder({
  142. orderName: '测试订单2',
  143. platformId: 2,
  144. companyId: 2,
  145. channelId: 2,
  146. expectedStartDate: new Date(),
  147. orderStatus: OrderStatus.CONFIRMED,
  148. workStatus: WorkStatus.PRE_WORKING
  149. });
  150. await orderRepository.save(testOrder2);
  151. });
  152. it('应该返回所有订单列表', async () => {
  153. const response = await client.list.$get({
  154. query: {}
  155. }, {
  156. headers: {
  157. 'Authorization': `Bearer ${testToken}`
  158. }
  159. });
  160. expect(response.status).toBe(200);
  161. if (response.status === 200) {
  162. const data = await response.json();
  163. expect(data).toHaveProperty('data');
  164. expect(data).toHaveProperty('total');
  165. expect(data.data).toHaveLength(2);
  166. expect(data.total).toBe(2);
  167. }
  168. });
  169. it('应该支持按订单名称搜索', async () => {
  170. const response = await client.list.$get({
  171. query: {
  172. orderName: '测试订单1'
  173. }
  174. }, {
  175. headers: {
  176. 'Authorization': `Bearer ${testToken}`
  177. }
  178. });
  179. expect(response.status).toBe(200);
  180. if (response.status === 200) {
  181. const data = await response.json();
  182. expect(data.data).toHaveLength(1);
  183. expect(data.data[0].orderName).toBe('测试订单1');
  184. }
  185. });
  186. it('应该支持按订单状态过滤', async () => {
  187. const response = await client.list.$get({
  188. query: {
  189. orderStatus: OrderStatus.CONFIRMED
  190. }
  191. }, {
  192. headers: {
  193. 'Authorization': `Bearer ${testToken}`
  194. }
  195. });
  196. expect(response.status).toBe(200);
  197. if (response.status === 200) {
  198. const data = await response.json();
  199. expect(data.data).toHaveLength(1);
  200. expect(data.data[0].orderStatus).toBe(OrderStatus.CONFIRMED);
  201. }
  202. });
  203. it('应该支持分页查询', async () => {
  204. const response = await client.list.$get({
  205. query: {
  206. page: '1',
  207. limit: '1'
  208. }
  209. }, {
  210. headers: {
  211. 'Authorization': `Bearer ${testToken}`
  212. }
  213. });
  214. expect(response.status).toBe(200);
  215. if (response.status === 200) {
  216. const data = await response.json();
  217. expect(data.data).toHaveLength(1);
  218. expect(data.total).toBe(2);
  219. }
  220. });
  221. });
  222. describe('GET /order/detail/:id', () => {
  223. let testOrder: EmploymentOrder;
  224. beforeEach(async () => {
  225. // 创建测试订单数据
  226. const dataSource = await IntegrationTestDatabase.getDataSource();
  227. const orderRepository = dataSource.getRepository(EmploymentOrder);
  228. testOrder = new EmploymentOrder({
  229. orderName: '测试订单详情',
  230. platformId: 1,
  231. companyId: 1,
  232. channelId: 1,
  233. expectedStartDate: new Date(),
  234. orderStatus: OrderStatus.DRAFT,
  235. workStatus: WorkStatus.NOT_WORKING
  236. });
  237. await orderRepository.save(testOrder);
  238. });
  239. it('应该返回指定ID的订单详情', async () => {
  240. const response = await client.detail[':id'].$get({
  241. param: { id: testOrder.id.toString() }
  242. }, {
  243. headers: {
  244. 'Authorization': `Bearer ${testToken}`
  245. }
  246. });
  247. if (response.status !== 200) {
  248. const error = await response.json();
  249. console.debug('获取订单详情失败:', JSON.stringify(error, null, 2));
  250. }
  251. expect(response.status).toBe(200);
  252. if (response.status === 200) {
  253. const data = await response.json();
  254. expect(data?.id).toBe(testOrder.id);
  255. expect(data?.orderName).toBe('测试订单详情');
  256. expect(data?.orderStatus).toBe(OrderStatus.DRAFT);
  257. }
  258. });
  259. it('应该处理不存在的订单ID', async () => {
  260. const response = await client.detail[':id'].$get({
  261. param: { id: '999999' }
  262. }, {
  263. headers: {
  264. 'Authorization': `Bearer ${testToken}`
  265. }
  266. });
  267. expect(response.status).toBe(404);
  268. });
  269. });
  270. describe('POST /order/activate/:orderId', () => {
  271. let testOrder: EmploymentOrder;
  272. beforeEach(async () => {
  273. // 创建测试订单数据
  274. const dataSource = await IntegrationTestDatabase.getDataSource();
  275. const orderRepository = dataSource.getRepository(EmploymentOrder);
  276. testOrder = new EmploymentOrder({
  277. orderName: '待激活订单',
  278. platformId: 1,
  279. companyId: 1,
  280. channelId: 1,
  281. expectedStartDate: new Date(),
  282. orderStatus: OrderStatus.DRAFT,
  283. workStatus: WorkStatus.NOT_WORKING
  284. });
  285. await orderRepository.save(testOrder);
  286. });
  287. it('应该成功激活草稿状态的订单', async () => {
  288. const response = await client.activate[':orderId'].$post({
  289. param: { orderId: testOrder.id.toString() }
  290. }, {
  291. headers: {
  292. 'Authorization': `Bearer ${testToken}`
  293. }
  294. });
  295. expect(response.status).toBe(200);
  296. if (response.status === 200) {
  297. const data = await response.json();
  298. expect(data.success).toBe(true);
  299. // 验证订单状态已更新
  300. const dataSource = await IntegrationTestDatabase.getDataSource();
  301. const orderRepository = dataSource.getRepository(EmploymentOrder);
  302. const updatedOrder = await orderRepository.findOne({
  303. where: { id: testOrder.id }
  304. });
  305. expect(updatedOrder?.orderStatus).toBe(OrderStatus.CONFIRMED);
  306. expect(updatedOrder?.actualStartDate).toBeDefined();
  307. }
  308. });
  309. it('应该处理非草稿状态的订单激活', async () => {
  310. // 更新订单状态为已确认
  311. const dataSource = await IntegrationTestDatabase.getDataSource();
  312. const orderRepository = dataSource.getRepository(EmploymentOrder);
  313. await orderRepository.update(testOrder.id, { orderStatus: OrderStatus.CONFIRMED });
  314. const response = await client.activate[':orderId'].$post({
  315. param: { orderId: testOrder.id.toString() }
  316. }, {
  317. headers: {
  318. 'Authorization': `Bearer ${testToken}`
  319. }
  320. });
  321. expect(response.status).toBe(400);
  322. });
  323. it('应该处理不存在的订单ID', async () => {
  324. const response = await client.activate[':orderId'].$post({
  325. param: { orderId: '999999' }
  326. }, {
  327. headers: {
  328. 'Authorization': `Bearer ${testToken}`
  329. }
  330. });
  331. expect(response.status).toBe(404);
  332. });
  333. });
  334. describe('POST /order/close/:orderId', () => {
  335. let testOrder: EmploymentOrder;
  336. beforeEach(async () => {
  337. // 创建测试订单数据
  338. const dataSource = await IntegrationTestDatabase.getDataSource();
  339. const orderRepository = dataSource.getRepository(EmploymentOrder);
  340. testOrder = new EmploymentOrder({
  341. orderName: '待关闭订单',
  342. platformId: 1,
  343. companyId: 1,
  344. channelId: 1,
  345. expectedStartDate: new Date(),
  346. actualStartDate: new Date(),
  347. orderStatus: OrderStatus.CONFIRMED,
  348. workStatus: WorkStatus.PRE_WORKING,
  349. });
  350. await orderRepository.save(testOrder);
  351. });
  352. it('应该成功关闭已确认状态的订单', async () => {
  353. const response = await client.close[':orderId'].$post({
  354. param: { orderId: testOrder.id.toString() }
  355. }, {
  356. headers: {
  357. 'Authorization': `Bearer ${testToken}`
  358. }
  359. });
  360. expect(response.status).toBe(200);
  361. if (response.status === 200) {
  362. const data = await response.json();
  363. expect(data.success).toBe(true);
  364. // 验证订单状态已更新
  365. const dataSource = await IntegrationTestDatabase.getDataSource();
  366. const orderRepository = dataSource.getRepository(EmploymentOrder);
  367. const updatedOrder = await orderRepository.findOne({
  368. where: { id: testOrder.id }
  369. });
  370. expect(updatedOrder?.orderStatus).toBe(OrderStatus.COMPLETED);
  371. expect(updatedOrder?.actualEndDate).toBeDefined();
  372. }
  373. });
  374. it('应该处理非已确认或进行中状态的订单关闭', async () => {
  375. // 更新订单状态为草稿
  376. const dataSource = await IntegrationTestDatabase.getDataSource();
  377. const orderRepository = dataSource.getRepository(EmploymentOrder);
  378. await orderRepository.update(testOrder.id, { orderStatus: OrderStatus.DRAFT });
  379. const response = await client.close[':orderId'].$post({
  380. param: { orderId: testOrder.id.toString() }
  381. }, {
  382. headers: {
  383. 'Authorization': `Bearer ${testToken}`
  384. }
  385. });
  386. expect(response.status).toBe(400);
  387. });
  388. it('应该处理不存在的订单ID', async () => {
  389. const response = await client.close[':orderId'].$post({
  390. param: { orderId: '999999' }
  391. }, {
  392. headers: {
  393. 'Authorization': `Bearer ${testToken}`
  394. }
  395. });
  396. expect(response.status).toBe(404);
  397. });
  398. });
  399. describe('POST /order/:orderId/persons/batch', () => {
  400. let testOrder: EmploymentOrder;
  401. beforeEach(async () => {
  402. // 创建测试订单数据
  403. const dataSource = await IntegrationTestDatabase.getDataSource();
  404. const orderRepository = dataSource.getRepository(EmploymentOrder);
  405. testOrder = new EmploymentOrder({
  406. orderName: '批量添加人员测试订单',
  407. platformId: 1,
  408. companyId: 1,
  409. channelId: 1,
  410. expectedStartDate: new Date(),
  411. orderStatus: OrderStatus.DRAFT,
  412. workStatus: WorkStatus.NOT_WORKING,
  413. });
  414. await orderRepository.save(testOrder);
  415. });
  416. it('应该成功批量添加人员到订单', async () => {
  417. const batchData = {
  418. persons: [
  419. {
  420. personId: 1001,
  421. joinDate: new Date().toISOString(),
  422. salaryDetail: 5000.00
  423. },
  424. {
  425. personId: 1002,
  426. joinDate: new Date().toISOString(),
  427. salaryDetail: 6000.00
  428. }
  429. ]
  430. };
  431. const response = await client[':orderId'].persons.batch.$post({
  432. param: { orderId: testOrder.id.toString() },
  433. json: batchData
  434. }, {
  435. headers: {
  436. 'Authorization': `Bearer ${testToken}`
  437. }
  438. });
  439. expect(response.status).toBe(200);
  440. if (response.status === 200) {
  441. const data = await response.json();
  442. expect(data.success).toBe(true);
  443. expect(data.addedCount).toBe(2);
  444. // 验证人员已添加到订单
  445. const dataSource = await IntegrationTestDatabase.getDataSource();
  446. const orderPersonRepository = dataSource.getRepository(OrderPerson);
  447. const orderPersons = await orderPersonRepository.find({
  448. where: { orderId: testOrder.id }
  449. });
  450. expect(orderPersons).toHaveLength(2);
  451. }
  452. });
  453. it('应该处理重复的人员添加', async () => {
  454. // 先添加一个人员
  455. const dataSource = await IntegrationTestDatabase.getDataSource();
  456. const orderPersonRepository = dataSource.getRepository(OrderPerson);
  457. const existingPerson = orderPersonRepository.create({
  458. orderId: testOrder.id,
  459. personId: 1001,
  460. joinDate: new Date(),
  461. workStatus: WorkStatus.NOT_WORKING,
  462. salaryDetail: 5000.00
  463. });
  464. await orderPersonRepository.save(existingPerson);
  465. const batchData = {
  466. persons: [
  467. {
  468. personId: 1001, // 已存在的人员
  469. joinDate: new Date().toISOString(),
  470. salaryDetail: 5000.00
  471. },
  472. {
  473. personId: 1002, // 新人员
  474. joinDate: new Date().toISOString(),
  475. salaryDetail: 6000.00
  476. }
  477. ]
  478. };
  479. const response = await client[':orderId'].persons.batch.$post({
  480. param: { orderId: testOrder.id.toString() },
  481. json: batchData
  482. }, {
  483. headers: {
  484. 'Authorization': `Bearer ${testToken}`
  485. }
  486. });
  487. expect(response.status).toBe(200);
  488. if (response.status === 200) {
  489. const data = await response.json();
  490. expect(data.success).toBe(true);
  491. expect(data.addedCount).toBe(1); // 只添加了一个新人员
  492. }
  493. });
  494. it('应该处理已结束或已取消的订单', async () => {
  495. // 更新订单状态为已完成
  496. const dataSource = await IntegrationTestDatabase.getDataSource();
  497. const orderRepository = dataSource.getRepository(EmploymentOrder);
  498. await orderRepository.update(testOrder.id, { orderStatus: OrderStatus.COMPLETED });
  499. const batchData = {
  500. persons: [
  501. {
  502. personId: 1001,
  503. joinDate: new Date().toISOString(),
  504. salaryDetail: 5000.00
  505. }
  506. ]
  507. };
  508. const response = await client[':orderId'].persons.batch.$post({
  509. param: { orderId: testOrder.id.toString() },
  510. json: batchData
  511. }, {
  512. headers: {
  513. 'Authorization': `Bearer ${testToken}`
  514. }
  515. });
  516. expect(response.status).toBe(400);
  517. });
  518. it('应该处理不存在的订单ID', async () => {
  519. const batchData = {
  520. persons: [
  521. {
  522. personId: 1001,
  523. joinDate: new Date().toISOString(),
  524. salaryDetail: 5000.00
  525. }
  526. ]
  527. };
  528. const response = await client[':orderId'].persons.batch.$post({
  529. param: { orderId: '999999' },
  530. json: batchData
  531. }, {
  532. headers: {
  533. 'Authorization': `Bearer ${testToken}`
  534. }
  535. });
  536. expect(response.status).toBe(404);
  537. });
  538. });
  539. describe('POST /order/assets/create', () => {
  540. let testOrder: EmploymentOrder;
  541. let testOrderPerson: OrderPerson;
  542. beforeEach(async () => {
  543. // 创建测试订单数据
  544. const dataSource = await IntegrationTestDatabase.getDataSource();
  545. const orderRepository = dataSource.getRepository(EmploymentOrder);
  546. const orderPersonRepository = dataSource.getRepository(OrderPerson);
  547. testOrder = new EmploymentOrder({
  548. orderName: '资产测试订单',
  549. platformId: 1,
  550. companyId: 1,
  551. channelId: 1,
  552. expectedStartDate: new Date(),
  553. orderStatus: OrderStatus.DRAFT,
  554. workStatus: WorkStatus.NOT_WORKING,
  555. });
  556. await orderRepository.save(testOrder);
  557. testOrderPerson = orderPersonRepository.create({
  558. orderId: testOrder.id,
  559. personId: 1001,
  560. joinDate: new Date(),
  561. workStatus: WorkStatus.NOT_WORKING,
  562. salaryDetail: 5000.00
  563. });
  564. await orderPersonRepository.save(testOrderPerson);
  565. });
  566. it('应该成功创建订单人员资产', async () => {
  567. const assetData = {
  568. orderId: testOrder.id,
  569. personId: testOrderPerson.personId,
  570. assetType: AssetType.DISABILITY_CERT,
  571. assetFileType: AssetFileType.IMAGE,
  572. fileId: testFile.id,
  573. relatedTime: new Date().toISOString()
  574. };
  575. const response = await client.assets.create.$post({
  576. json: assetData
  577. }, {
  578. headers: {
  579. 'Authorization': `Bearer ${testToken}`
  580. }
  581. });
  582. if (response.status !== 200) {
  583. const error = await response.json();
  584. console.debug('创建订单人员资产失败:', JSON.stringify(error, null, 2));
  585. }
  586. expect(response.status).toBe(200);
  587. if (response.status === 200) {
  588. const data = await response.json();
  589. expect(data.id).toBeDefined();
  590. expect(data.orderId).toBe(testOrder.id);
  591. expect(data.personId).toBe(testOrderPerson.personId);
  592. expect(data.assetType).toBe(AssetType.DISABILITY_CERT);
  593. expect(data.fileId).toBe(testFile.id);
  594. }
  595. });
  596. it('应该处理不存在的文件ID', async () => {
  597. const assetData = {
  598. orderId: testOrder.id,
  599. personId: testOrderPerson.personId,
  600. assetType: AssetType.DISABILITY_CERT,
  601. assetFileType: AssetFileType.IMAGE,
  602. fileId: 999999, // 不存在的文件ID
  603. relatedTime: new Date().toISOString()
  604. };
  605. const response = await client.assets.create.$post({
  606. json: assetData
  607. }, {
  608. headers: {
  609. 'Authorization': `Bearer ${testToken}`
  610. }
  611. });
  612. expect(response.status).toBe(400);
  613. });
  614. it('应该处理人员不在订单中的情况', async () => {
  615. const assetData = {
  616. orderId: testOrder.id,
  617. personId: 999999, // 不在订单中的人员
  618. assetType: AssetType.DISABILITY_CERT,
  619. assetFileType: AssetFileType.IMAGE,
  620. fileId: testFile.id,
  621. relatedTime: new Date().toISOString()
  622. };
  623. const response = await client.assets.create.$post({
  624. json: assetData
  625. }, {
  626. headers: {
  627. 'Authorization': `Bearer ${testToken}`
  628. }
  629. });
  630. expect(response.status).toBe(404);
  631. });
  632. });
  633. describe('GET /order/assets/query', () => {
  634. let testOrder: EmploymentOrder;
  635. let testOrderPerson: OrderPerson;
  636. let testAsset: OrderPersonAsset;
  637. beforeEach(async () => {
  638. // 创建测试数据
  639. const dataSource = await IntegrationTestDatabase.getDataSource();
  640. const orderRepository = dataSource.getRepository(EmploymentOrder);
  641. const orderPersonRepository = dataSource.getRepository(OrderPerson);
  642. const assetRepository = dataSource.getRepository(OrderPersonAsset);
  643. testOrder = new EmploymentOrder({
  644. orderName: '资产查询测试订单',
  645. platformId: 1,
  646. companyId: 1,
  647. channelId: 1,
  648. expectedStartDate: new Date(),
  649. orderStatus: OrderStatus.DRAFT,
  650. workStatus: WorkStatus.NOT_WORKING,
  651. });
  652. await orderRepository.save(testOrder);
  653. testOrderPerson = orderPersonRepository.create({
  654. orderId: testOrder.id,
  655. personId: 1001,
  656. joinDate: new Date(),
  657. workStatus: WorkStatus.NOT_WORKING,
  658. salaryDetail: 5000.00
  659. });
  660. await orderPersonRepository.save(testOrderPerson);
  661. testAsset = new OrderPersonAsset({
  662. orderId: testOrder.id,
  663. personId: testOrderPerson.personId,
  664. assetType: AssetType.DISABILITY_CERT,
  665. assetFileType: AssetFileType.IMAGE,
  666. fileId: testFile.id,
  667. relatedTime: new Date()
  668. });
  669. await assetRepository.save(testAsset);
  670. // 创建第二个资产
  671. const testAsset2 = new OrderPersonAsset({
  672. orderId: testOrder.id,
  673. personId: testOrderPerson.personId,
  674. assetType: AssetType.OTHER,
  675. assetFileType: AssetFileType.IMAGE,
  676. fileId: testFile.id,
  677. relatedTime: new Date()
  678. });
  679. await assetRepository.save(testAsset2);
  680. });
  681. it('应该查询所有订单人员资产', async () => {
  682. const response = await client.assets.query.$get({
  683. query: {}
  684. }, {
  685. headers: {
  686. 'Authorization': `Bearer ${testToken}`
  687. }
  688. });
  689. expect(response.status).toBe(200);
  690. if (response.status === 200) {
  691. const data = await response.json();
  692. expect(data).toHaveProperty('data');
  693. expect(data).toHaveProperty('total');
  694. expect(data.data).toHaveLength(2);
  695. expect(data.total).toBe(2);
  696. }
  697. });
  698. it('应该支持按订单ID查询', async () => {
  699. const response = await client.assets.query.$get({
  700. query: {
  701. orderId: testOrder.id.toString()
  702. }
  703. }, {
  704. headers: {
  705. 'Authorization': `Bearer ${testToken}`
  706. }
  707. });
  708. expect(response.status).toBe(200);
  709. if (response.status === 200) {
  710. const data = await response.json();
  711. expect(data.data).toHaveLength(2);
  712. expect(data.data[0].orderId).toBe(testOrder.id);
  713. }
  714. });
  715. it('应该支持按人员ID查询', async () => {
  716. const response = await client.assets.query.$get({
  717. query: {
  718. personId: testOrderPerson.personId.toString()
  719. }
  720. }, {
  721. headers: {
  722. 'Authorization': `Bearer ${testToken}`
  723. }
  724. });
  725. expect(response.status).toBe(200);
  726. if (response.status === 200) {
  727. const data = await response.json();
  728. expect(data.data).toHaveLength(2);
  729. expect(data.data[0].personId).toBe(testOrderPerson.personId);
  730. }
  731. });
  732. it('应该支持按资产类型查询', async () => {
  733. const response = await client.assets.query.$get({
  734. query: {
  735. assetType: AssetType.DISABILITY_CERT
  736. }
  737. }, {
  738. headers: {
  739. 'Authorization': `Bearer ${testToken}`
  740. }
  741. });
  742. expect(response.status).toBe(200);
  743. if (response.status === 200) {
  744. const data = await response.json();
  745. expect(data.data).toHaveLength(1);
  746. expect(data.data[0].assetType).toBe(AssetType.DISABILITY_CERT);
  747. }
  748. });
  749. it('应该支持分页查询', async () => {
  750. const response = await client.assets.query.$get({
  751. query: {
  752. page: '1',
  753. limit: '1'
  754. }
  755. }, {
  756. headers: {
  757. 'Authorization': `Bearer ${testToken}`
  758. }
  759. });
  760. expect(response.status).toBe(200);
  761. if (response.status === 200) {
  762. const data = await response.json();
  763. expect(data.data).toHaveLength(1);
  764. expect(data.total).toBe(2);
  765. }
  766. });
  767. });
  768. describe('DELETE /order/assets/delete/:id', () => {
  769. let testAsset: OrderPersonAsset;
  770. beforeEach(async () => {
  771. // 创建测试数据
  772. const dataSource = await IntegrationTestDatabase.getDataSource();
  773. const orderRepository = dataSource.getRepository(EmploymentOrder);
  774. const orderPersonRepository = dataSource.getRepository(OrderPerson);
  775. const assetRepository = dataSource.getRepository(OrderPersonAsset);
  776. const testOrder = new EmploymentOrder({
  777. orderName: '资产删除测试订单',
  778. platformId: 1,
  779. companyId: 1,
  780. channelId: 1,
  781. expectedStartDate: new Date(),
  782. orderStatus: OrderStatus.DRAFT,
  783. workStatus: WorkStatus.NOT_WORKING,
  784. });
  785. await orderRepository.save(testOrder);
  786. const testOrderPerson = orderPersonRepository.create({
  787. orderId: testOrder.id,
  788. personId: 1001,
  789. joinDate: new Date(),
  790. workStatus: WorkStatus.NOT_WORKING,
  791. salaryDetail: 5000.00
  792. });
  793. await orderPersonRepository.save(testOrderPerson);
  794. testAsset = new OrderPersonAsset({
  795. orderId: testOrder.id,
  796. personId: testOrderPerson.personId,
  797. assetType: AssetType.DISABILITY_CERT,
  798. assetFileType: AssetFileType.IMAGE,
  799. fileId: testFile.id,
  800. relatedTime: new Date()
  801. });
  802. await assetRepository.save(testAsset);
  803. });
  804. it('应该成功删除订单人员资产', async () => {
  805. const response = await client.assets.delete[':id'].$delete({
  806. param: { id: testAsset.id.toString() }
  807. }, {
  808. headers: {
  809. 'Authorization': `Bearer ${testToken}`
  810. }
  811. });
  812. expect(response.status).toBe(200);
  813. if (response.status === 200) {
  814. const data = await response.json();
  815. expect(data.success).toBe(true);
  816. // 验证资产已删除
  817. const dataSource = await IntegrationTestDatabase.getDataSource();
  818. const assetRepository = dataSource.getRepository(OrderPersonAsset);
  819. const deletedAsset = await assetRepository.findOne({
  820. where: { id: testAsset.id }
  821. });
  822. expect(deletedAsset).toBeNull();
  823. }
  824. });
  825. it('应该处理不存在的资产ID', async () => {
  826. const response = await client.assets.delete[':id'].$delete({
  827. param: { id: '999999' }
  828. }, {
  829. headers: {
  830. 'Authorization': `Bearer ${testToken}`
  831. }
  832. });
  833. expect(response.status).toBe(404);
  834. });
  835. });
  836. describe('认证测试', () => {
  837. it('应该要求认证', async () => {
  838. const response = await client.list.$get({
  839. query: {}
  840. // 不提供Authorization header
  841. });
  842. expect(response.status).toBe(401);
  843. });
  844. it('应该验证无效token', async () => {
  845. const response = await client.list.$get({
  846. query: {}
  847. }, {
  848. headers: {
  849. 'Authorization': 'Bearer invalid_token'
  850. }
  851. });
  852. expect(response.status).toBe(401);
  853. });
  854. });
  855. });