2
0

user-order-items.integration.test.ts 22 KB

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