2
0

order.integration.test.ts 29 KB

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