2
0

user-orders-routes.integration.test.ts 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  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 { UserEntityMt, RoleMt } from '@d8d/user-module-mt';
  6. import { DeliveryAddressMt } from '@d8d/delivery-address-module-mt';
  7. import { AreaEntityMt } from '@d8d/geo-areas-mt';
  8. import { MerchantMt } from '@d8d/merchant-module-mt';
  9. import { SupplierMt } from '@d8d/supplier-module-mt';
  10. import { FileMt } from '@d8d/file-module-mt';
  11. import userOrderRoutes from '../../src/routes/user/orders.mt';
  12. import { OrderMt } from '../../src/entities';
  13. import { OrdersTestFactory } from '../factories/orders-test-factory';
  14. // 设置集成测试钩子
  15. setupIntegrationDatabaseHooksWithEntities([
  16. UserEntityMt, RoleMt, OrderMt, DeliveryAddressMt, MerchantMt, SupplierMt, FileMt, AreaEntityMt
  17. ])
  18. describe('多租户用户订单管理API集成测试', () => {
  19. let client: ReturnType<typeof testClient<typeof userOrderRoutes>>;
  20. let testFactory: OrdersTestFactory;
  21. let userToken: string;
  22. let otherUserToken: string;
  23. let otherTenantUserToken: string;
  24. let testUser: UserEntityMt;
  25. let otherUser: UserEntityMt;
  26. let otherTenantUser: UserEntityMt;
  27. beforeEach(async () => {
  28. // 创建测试客户端
  29. client = testClient(userOrderRoutes);
  30. // 获取数据源并创建测试工厂
  31. const dataSource = await IntegrationTestDatabase.getDataSource();
  32. testFactory = new OrdersTestFactory(dataSource);
  33. // 创建测试用户
  34. testUser = await testFactory.createTestUser(1);
  35. otherUser = await testFactory.createTestUser(1);
  36. otherTenantUser = await testFactory.createTestUser(2);
  37. // 生成JWT令牌
  38. userToken = JWTUtil.generateToken({ id: testUser.id, username: testUser.username, tenantId: 1 });
  39. otherUserToken = JWTUtil.generateToken({ id: otherUser.id, username: otherUser.username, tenantId: 1 });
  40. otherTenantUserToken = JWTUtil.generateToken({ id: otherTenantUser.id, username: otherTenantUser.username, tenantId: 2 });
  41. });
  42. describe('租户数据隔离验证', () => {
  43. it('应该只能访问自己租户的订单', async () => {
  44. // 创建租户1的订单
  45. const tenant1Order = await testFactory.createTestOrder(testUser.id, { tenantId: 1 });
  46. // 创建租户2的订单
  47. const tenant2Order = await testFactory.createTestOrder(otherTenantUser.id, { tenantId: 2 });
  48. // 使用租户1的用户查询订单列表
  49. const response = await client.orders.$get({}, {
  50. headers: {
  51. 'Authorization': `Bearer ${userToken}`
  52. }
  53. });
  54. console.debug('Response status:', response.status);
  55. if (response.status !== 200) {
  56. const errorData = await response.json();
  57. console.debug('Error response:', errorData);
  58. }
  59. expect(response.status).toBe(200);
  60. const data = await response.json();
  61. // 应该只返回租户1的订单
  62. expect(data.data).toHaveLength(1);
  63. expect(data.data[0].tenantId).toBe(1);
  64. expect(data.data[0].id).toBe(tenant1Order.id);
  65. });
  66. it('不应该访问其他租户的订单详情', async () => {
  67. // 创建租户2的订单
  68. const otherTenantOrder = await testFactory.createTestOrder(otherTenantUser.id, { tenantId: 2 });
  69. // 使用租户1的用户尝试访问租户2的订单
  70. const response = await client.orders[':id'].$get({
  71. param: { id: otherTenantOrder.id }
  72. }, {
  73. headers: {
  74. 'Authorization': `Bearer ${userToken}`
  75. }
  76. });
  77. // 应该返回404,因为订单不在当前租户
  78. expect(response.status).toBe(404);
  79. });
  80. it('应该正确过滤跨租户订单访问', async () => {
  81. // 创建租户1的订单
  82. const tenant1Order = await testFactory.createTestOrder(testUser.id, { tenantId: 1 });
  83. // 使用租户2的用户尝试访问租户1的订单
  84. const response = await client.orders[':id'].$get({
  85. param: { id: tenant1Order.id }
  86. }, {
  87. headers: {
  88. 'Authorization': `Bearer ${otherTenantUserToken}`
  89. }
  90. });
  91. // 应该返回404,因为订单不在当前租户
  92. expect(response.status).toBe(404);
  93. });
  94. });
  95. describe('用户数据权限验证', () => {
  96. it('应该只能访问自己的订单', async () => {
  97. // 创建当前用户的订单
  98. const myOrder = await testFactory.createTestOrder(testUser.id, { tenantId: 1 });
  99. // 创建其他用户的订单(同一租户)
  100. const otherUserOrder = await testFactory.createTestOrder(otherUser.id, { tenantId: 1 });
  101. // 使用当前用户查询订单列表
  102. const response = await client.orders.$get({}, {
  103. headers: {
  104. 'Authorization': `Bearer ${userToken}`
  105. }
  106. });
  107. expect(response.status).toBe(200);
  108. const data = await response.json();
  109. // 应该只返回当前用户的订单
  110. expect(data.data).toHaveLength(1);
  111. expect(data.data[0].userId).toBe(testUser.id);
  112. expect(data.data[0].id).toBe(myOrder.id);
  113. });
  114. it('不应该访问其他用户的订单详情', async () => {
  115. // 创建其他用户的订单
  116. const otherUserOrder = await testFactory.createTestOrder(otherUser.id, { tenantId: 1 });
  117. // 使用当前用户尝试访问其他用户的订单
  118. const response = await client.orders[':id'].$get({
  119. param: { id: otherUserOrder.id }
  120. }, {
  121. headers: {
  122. 'Authorization': `Bearer ${userToken}`
  123. }
  124. });
  125. // 应该返回403,因为无权访问其他用户的订单
  126. expect(response.status).toBe(403);
  127. });
  128. });
  129. describe('订单创建验证', () => {
  130. it('应该自动设置租户ID', async () => {
  131. const orderData = {
  132. orderNo: `ORD_${Date.now()}`,
  133. amount: 100.00,
  134. payAmount: 95.00,
  135. discountAmount: 5.00,
  136. merchantId: 1,
  137. supplierId: 1,
  138. addressId: 1
  139. };
  140. const response = await client.orders.$post({
  141. json: orderData
  142. }, {
  143. headers: {
  144. 'Authorization': `Bearer ${userToken}`
  145. }
  146. });
  147. expect(response.status).toBe(201);
  148. const createdOrder = await response.json();
  149. // 验证租户ID已正确设置
  150. expect(createdOrder.tenantId).toBe(1);
  151. expect(createdOrder.userId).toBe(testUser.id);
  152. });
  153. });
  154. });