2
0

admin-orders.integration.test.ts 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  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 { DeliveryAddress } from '@d8d/delivery-address-module';
  7. import { AreaEntity } from '@d8d/geo-areas';
  8. import { Merchant } from '@d8d/merchant-module';
  9. import { Supplier } from '@d8d/supplier-module';
  10. import { File } from '@d8d/file-module';
  11. import adminOrderRoutes from '../../src/routes/admin/orders';
  12. import { Order } from '../../src/entities';
  13. // 设置集成测试钩子
  14. setupIntegrationDatabaseHooksWithEntities([
  15. UserEntity, Role, Order, DeliveryAddress, Merchant, Supplier, File, AreaEntity
  16. ])
  17. describe('管理员订单管理API集成测试', () => {
  18. let client: ReturnType<typeof testClient<typeof adminOrderRoutes>>;
  19. let adminToken: string;
  20. let testUser: UserEntity;
  21. let testAdmin: UserEntity;
  22. let testDeliveryAddress: DeliveryAddress;
  23. let testMerchant: Merchant;
  24. let testSupplier: Supplier;
  25. let testProvince: AreaEntity;
  26. let testCity: AreaEntity;
  27. let testDistrict: AreaEntity;
  28. let testTown: AreaEntity;
  29. beforeEach(async () => {
  30. // 创建测试客户端
  31. client = testClient(adminOrderRoutes);
  32. // 获取数据源
  33. const dataSource = await IntegrationTestDatabase.getDataSource();
  34. // 创建测试用户
  35. const userRepository = dataSource.getRepository(UserEntity);
  36. testUser = userRepository.create({
  37. username: `test_user_${Math.floor(Math.random() * 100000)}`,
  38. password: 'test_password',
  39. nickname: '测试用户',
  40. registrationSource: 'web'
  41. });
  42. await userRepository.save(testUser);
  43. // 创建测试管理员用户
  44. testAdmin = userRepository.create({
  45. username: `test_admin_${Math.floor(Math.random() * 100000)}`,
  46. password: 'admin_password',
  47. nickname: '测试管理员',
  48. registrationSource: 'web'
  49. });
  50. await userRepository.save(testAdmin);
  51. // 生成测试管理员的token
  52. adminToken = JWTUtil.generateToken({
  53. id: testAdmin.id,
  54. username: testAdmin.username,
  55. roles: [{name:'admin'}]
  56. });
  57. // 创建测试地区数据
  58. const areaRepository = dataSource.getRepository(AreaEntity);
  59. testProvince = areaRepository.create({
  60. name: '广东省',
  61. level: 1,
  62. code: '44',
  63. state: 1
  64. });
  65. await areaRepository.save(testProvince);
  66. testCity = areaRepository.create({
  67. name: '深圳市',
  68. level: 2,
  69. code: '4403',
  70. state: 1
  71. });
  72. await areaRepository.save(testCity);
  73. testDistrict = areaRepository.create({
  74. name: '南山区',
  75. level: 3,
  76. code: '440305',
  77. state: 1
  78. });
  79. await areaRepository.save(testDistrict);
  80. testTown = areaRepository.create({
  81. name: '粤海街道',
  82. level: 4,
  83. code: '440305001',
  84. state: 1
  85. });
  86. await areaRepository.save(testTown);
  87. // 创建测试配送地址
  88. const deliveryAddressRepository = dataSource.getRepository(DeliveryAddress);
  89. testDeliveryAddress = deliveryAddressRepository.create({
  90. userId: testUser.id,
  91. name: '收货人姓名',
  92. phone: '13800138000',
  93. receiverProvince: testProvince.id,
  94. receiverCity: testCity.id,
  95. receiverDistrict: testDistrict.id,
  96. receiverTown: testTown.id,
  97. address: '测试地址',
  98. isDefault: 1,
  99. state: 1,
  100. createdBy: testUser.id
  101. });
  102. await deliveryAddressRepository.save(testDeliveryAddress);
  103. // 创建测试商户
  104. const merchantRepository = dataSource.getRepository(Merchant);
  105. testMerchant = merchantRepository.create({
  106. name: '测试商户',
  107. username: `test_merchant_${Math.floor(Math.random() * 100000)}`,
  108. password: 'password123',
  109. phone: '13800138001',
  110. realname: '测试商户',
  111. state: 1,
  112. createdBy: testUser.id
  113. });
  114. await merchantRepository.save(testMerchant);
  115. // 创建测试供应商
  116. const supplierRepository = dataSource.getRepository(Supplier);
  117. testSupplier = supplierRepository.create({
  118. name: '测试供应商',
  119. username: `test_supplier_${Math.floor(Math.random() * 100000)}`,
  120. password: 'password123',
  121. phone: '13800138002',
  122. realname: '测试供应商',
  123. state: 1,
  124. createdBy: testUser.id
  125. });
  126. await supplierRepository.save(testSupplier);
  127. });
  128. describe('GET /orders', () => {
  129. it('应该返回所有订单列表', async () => {
  130. // 创建多个用户的订单
  131. const dataSource = await IntegrationTestDatabase.getDataSource();
  132. const orderRepository = dataSource.getRepository(Order);
  133. const userOrder1 = orderRepository.create({
  134. orderNo: `ORDER_${Math.floor(Math.random() * 100000)}`,
  135. userId: testUser.id,
  136. amount: 100.00,
  137. costAmount: 80.00,
  138. payAmount: 100.00,
  139. orderType: 1,
  140. payType: 1,
  141. payState: 2,
  142. state: 0,
  143. addressId: testDeliveryAddress.id,
  144. merchantId: testMerchant.id,
  145. supplierId: testSupplier.id,
  146. recevierProvince: testProvince.id,
  147. recevierCity: testCity.id,
  148. recevierDistrict: testDistrict.id,
  149. recevierTown: testTown.id,
  150. createdBy: testUser.id
  151. });
  152. await orderRepository.save(userOrder1);
  153. const userOrder2 = orderRepository.create({
  154. orderNo: `ORDER_${Math.floor(Math.random() * 100000)}`,
  155. userId: testAdmin.id,
  156. amount: 200.00,
  157. costAmount: 160.00,
  158. payAmount: 200.00,
  159. orderType: 1,
  160. payType: 1,
  161. payState: 2,
  162. state: 1,
  163. addressId: testDeliveryAddress.id,
  164. merchantId: testMerchant.id,
  165. supplierId: testSupplier.id,
  166. recevierProvince: testProvince.id,
  167. recevierCity: testCity.id,
  168. recevierDistrict: testDistrict.id,
  169. recevierTown: testTown.id,
  170. createdBy: testAdmin.id
  171. });
  172. await orderRepository.save(userOrder2);
  173. const response = await client.index.$get({
  174. query: {}
  175. }, {
  176. headers: {
  177. 'Authorization': `Bearer ${adminToken}`
  178. }
  179. });
  180. console.debug('管理员订单列表响应状态:', response.status);
  181. expect(response.status).toBe(200);
  182. if (response.status === 200) {
  183. const data = await response.json();
  184. expect(data).toHaveProperty('data');
  185. expect(Array.isArray(data.data)).toBe(true);
  186. // 验证返回所有用户的订单(管理员可以访问所有数据)
  187. const userOrderCount = data.data.filter((order: any) => order.userId === testUser.id).length;
  188. const adminOrderCount = data.data.filter((order: any) => order.userId === testAdmin.id).length;
  189. expect(userOrderCount).toBeGreaterThan(0);
  190. expect(adminOrderCount).toBeGreaterThan(0);
  191. }
  192. });
  193. it('应该拒绝未认证用户的访问', async () => {
  194. const response = await client.index.$get({
  195. query: {}
  196. });
  197. expect(response.status).toBe(401);
  198. });
  199. });
  200. describe('POST /orders', () => {
  201. it('应该成功创建订单并可以指定权限', async () => {
  202. const createData = {
  203. orderNo: `ORDER_${Math.floor(Math.random() * 100000)}`,
  204. userId: testUser.id,
  205. amount: 150.00,
  206. costAmount: 120.00,
  207. payAmount: 150.00,
  208. orderType: 1,
  209. payType: 1,
  210. payState: 0,
  211. state: 0,
  212. addressId: testDeliveryAddress.id,
  213. merchantId: testMerchant.id,
  214. supplierId: testSupplier.id
  215. // createdBy 由认证中间件自动设置
  216. };
  217. const response = await client.index.$post({
  218. json: createData
  219. }, {
  220. headers: {
  221. 'Authorization': `Bearer ${adminToken}`
  222. }
  223. });
  224. console.debug('管理员创建订单响应状态:', response.status);
  225. if (response.status !== 201) {
  226. const errorData = await response.json();
  227. console.debug('管理员创建订单错误响应:', errorData);
  228. }
  229. expect(response.status).toBe(201);
  230. if (response.status === 201) {
  231. const data = await response.json();
  232. expect(data).toHaveProperty('id');
  233. expect(data.orderNo).toBe(createData.orderNo);
  234. expect(parseFloat(data.amount)).toBe(createData.amount);
  235. expect(data.userId).toBe(createData.userId); // 验证可以指定用户
  236. expect(data.createdBy).toBe(testAdmin.id); // 验证创建人自动设置为当前管理员用户
  237. }
  238. });
  239. it('应该验证创建订单的必填字段', async () => {
  240. const invalidData = {
  241. // 缺少必填字段
  242. amount: -1,
  243. orderType: -1
  244. };
  245. const response = await client.index.$post({
  246. json: invalidData
  247. }, {
  248. headers: {
  249. 'Authorization': `Bearer ${adminToken}`
  250. }
  251. });
  252. expect(response.status).toBe(400);
  253. });
  254. });
  255. describe('GET /orders/:id', () => {
  256. it('应该返回指定订单的详情', async () => {
  257. // 先创建一个订单
  258. const dataSource = await IntegrationTestDatabase.getDataSource();
  259. const orderRepository = dataSource.getRepository(Order);
  260. const testOrder = orderRepository.create({
  261. orderNo: `ORDER_${Math.floor(Math.random() * 100000)}`,
  262. userId: testUser.id,
  263. amount: 100.00,
  264. costAmount: 80.00,
  265. payAmount: 100.00,
  266. orderType: 1,
  267. payType: 1,
  268. payState: 2,
  269. state: 0,
  270. addressId: testDeliveryAddress.id,
  271. merchantId: testMerchant.id,
  272. supplierId: testSupplier.id,
  273. recevierProvince: testProvince.id,
  274. recevierCity: testCity.id,
  275. recevierDistrict: testDistrict.id,
  276. recevierTown: testTown.id,
  277. createdBy: testUser.id
  278. });
  279. await orderRepository.save(testOrder);
  280. const response = await client[':id'].$get({
  281. param: { id: testOrder.id }
  282. }, {
  283. headers: {
  284. 'Authorization': `Bearer ${adminToken}`
  285. }
  286. });
  287. console.debug('管理员订单详情响应状态:', response.status);
  288. expect(response.status).toBe(200);
  289. if (response.status === 200) {
  290. const data = await response.json();
  291. expect(data.id).toBe(testOrder.id);
  292. expect(data.orderNo).toBe(testOrder.orderNo);
  293. expect(data.userId).toBe(testUser.id);
  294. }
  295. });
  296. it('应该处理不存在的订单', async () => {
  297. const response = await client[':id'].$get({
  298. param: { id: 999999 }
  299. }, {
  300. headers: {
  301. 'Authorization': `Bearer ${adminToken}`
  302. }
  303. });
  304. expect(response.status).toBe(404);
  305. });
  306. });
  307. describe('PUT /orders/:id', () => {
  308. it('应该成功更新任何订单', async () => {
  309. // 先创建一个订单
  310. const dataSource = await IntegrationTestDatabase.getDataSource();
  311. const orderRepository = dataSource.getRepository(Order);
  312. const testOrder = orderRepository.create({
  313. orderNo: `ORDER_${Math.floor(Math.random() * 100000)}`,
  314. userId: testUser.id,
  315. amount: 100.00,
  316. costAmount: 80.00,
  317. payAmount: 100.00,
  318. orderType: 1,
  319. payType: 1,
  320. payState: 2,
  321. state: 0,
  322. addressId: testDeliveryAddress.id,
  323. merchantId: testMerchant.id,
  324. supplierId: testSupplier.id,
  325. recevierProvince: testProvince.id,
  326. recevierCity: testCity.id,
  327. recevierDistrict: testDistrict.id,
  328. recevierTown: testTown.id,
  329. createdBy: testUser.id
  330. });
  331. await orderRepository.save(testOrder);
  332. const updateData = {
  333. state: 1,
  334. payState: 1,
  335. updatedBy: testAdmin.id // 管理员可以指定更新人
  336. };
  337. const response = await client[':id'].$put({
  338. param: { id: testOrder.id },
  339. json: updateData
  340. }, {
  341. headers: {
  342. 'Authorization': `Bearer ${adminToken}`
  343. }
  344. });
  345. console.debug('管理员更新订单响应状态:', response.status);
  346. expect(response.status).toBe(200);
  347. if (response.status === 200) {
  348. const data = await response.json();
  349. expect(data.state).toBe(updateData.state);
  350. expect(data.payState).toBe(updateData.payState);
  351. expect(data.updatedBy).toBe(testAdmin.id); // 验证可以指定更新人
  352. }
  353. });
  354. });
  355. describe('DELETE /orders/:id', () => {
  356. it('应该成功删除任何订单', async () => {
  357. // 先创建一个订单
  358. const dataSource = await IntegrationTestDatabase.getDataSource();
  359. const orderRepository = dataSource.getRepository(Order);
  360. const testOrder = orderRepository.create({
  361. orderNo: `ORDER_${Math.floor(Math.random() * 100000)}`,
  362. userId: testUser.id,
  363. amount: 100.00,
  364. costAmount: 80.00,
  365. payAmount: 100.00,
  366. orderType: 1,
  367. payType: 1,
  368. payState: 2,
  369. state: 0,
  370. addressId: testDeliveryAddress.id,
  371. merchantId: testMerchant.id,
  372. supplierId: testSupplier.id,
  373. recevierProvince: testProvince.id,
  374. recevierCity: testCity.id,
  375. recevierDistrict: testDistrict.id,
  376. recevierTown: testTown.id,
  377. createdBy: testUser.id
  378. });
  379. await orderRepository.save(testOrder);
  380. const response = await client[':id'].$delete({
  381. param: { id: testOrder.id }
  382. }, {
  383. headers: {
  384. 'Authorization': `Bearer ${adminToken}`
  385. }
  386. });
  387. console.debug('管理员删除订单响应状态:', response.status);
  388. expect(response.status).toBe(204);
  389. });
  390. });
  391. describe('订单状态管理测试', () => {
  392. it('应该正确处理订单状态变更', async () => {
  393. const dataSource = await IntegrationTestDatabase.getDataSource();
  394. const orderRepository = dataSource.getRepository(Order);
  395. // 创建不同状态的订单
  396. const pendingOrder = orderRepository.create({
  397. orderNo: `ORDER_${Math.floor(Math.random() * 100000)}`,
  398. userId: testUser.id,
  399. amount: 100.00,
  400. costAmount: 80.00,
  401. payAmount: 100.00,
  402. orderType: 1,
  403. payType: 1,
  404. payState: 2,
  405. state: 0, // 未发货
  406. addressId: testDeliveryAddress.id,
  407. merchantId: testMerchant.id,
  408. supplierId: testSupplier.id,
  409. recevierProvince: testProvince.id,
  410. recevierCity: testCity.id,
  411. recevierDistrict: testDistrict.id,
  412. recevierTown: testTown.id,
  413. createdBy: testUser.id
  414. });
  415. await orderRepository.save(pendingOrder);
  416. const shippedOrder = orderRepository.create({
  417. orderNo: `ORDER_${Math.floor(Math.random() * 100000)}`,
  418. userId: testUser.id,
  419. amount: 200.00,
  420. costAmount: 160.00,
  421. payAmount: 200.00,
  422. orderType: 1,
  423. payType: 1,
  424. payState: 2,
  425. state: 1, // 已发货
  426. addressId: testDeliveryAddress.id,
  427. merchantId: testMerchant.id,
  428. supplierId: testSupplier.id,
  429. recevierProvince: testProvince.id,
  430. recevierCity: testCity.id,
  431. recevierDistrict: testDistrict.id,
  432. recevierTown: testTown.id,
  433. createdBy: testUser.id
  434. });
  435. await orderRepository.save(shippedOrder);
  436. const completedOrder = orderRepository.create({
  437. orderNo: `ORDER_${Math.floor(Math.random() * 100000)}`,
  438. userId: testUser.id,
  439. amount: 300.00,
  440. costAmount: 240.00,
  441. payAmount: 300.00,
  442. orderType: 1,
  443. payType: 1,
  444. payState: 2,
  445. state: 2, // 收货成功
  446. addressId: testDeliveryAddress.id,
  447. merchantId: testMerchant.id,
  448. supplierId: testSupplier.id,
  449. recevierProvince: testProvince.id,
  450. recevierCity: testCity.id,
  451. recevierDistrict: testDistrict.id,
  452. recevierTown: testTown.id,
  453. createdBy: testUser.id
  454. });
  455. await orderRepository.save(completedOrder);
  456. // 验证状态过滤
  457. const response = await client.index.$get({
  458. query: { filters: JSON.stringify({ state: 1 }) }
  459. }, {
  460. headers: {
  461. 'Authorization': `Bearer ${adminToken}`
  462. }
  463. });
  464. expect(response.status).toBe(200);
  465. const data = await response.json();
  466. // 类型检查确保data属性存在
  467. if ('data' in data && Array.isArray(data.data)) {
  468. // 应该只返回已发货状态的订单
  469. const pendingOrdersInResponse = data.data.filter((order: any) => order.state === 0);
  470. const shippedOrdersInResponse = data.data.filter((order: any) => order.state === 1);
  471. const completedOrdersInResponse = data.data.filter((order: any) => order.state === 2);
  472. expect(pendingOrdersInResponse.length).toBe(0);
  473. expect(shippedOrdersInResponse.length).toBeGreaterThan(0);
  474. expect(completedOrdersInResponse.length).toBe(0);
  475. } else {
  476. // 如果响应是错误格式,应该失败
  477. expect(data).toHaveProperty('data');
  478. }
  479. });
  480. });
  481. describe('支付状态管理测试', () => {
  482. it('应该正确处理支付状态变更', async () => {
  483. const dataSource = await IntegrationTestDatabase.getDataSource();
  484. const orderRepository = dataSource.getRepository(Order);
  485. // 创建不同支付状态的订单
  486. const unpaidOrder = orderRepository.create({
  487. orderNo: `ORDER_${Math.floor(Math.random() * 100000)}`,
  488. userId: testUser.id,
  489. amount: 100.00,
  490. costAmount: 80.00,
  491. payAmount: 100.00,
  492. orderType: 1,
  493. payType: 1,
  494. payState: 0, // 未支付
  495. state: 0,
  496. addressId: testDeliveryAddress.id,
  497. merchantId: testMerchant.id,
  498. supplierId: testSupplier.id,
  499. recevierProvince: testProvince.id,
  500. recevierCity: testCity.id,
  501. recevierDistrict: testDistrict.id,
  502. recevierTown: testTown.id,
  503. createdBy: testUser.id
  504. });
  505. await orderRepository.save(unpaidOrder);
  506. const payingOrder = orderRepository.create({
  507. orderNo: `ORDER_${Math.floor(Math.random() * 100000)}`,
  508. userId: testUser.id,
  509. amount: 200.00,
  510. costAmount: 160.00,
  511. payAmount: 200.00,
  512. orderType: 1,
  513. payType: 1,
  514. payState: 1, // 支付中
  515. state: 0,
  516. addressId: testDeliveryAddress.id,
  517. merchantId: testMerchant.id,
  518. supplierId: testSupplier.id,
  519. recevierProvince: testProvince.id,
  520. recevierCity: testCity.id,
  521. recevierDistrict: testDistrict.id,
  522. recevierTown: testTown.id,
  523. createdBy: testUser.id
  524. });
  525. await orderRepository.save(payingOrder);
  526. const paidOrder = orderRepository.create({
  527. orderNo: `ORDER_${Math.floor(Math.random() * 100000)}`,
  528. userId: testUser.id,
  529. amount: 300.00,
  530. costAmount: 240.00,
  531. payAmount: 300.00,
  532. orderType: 1,
  533. payType: 1,
  534. payState: 2, // 支付成功
  535. state: 0,
  536. addressId: testDeliveryAddress.id,
  537. merchantId: testMerchant.id,
  538. supplierId: testSupplier.id,
  539. recevierProvince: testProvince.id,
  540. recevierCity: testCity.id,
  541. recevierDistrict: testDistrict.id,
  542. recevierTown: testTown.id,
  543. createdBy: testUser.id
  544. });
  545. await orderRepository.save(paidOrder);
  546. // 验证支付状态过滤
  547. const response = await client.index.$get({
  548. query: { filters: JSON.stringify({ payState: 2 }) }
  549. }, {
  550. headers: {
  551. 'Authorization': `Bearer ${adminToken}`
  552. }
  553. });
  554. expect(response.status).toBe(200);
  555. const data = await response.json();
  556. // 类型检查确保data属性存在
  557. if ('data' in data && Array.isArray(data.data)) {
  558. // 应该只返回支付成功状态的订单
  559. const unpaidOrdersInResponse = data.data.filter((order: any) => order.payState === 0);
  560. const payingOrdersInResponse = data.data.filter((order: any) => order.payState === 1);
  561. const paidOrdersInResponse = data.data.filter((order: any) => order.payState === 2);
  562. expect(unpaidOrdersInResponse.length).toBe(0);
  563. expect(payingOrdersInResponse.length).toBe(0);
  564. expect(paidOrdersInResponse.length).toBeGreaterThan(0);
  565. } else {
  566. // 如果响应是错误格式,应该失败
  567. expect(data).toHaveProperty('data');
  568. }
  569. });
  570. });
  571. describe('管理员权限验证测试', () => {
  572. it('应该验证管理员可以访问所有数据', async () => {
  573. const dataSource = await IntegrationTestDatabase.getDataSource();
  574. const orderRepository = dataSource.getRepository(Order);
  575. // 创建多个用户的订单
  576. const userOrder = orderRepository.create({
  577. orderNo: `ORDER_${Math.floor(Math.random() * 100000)}`,
  578. userId: testUser.id,
  579. amount: 100.00,
  580. costAmount: 80.00,
  581. payAmount: 100.00,
  582. orderType: 1,
  583. payType: 1,
  584. payState: 2,
  585. state: 0,
  586. addressId: testDeliveryAddress.id,
  587. merchantId: testMerchant.id,
  588. supplierId: testSupplier.id,
  589. recevierProvince: testProvince.id,
  590. recevierCity: testCity.id,
  591. recevierDistrict: testDistrict.id,
  592. recevierTown: testTown.id,
  593. createdBy: testUser.id
  594. });
  595. await orderRepository.save(userOrder);
  596. const adminOrder = orderRepository.create({
  597. orderNo: `ORDER_${Math.floor(Math.random() * 100000)}`,
  598. userId: testAdmin.id,
  599. amount: 200.00,
  600. costAmount: 160.00,
  601. payAmount: 200.00,
  602. orderType: 1,
  603. payType: 1,
  604. payState: 2,
  605. state: 0,
  606. addressId: testDeliveryAddress.id,
  607. merchantId: testMerchant.id,
  608. supplierId: testSupplier.id,
  609. recevierProvince: testProvince.id,
  610. recevierCity: testCity.id,
  611. recevierDistrict: testDistrict.id,
  612. recevierTown: testTown.id,
  613. createdBy: testAdmin.id
  614. });
  615. await orderRepository.save(adminOrder);
  616. // 使用管理员token获取列表
  617. const response = await client.index.$get({
  618. query: {}
  619. }, {
  620. headers: {
  621. 'Authorization': `Bearer ${adminToken}`
  622. }
  623. });
  624. expect(response.status).toBe(200);
  625. const data = await response.json();
  626. // 类型检查确保data属性存在
  627. if ('data' in data && Array.isArray(data.data)) {
  628. // 验证返回所有用户的订单
  629. const userOrdersInResponse = data.data.filter((order: any) => order.userId === testUser.id);
  630. const adminOrdersInResponse = data.data.filter((order: any) => order.userId === testAdmin.id);
  631. expect(userOrdersInResponse.length).toBeGreaterThan(0);
  632. expect(adminOrdersInResponse.length).toBeGreaterThan(0);
  633. } else {
  634. // 如果响应是错误格式,应该失败
  635. expect(data).toHaveProperty('data');
  636. }
  637. });
  638. });
  639. });