Просмотр исходного кода

♻️ refactor(test): 重构配送地址管理API测试为管理员路由测试

- 重命名测试文件从delivery-address.integration.test.ts到admin-routes.integration.test.ts
- 更新测试描述为"管理员配送地址管理API集成测试"
- 切换使用adminDeliveryAddressRoutes路由配置
- 创建测试管理员用户并生成管理员token
- 替换所有测试中的testToken为adminToken
- 添加管理员权限测试套件,包括:
  - 管理员为其他用户创建地址的能力测试
  - 管理员访问所有用户地址的权限测试
  - 管理员更新其他用户地址的权限测试
  - 管理员删除其他用户地址的权限测试
  - 管理员查询指定用户地址的权限测试
yourname 1 месяц назад
Родитель
Сommit
54ac6c7415

+ 237 - 20
packages/delivery-address-module/tests/integration/delivery-address.integration.test.ts → packages/delivery-address-module/tests/integration/admin-routes.integration.test.ts

@@ -4,23 +4,24 @@ import { IntegrationTestDatabase, setupIntegrationDatabaseHooksWithEntities } fr
 import { JWTUtil } from '@d8d/shared-utils';
 import { UserEntity, Role } from '@d8d/user-module';
 import { AreaEntity, AreaLevel } from '@d8d/geo-areas';
-import deliveryAddressRoutes from '../../src/routes';
+import { adminDeliveryAddressRoutes } from '../../src/routes';
 import { DeliveryAddress } from '../../src/entities';
 
 // 设置集成测试钩子
 setupIntegrationDatabaseHooksWithEntities([UserEntity, Role, AreaEntity, DeliveryAddress])
 
-describe('配送地址管理API集成测试', () => {
-  let client: ReturnType<typeof testClient<typeof deliveryAddressRoutes>>;
-  let testToken: string;
+describe('管理员配送地址管理API集成测试', () => {
+  let client: ReturnType<typeof testClient<typeof adminDeliveryAddressRoutes>>;
+  let adminToken: string;
   let testUser: UserEntity;
+  let testAdmin: UserEntity;
   let testProvince: AreaEntity;
   let testCity: AreaEntity;
   let testDistrict: AreaEntity;
 
   beforeEach(async () => {
     // 创建测试客户端
-    client = testClient(deliveryAddressRoutes);
+    client = testClient(adminDeliveryAddressRoutes);
 
     // 获取数据源
     const dataSource = await IntegrationTestDatabase.getDataSource();
@@ -35,6 +36,15 @@ describe('配送地址管理API集成测试', () => {
     });
     await userRepository.save(testUser);
 
+    // 创建测试管理员用户
+    testAdmin = userRepository.create({
+      username: `test_admin_${Date.now()}`,
+      password: 'admin_password',
+      nickname: '测试管理员',
+      registrationSource: 'web'
+    });
+    await userRepository.save(testAdmin);
+
     // 创建测试地区数据 - 省
     const areaRepository = dataSource.getRepository(AreaEntity);
     testProvince = areaRepository.create({
@@ -63,11 +73,11 @@ describe('配送地址管理API集成测试', () => {
     });
     await areaRepository.save(testDistrict);
 
-    // 生成测试用户的token
-    testToken = JWTUtil.generateToken({
-      id: testUser.id,
-      username: testUser.username,
-      roles: [{name:'user'}]
+    // 生成测试管理员的token
+    adminToken = JWTUtil.generateToken({
+      id: testAdmin.id,
+      username: testAdmin.username,
+      roles: [{name:'admin'}]
     });
   });
 
@@ -77,7 +87,7 @@ describe('配送地址管理API集成测试', () => {
         query: {}
       }, {
         headers: {
-          'Authorization': `Bearer ${testToken}`
+          'Authorization': `Bearer ${adminToken}`
         }
       });
 
@@ -117,7 +127,7 @@ describe('配送地址管理API集成测试', () => {
         json: createData
       }, {
         headers: {
-          'Authorization': `Bearer ${testToken}`
+          'Authorization': `Bearer ${adminToken}`
         }
       });
 
@@ -152,7 +162,7 @@ describe('配送地址管理API集成测试', () => {
         json: invalidData
       }, {
         headers: {
-          'Authorization': `Bearer ${testToken}`
+          'Authorization': `Bearer ${adminToken}`
         }
       });
 
@@ -177,7 +187,7 @@ describe('配送地址管理API集成测试', () => {
         json: invalidAreaData
       }, {
         headers: {
-          'Authorization': `Bearer ${testToken}`
+          'Authorization': `Bearer ${adminToken}`
         }
       });
 
@@ -210,7 +220,7 @@ describe('配送地址管理API集成测试', () => {
         param: { id: testDeliveryAddress.id }
       }, {
         headers: {
-          'Authorization': `Bearer ${testToken}`
+          'Authorization': `Bearer ${adminToken}`
         }
       });
 
@@ -239,7 +249,7 @@ describe('配送地址管理API集成测试', () => {
         param: { id: 999999 }
       }, {
         headers: {
-          'Authorization': `Bearer ${testToken}`
+          'Authorization': `Bearer ${adminToken}`
         }
       });
 
@@ -279,7 +289,7 @@ describe('配送地址管理API集成测试', () => {
         json: updateData
       }, {
         headers: {
-          'Authorization': `Bearer ${testToken}`
+          'Authorization': `Bearer ${adminToken}`
         }
       });
 
@@ -320,7 +330,7 @@ describe('配送地址管理API集成测试', () => {
         param: { id: testDeliveryAddress.id }
       }, {
         headers: {
-          'Authorization': `Bearer ${testToken}`
+          'Authorization': `Bearer ${adminToken}`
         }
       });
 
@@ -360,7 +370,7 @@ describe('配送地址管理API集成测试', () => {
         param: { id: testDeliveryAddress.id }
       }, {
         headers: {
-          'Authorization': `Bearer ${testToken}`
+          'Authorization': `Bearer ${adminToken}`
         }
       });
 
@@ -411,7 +421,7 @@ describe('配送地址管理API集成测试', () => {
         json: createData
       }, {
         headers: {
-          'Authorization': `Bearer ${testToken}`
+          'Authorization': `Bearer ${adminToken}`
         }
       });
 
@@ -420,4 +430,211 @@ describe('配送地址管理API集成测试', () => {
       expect(response.status).toBe(400);
     });
   });
+
+  describe('管理员权限测试', () => {
+    it('管理员应该可以为其他用户创建地址', async () => {
+      const createData = {
+        userId: testUser.id, // 为其他用户创建地址
+        name: '其他用户地址',
+        phone: '13800138001',
+        address: '其他用户地址',
+        receiverProvince: testProvince.id,
+        receiverCity: testCity.id,
+        receiverDistrict: testDistrict.id,
+        receiverTown: 0,
+        state: 1,
+        isDefault: 0
+      };
+
+      const response = await client.index.$post({
+        json: createData
+      }, {
+        headers: {
+          'Authorization': `Bearer ${adminToken}`
+        }
+      });
+
+      console.debug('管理员为其他用户创建地址响应状态:', response.status);
+      expect(response.status).toBe(201);
+
+      if (response.status === 201) {
+        const data = await response.json();
+        expect(data.userId).toBe(testUser.id); // 验证地址确实属于其他用户
+        expect(data.name).toBe(createData.name);
+      }
+    });
+
+    it('管理员应该可以访问所有用户的地址', async () => {
+      // 为测试用户创建一些地址
+      const dataSource = await IntegrationTestDatabase.getDataSource();
+      const deliveryAddressRepository = dataSource.getRepository(DeliveryAddress);
+
+      const userAddress1 = deliveryAddressRepository.create({
+        userId: testUser.id,
+        name: '用户地址1',
+        phone: '13800138002',
+        address: '用户地址1',
+        receiverProvince: testProvince.id,
+        receiverCity: testCity.id,
+        receiverDistrict: testDistrict.id,
+        receiverTown: 0,
+        state: 1,
+        isDefault: 0,
+        createdBy: testUser.id
+      });
+      await deliveryAddressRepository.save(userAddress1);
+
+      const userAddress2 = deliveryAddressRepository.create({
+        userId: testUser.id,
+        name: '用户地址2',
+        phone: '13800138003',
+        address: '用户地址2',
+        receiverProvince: testProvince.id,
+        receiverCity: testCity.id,
+        receiverDistrict: testDistrict.id,
+        receiverTown: 0,
+        state: 1,
+        isDefault: 0,
+        createdBy: testUser.id
+      });
+      await deliveryAddressRepository.save(userAddress2);
+
+      // 管理员应该能看到所有地址
+      const response = await client.index.$get({
+        query: {}
+      }, {
+        headers: {
+          'Authorization': `Bearer ${adminToken}`
+        }
+      });
+
+      expect(response.status).toBe(200);
+      const data = await response.json();
+      expect(Array.isArray(data.data)).toBe(true);
+      expect(data.data.length).toBeGreaterThanOrEqual(2); // 至少包含我们创建的两个地址
+    });
+
+    it('管理员应该可以更新其他用户的地址', async () => {
+      // 先为测试用户创建一个地址
+      const dataSource = await IntegrationTestDatabase.getDataSource();
+      const deliveryAddressRepository = dataSource.getRepository(DeliveryAddress);
+      const testDeliveryAddress = deliveryAddressRepository.create({
+        userId: testUser.id,
+        name: '原始地址',
+        phone: '13800138004',
+        address: '原始地址',
+        receiverProvince: testProvince.id,
+        receiverCity: testCity.id,
+        receiverDistrict: testDistrict.id,
+        receiverTown: 0,
+        state: 1,
+        isDefault: 0,
+        createdBy: testUser.id
+      });
+      await deliveryAddressRepository.save(testDeliveryAddress);
+
+      const updateData = {
+        name: '管理员更新的地址',
+        phone: '13900139000',
+        address: '管理员更新的地址'
+      };
+
+      const response = await client[':id'].$put({
+        param: { id: testDeliveryAddress.id },
+        json: updateData
+      }, {
+        headers: {
+          'Authorization': `Bearer ${adminToken}`
+        }
+      });
+
+      console.debug('管理员更新其他用户地址响应状态:', response.status);
+      expect(response.status).toBe(200);
+
+      if (response.status === 200) {
+        const data = await response.json();
+        expect(data.name).toBe(updateData.name);
+        expect(data.phone).toBe(updateData.phone);
+        expect(data.address).toBe(updateData.address);
+      }
+    });
+
+    it('管理员应该可以删除其他用户的地址', async () => {
+      // 先为测试用户创建一个地址
+      const dataSource = await IntegrationTestDatabase.getDataSource();
+      const deliveryAddressRepository = dataSource.getRepository(DeliveryAddress);
+      const testDeliveryAddress = deliveryAddressRepository.create({
+        userId: testUser.id,
+        name: '待删除地址',
+        phone: '13800138005',
+        address: '待删除地址',
+        receiverProvince: testProvince.id,
+        receiverCity: testCity.id,
+        receiverDistrict: testDistrict.id,
+        receiverTown: 0,
+        state: 1,
+        isDefault: 0,
+        createdBy: testUser.id
+      });
+      await deliveryAddressRepository.save(testDeliveryAddress);
+
+      const response = await client[':id'].$delete({
+        param: { id: testDeliveryAddress.id }
+      }, {
+        headers: {
+          'Authorization': `Bearer ${adminToken}`
+        }
+      });
+
+      console.debug('管理员删除其他用户地址响应状态:', response.status);
+      expect(response.status).toBe(204);
+
+      // 验证地址确实被删除
+      const deletedDeliveryAddress = await deliveryAddressRepository.findOne({
+        where: { id: testDeliveryAddress.id }
+      });
+      expect(deletedDeliveryAddress).toBeNull();
+    });
+
+    it('管理员应该可以查询指定用户的地址', async () => {
+      // 为测试用户创建一些地址
+      const dataSource = await IntegrationTestDatabase.getDataSource();
+      const deliveryAddressRepository = dataSource.getRepository(DeliveryAddress);
+
+      const userAddress = deliveryAddressRepository.create({
+        userId: testUser.id,
+        name: '指定用户地址',
+        phone: '13800138006',
+        address: '指定用户地址',
+        receiverProvince: testProvince.id,
+        receiverCity: testCity.id,
+        receiverDistrict: testDistrict.id,
+        receiverTown: 0,
+        state: 1,
+        isDefault: 0,
+        createdBy: testUser.id
+      });
+      await deliveryAddressRepository.save(userAddress);
+
+      // 管理员可以查询指定用户的地址
+      const response = await client.index.$get({
+        query: { userId: testUser.id }
+      }, {
+        headers: {
+          'Authorization': `Bearer ${adminToken}`
+        }
+      });
+
+      expect(response.status).toBe(200);
+      const data = await response.json();
+      expect(Array.isArray(data.data)).toBe(true);
+
+      // 验证返回的地址都属于指定用户
+      if (data.data.length > 0) {
+        data.data.forEach((address: any) => {
+          expect(address.userId).toBe(testUser.id);
+        });
+      }
+    });
+  });
 });