2
0

admin-orders.integration.test.ts 23 KB

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