|
|
@@ -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);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
});
|