|
|
@@ -1,79 +1,37 @@
|
|
|
import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
|
|
|
import { testClient } from 'hono/testing';
|
|
|
-import { IntegrationTestDatabase, setupIntegrationDatabaseHooksWithEntities } from '@d8d/shared-test-util';
|
|
|
+import { IntegrationTestDatabase, setupIntegrationDatabaseHooksWithEntities, TestDataFactory } from '@d8d/shared-test-util';
|
|
|
import { JWTUtil } from '@d8d/shared-utils';
|
|
|
-import { UserEntity, Role } from '@d8d/user-module';
|
|
|
-import { AreaEntity, AreaLevel } from '@d8d/geo-areas';
|
|
|
-import { File } from '@d8d/file-module';
|
|
|
+import { UserEntityMt, RoleMt } from '@d8d/user-module-mt';
|
|
|
+import { AreaEntityMt, AreaLevel } from '@d8d/geo-areas-mt';
|
|
|
+import { FileMt } from '@d8d/file-module-mt';
|
|
|
import { userDeliveryAddressRoutesMt } from '../../src/routes';
|
|
|
import { DeliveryAddressMt } from '../../src/entities';
|
|
|
|
|
|
// 设置集成测试钩子
|
|
|
-setupIntegrationDatabaseHooksWithEntities([UserEntity, Role, AreaEntity, DeliveryAddressMt, File])
|
|
|
+setupIntegrationDatabaseHooksWithEntities([UserEntityMt, RoleMt, AreaEntityMt, DeliveryAddressMt, FileMt])
|
|
|
|
|
|
describe('用户配送地址管理API集成测试', () => {
|
|
|
let client: ReturnType<typeof testClient<typeof userDeliveryAddressRoutesMt>>;
|
|
|
let userToken: string;
|
|
|
let otherUserToken: string;
|
|
|
- let testUser: UserEntity;
|
|
|
- let otherUser: UserEntity;
|
|
|
- let testProvince: AreaEntity;
|
|
|
- let testCity: AreaEntity;
|
|
|
- let testDistrict: AreaEntity;
|
|
|
+ let testUser: UserEntityMt;
|
|
|
+ let otherUser: UserEntityMt;
|
|
|
+ let testProvince: AreaEntityMt;
|
|
|
+ let testCity: AreaEntityMt;
|
|
|
+ let testDistrict: AreaEntityMt;
|
|
|
|
|
|
beforeEach(async () => {
|
|
|
// 创建测试客户端
|
|
|
client = testClient(userDeliveryAddressRoutesMt);
|
|
|
|
|
|
- // 获取数据源
|
|
|
- const dataSource = await IntegrationTestDatabase.getDataSource();
|
|
|
-
|
|
|
- // 创建测试用户
|
|
|
- const userRepository = dataSource.getRepository(UserEntity);
|
|
|
- testUser = userRepository.create({
|
|
|
- username: `test_user_${Date.now()}`,
|
|
|
- password: 'test_password',
|
|
|
- nickname: '测试用户',
|
|
|
- registrationSource: 'web'
|
|
|
- });
|
|
|
- await userRepository.save(testUser);
|
|
|
-
|
|
|
- // 创建其他用户
|
|
|
- otherUser = userRepository.create({
|
|
|
- username: `other_user_${Date.now()}`,
|
|
|
- password: 'other_password',
|
|
|
- nickname: '其他用户',
|
|
|
- registrationSource: 'web'
|
|
|
- });
|
|
|
- await userRepository.save(otherUser);
|
|
|
-
|
|
|
- // 创建测试地区数据 - 省
|
|
|
- const areaRepository = dataSource.getRepository(AreaEntity);
|
|
|
- testProvince = areaRepository.create({
|
|
|
- name: '北京市',
|
|
|
- code: '110000',
|
|
|
- level: AreaLevel.PROVINCE,
|
|
|
- parentId: null
|
|
|
- });
|
|
|
- await areaRepository.save(testProvince);
|
|
|
-
|
|
|
- // 创建测试地区数据 - 市
|
|
|
- testCity = areaRepository.create({
|
|
|
- name: '北京市',
|
|
|
- code: '110100',
|
|
|
- level: AreaLevel.CITY,
|
|
|
- parentId: testProvince.id
|
|
|
- });
|
|
|
- await areaRepository.save(testCity);
|
|
|
-
|
|
|
- // 创建测试地区数据 - 区
|
|
|
- testDistrict = areaRepository.create({
|
|
|
- name: '朝阳区',
|
|
|
- code: '110105',
|
|
|
- level: AreaLevel.DISTRICT,
|
|
|
- parentId: testCity.id
|
|
|
- });
|
|
|
- await areaRepository.save(testDistrict);
|
|
|
+ // 使用测试数据工厂创建完整测试数据集
|
|
|
+ const testData = await TestDataFactory.createTestDataSet(1);
|
|
|
+ testUser = testData.user;
|
|
|
+ otherUser = testData.otherUser;
|
|
|
+ testProvince = testData.province;
|
|
|
+ testCity = testData.city;
|
|
|
+ testDistrict = testData.district;
|
|
|
|
|
|
// 生成测试用户的token
|
|
|
userToken = JWTUtil.generateToken({
|
|
|
@@ -93,54 +51,42 @@ describe('用户配送地址管理API集成测试', () => {
|
|
|
describe('GET /delivery-address', () => {
|
|
|
it('应该返回当前用户的配送地址列表', async () => {
|
|
|
// 为测试用户创建一些地址
|
|
|
- const dataSource = await IntegrationTestDatabase.getDataSource();
|
|
|
- const deliveryAddressRepository = dataSource.getRepository(DeliveryAddressMt);
|
|
|
-
|
|
|
- const userAddress1 = deliveryAddressRepository.create({
|
|
|
- userId: testUser.id,
|
|
|
- name: '用户地址1',
|
|
|
- phone: '13800138001',
|
|
|
- address: '用户地址1',
|
|
|
- receiverProvince: testProvince.id,
|
|
|
- receiverCity: testCity.id,
|
|
|
- receiverDistrict: testDistrict.id,
|
|
|
- receiverTown: 1,
|
|
|
- state: 1,
|
|
|
- isDefault: 0,
|
|
|
- createdBy: testUser.id
|
|
|
- });
|
|
|
- await deliveryAddressRepository.save(userAddress1);
|
|
|
-
|
|
|
- const userAddress2 = deliveryAddressRepository.create({
|
|
|
- userId: testUser.id,
|
|
|
- name: '用户地址2',
|
|
|
- phone: '13800138002',
|
|
|
- address: '用户地址2',
|
|
|
- receiverProvince: testProvince.id,
|
|
|
- receiverCity: testCity.id,
|
|
|
- receiverDistrict: testDistrict.id,
|
|
|
- receiverTown: 1,
|
|
|
- state: 1,
|
|
|
- isDefault: 0,
|
|
|
- createdBy: testUser.id
|
|
|
- });
|
|
|
- await deliveryAddressRepository.save(userAddress2);
|
|
|
+ const userAddress1 = await TestDataFactory.createTestDeliveryAddress(
|
|
|
+ testUser.id,
|
|
|
+ testProvince.id,
|
|
|
+ testCity.id,
|
|
|
+ testDistrict.id,
|
|
|
+ {
|
|
|
+ name: '用户地址1',
|
|
|
+ phone: '13800138001',
|
|
|
+ address: '用户地址1'
|
|
|
+ }
|
|
|
+ );
|
|
|
+
|
|
|
+ const userAddress2 = await TestDataFactory.createTestDeliveryAddress(
|
|
|
+ testUser.id,
|
|
|
+ testProvince.id,
|
|
|
+ testCity.id,
|
|
|
+ testDistrict.id,
|
|
|
+ {
|
|
|
+ name: '用户地址2',
|
|
|
+ phone: '13800138002',
|
|
|
+ address: '用户地址2'
|
|
|
+ }
|
|
|
+ );
|
|
|
|
|
|
// 为其他用户创建一个地址,确保不会返回
|
|
|
- const otherUserAddress = deliveryAddressRepository.create({
|
|
|
- userId: otherUser.id,
|
|
|
- name: '其他用户地址',
|
|
|
- phone: '13800138003',
|
|
|
- address: '其他用户地址',
|
|
|
- receiverProvince: testProvince.id,
|
|
|
- receiverCity: testCity.id,
|
|
|
- receiverDistrict: testDistrict.id,
|
|
|
- receiverTown: 1,
|
|
|
- state: 1,
|
|
|
- isDefault: 0,
|
|
|
- createdBy: otherUser.id
|
|
|
- });
|
|
|
- await deliveryAddressRepository.save(otherUserAddress);
|
|
|
+ const otherUserAddress = await TestDataFactory.createTestDeliveryAddress(
|
|
|
+ otherUser.id,
|
|
|
+ testProvince.id,
|
|
|
+ testCity.id,
|
|
|
+ testDistrict.id,
|
|
|
+ {
|
|
|
+ name: '其他用户地址',
|
|
|
+ phone: '13800138003',
|
|
|
+ address: '其他用户地址'
|
|
|
+ }
|
|
|
+ );
|
|
|
|
|
|
const response = await client.index.$get({
|
|
|
query: {}
|
|
|
@@ -235,22 +181,17 @@ describe('用户配送地址管理API集成测试', () => {
|
|
|
describe('GET /delivery-address/:id', () => {
|
|
|
it('应该返回当前用户的配送地址详情', async () => {
|
|
|
// 先为当前用户创建一个配送地址
|
|
|
- const dataSource = await IntegrationTestDatabase.getDataSource();
|
|
|
- const deliveryAddressRepository = dataSource.getRepository(DeliveryAddressMt);
|
|
|
- const testDeliveryAddress = deliveryAddressRepository.create({
|
|
|
- userId: testUser.id,
|
|
|
- name: '王五',
|
|
|
- phone: '13600136000',
|
|
|
- address: '海淀区中关村大街1号',
|
|
|
- receiverProvince: testProvince.id,
|
|
|
- receiverCity: testCity.id,
|
|
|
- receiverDistrict: testDistrict.id,
|
|
|
- receiverTown: 1,
|
|
|
- state: 1,
|
|
|
- isDefault: 0,
|
|
|
- createdBy: testUser.id
|
|
|
- });
|
|
|
- await deliveryAddressRepository.save(testDeliveryAddress);
|
|
|
+ const testDeliveryAddress = await TestDataFactory.createTestDeliveryAddress(
|
|
|
+ testUser.id,
|
|
|
+ testProvince.id,
|
|
|
+ testCity.id,
|
|
|
+ testDistrict.id,
|
|
|
+ {
|
|
|
+ name: '王五',
|
|
|
+ phone: '13600136000',
|
|
|
+ address: '海淀区中关村大街1号'
|
|
|
+ }
|
|
|
+ );
|
|
|
|
|
|
const response = await client[':id'].$get({
|
|
|
param: { id: testDeliveryAddress.id }
|
|
|
@@ -275,22 +216,17 @@ describe('用户配送地址管理API集成测试', () => {
|
|
|
|
|
|
it('应该拒绝访问其他用户的配送地址', async () => {
|
|
|
// 为其他用户创建一个配送地址
|
|
|
- const dataSource = await IntegrationTestDatabase.getDataSource();
|
|
|
- const deliveryAddressRepository = dataSource.getRepository(DeliveryAddressMt);
|
|
|
- const otherUserAddress = deliveryAddressRepository.create({
|
|
|
- userId: otherUser.id,
|
|
|
- name: '其他用户地址',
|
|
|
- phone: '13600136001',
|
|
|
- address: '其他用户地址',
|
|
|
- receiverProvince: testProvince.id,
|
|
|
- receiverCity: testCity.id,
|
|
|
- receiverDistrict: testDistrict.id,
|
|
|
- receiverTown: 1,
|
|
|
- state: 1,
|
|
|
- isDefault: 0,
|
|
|
- createdBy: otherUser.id
|
|
|
- });
|
|
|
- await deliveryAddressRepository.save(otherUserAddress);
|
|
|
+ const otherUserAddress = await TestDataFactory.createTestDeliveryAddress(
|
|
|
+ otherUser.id,
|
|
|
+ testProvince.id,
|
|
|
+ testCity.id,
|
|
|
+ testDistrict.id,
|
|
|
+ {
|
|
|
+ name: '其他用户地址',
|
|
|
+ phone: '13600136001',
|
|
|
+ address: '其他用户地址'
|
|
|
+ }
|
|
|
+ );
|
|
|
|
|
|
// 当前用户尝试访问其他用户的地址
|
|
|
const response = await client[':id'].$get({
|
|
|
@@ -302,7 +238,7 @@ describe('用户配送地址管理API集成测试', () => {
|
|
|
});
|
|
|
|
|
|
console.debug('用户访问其他用户地址响应状态:', response.status);
|
|
|
- expect(response.status).toBe(404); // 应该返回404,而不是403
|
|
|
+ expect(response.status).toBe(403); // 数据权限控制返回403
|
|
|
});
|
|
|
|
|
|
it('应该处理不存在的配送地址', async () => {
|
|
|
@@ -321,22 +257,17 @@ describe('用户配送地址管理API集成测试', () => {
|
|
|
describe('PUT /delivery-address/:id', () => {
|
|
|
it('应该成功更新当前用户的配送地址', async () => {
|
|
|
// 先为当前用户创建一个配送地址
|
|
|
- const dataSource = await IntegrationTestDatabase.getDataSource();
|
|
|
- const deliveryAddressRepository = dataSource.getRepository(DeliveryAddressMt);
|
|
|
- const testDeliveryAddress = deliveryAddressRepository.create({
|
|
|
- userId: testUser.id,
|
|
|
- name: '原始姓名',
|
|
|
- phone: '13500135000',
|
|
|
- address: '原始地址',
|
|
|
- receiverProvince: testProvince.id,
|
|
|
- receiverCity: testCity.id,
|
|
|
- receiverDistrict: testDistrict.id,
|
|
|
- receiverTown: 1,
|
|
|
- state: 1,
|
|
|
- isDefault: 0,
|
|
|
- createdBy: testUser.id
|
|
|
- });
|
|
|
- await deliveryAddressRepository.save(testDeliveryAddress);
|
|
|
+ const testDeliveryAddress = await TestDataFactory.createTestDeliveryAddress(
|
|
|
+ testUser.id,
|
|
|
+ testProvince.id,
|
|
|
+ testCity.id,
|
|
|
+ testDistrict.id,
|
|
|
+ {
|
|
|
+ name: '原始姓名',
|
|
|
+ phone: '13500135000',
|
|
|
+ address: '原始地址'
|
|
|
+ }
|
|
|
+ );
|
|
|
|
|
|
const updateData = {
|
|
|
name: '更新后的姓名',
|
|
|
@@ -368,22 +299,17 @@ describe('用户配送地址管理API集成测试', () => {
|
|
|
|
|
|
it('应该拒绝更新其他用户的配送地址', async () => {
|
|
|
// 为其他用户创建一个配送地址
|
|
|
- const dataSource = await IntegrationTestDatabase.getDataSource();
|
|
|
- const deliveryAddressRepository = dataSource.getRepository(DeliveryAddressMt);
|
|
|
- const otherUserAddress = deliveryAddressRepository.create({
|
|
|
- userId: otherUser.id,
|
|
|
- name: '其他用户地址',
|
|
|
- phone: '13500135001',
|
|
|
- address: '其他用户地址',
|
|
|
- receiverProvince: testProvince.id,
|
|
|
- receiverCity: testCity.id,
|
|
|
- receiverDistrict: testDistrict.id,
|
|
|
- receiverTown: 1,
|
|
|
- state: 1,
|
|
|
- isDefault: 0,
|
|
|
- createdBy: otherUser.id
|
|
|
- });
|
|
|
- await deliveryAddressRepository.save(otherUserAddress);
|
|
|
+ const otherUserAddress = await TestDataFactory.createTestDeliveryAddress(
|
|
|
+ otherUser.id,
|
|
|
+ testProvince.id,
|
|
|
+ testCity.id,
|
|
|
+ testDistrict.id,
|
|
|
+ {
|
|
|
+ name: '其他用户地址',
|
|
|
+ phone: '13500135001',
|
|
|
+ address: '其他用户地址'
|
|
|
+ }
|
|
|
+ );
|
|
|
|
|
|
const updateData = {
|
|
|
name: '尝试更新的姓名',
|
|
|
@@ -409,22 +335,17 @@ describe('用户配送地址管理API集成测试', () => {
|
|
|
describe('DELETE /delivery-address/:id', () => {
|
|
|
it('应该成功删除当前用户的配送地址', async () => {
|
|
|
// 先为当前用户创建一个配送地址
|
|
|
- const dataSource = await IntegrationTestDatabase.getDataSource();
|
|
|
- const deliveryAddressRepository = dataSource.getRepository(DeliveryAddressMt);
|
|
|
- const testDeliveryAddress = deliveryAddressRepository.create({
|
|
|
- userId: testUser.id,
|
|
|
- name: '待删除地址',
|
|
|
- phone: '13400134000',
|
|
|
- address: '待删除地址',
|
|
|
- receiverProvince: testProvince.id,
|
|
|
- receiverCity: testCity.id,
|
|
|
- receiverDistrict: testDistrict.id,
|
|
|
- receiverTown: 1,
|
|
|
- state: 1,
|
|
|
- isDefault: 0,
|
|
|
- createdBy: testUser.id
|
|
|
- });
|
|
|
- await deliveryAddressRepository.save(testDeliveryAddress);
|
|
|
+ const testDeliveryAddress = await TestDataFactory.createTestDeliveryAddress(
|
|
|
+ testUser.id,
|
|
|
+ testProvince.id,
|
|
|
+ testCity.id,
|
|
|
+ testDistrict.id,
|
|
|
+ {
|
|
|
+ name: '待删除地址',
|
|
|
+ phone: '13400134000',
|
|
|
+ address: '待删除地址'
|
|
|
+ }
|
|
|
+ );
|
|
|
|
|
|
const response = await client[':id'].$delete({
|
|
|
param: { id: testDeliveryAddress.id }
|
|
|
@@ -438,6 +359,8 @@ describe('用户配送地址管理API集成测试', () => {
|
|
|
expect(response.status).toBe(204);
|
|
|
|
|
|
// 验证配送地址确实被删除
|
|
|
+ const dataSource = await IntegrationTestDatabase.getDataSource();
|
|
|
+ const deliveryAddressRepository = dataSource.getRepository(DeliveryAddressMt);
|
|
|
const deletedDeliveryAddress = await deliveryAddressRepository.findOne({
|
|
|
where: { id: testDeliveryAddress.id }
|
|
|
});
|
|
|
@@ -446,22 +369,17 @@ describe('用户配送地址管理API集成测试', () => {
|
|
|
|
|
|
it('应该拒绝删除其他用户的配送地址', async () => {
|
|
|
// 为其他用户创建一个配送地址
|
|
|
- const dataSource = await IntegrationTestDatabase.getDataSource();
|
|
|
- const deliveryAddressRepository = dataSource.getRepository(DeliveryAddressMt);
|
|
|
- const otherUserAddress = deliveryAddressRepository.create({
|
|
|
- userId: otherUser.id,
|
|
|
- name: '其他用户地址',
|
|
|
- phone: '13400134001',
|
|
|
- address: '其他用户地址',
|
|
|
- receiverProvince: testProvince.id,
|
|
|
- receiverCity: testCity.id,
|
|
|
- receiverDistrict: testDistrict.id,
|
|
|
- receiverTown: 1,
|
|
|
- state: 1,
|
|
|
- isDefault: 0,
|
|
|
- createdBy: otherUser.id
|
|
|
- });
|
|
|
- await deliveryAddressRepository.save(otherUserAddress);
|
|
|
+ const otherUserAddress = await TestDataFactory.createTestDeliveryAddress(
|
|
|
+ otherUser.id,
|
|
|
+ testProvince.id,
|
|
|
+ testCity.id,
|
|
|
+ testDistrict.id,
|
|
|
+ {
|
|
|
+ name: '其他用户地址',
|
|
|
+ phone: '13400134001',
|
|
|
+ address: '其他用户地址'
|
|
|
+ }
|
|
|
+ );
|
|
|
|
|
|
// 当前用户尝试删除其他用户的地址
|
|
|
const response = await client[':id'].$delete({
|
|
|
@@ -480,38 +398,29 @@ describe('用户配送地址管理API集成测试', () => {
|
|
|
describe('数据权限验证', () => {
|
|
|
it('用户应该只能访问和操作自己的数据', async () => {
|
|
|
// 为两个用户都创建地址
|
|
|
- const dataSource = await IntegrationTestDatabase.getDataSource();
|
|
|
- const deliveryAddressRepository = dataSource.getRepository(DeliveryAddressMt);
|
|
|
-
|
|
|
- const userAddress = deliveryAddressRepository.create({
|
|
|
- userId: testUser.id,
|
|
|
- name: '用户地址',
|
|
|
- phone: '13800138004',
|
|
|
- address: '用户地址',
|
|
|
- receiverProvince: testProvince.id,
|
|
|
- receiverCity: testCity.id,
|
|
|
- receiverDistrict: testDistrict.id,
|
|
|
- receiverTown: 1,
|
|
|
- state: 1,
|
|
|
- isDefault: 0,
|
|
|
- createdBy: testUser.id
|
|
|
- });
|
|
|
- await deliveryAddressRepository.save(userAddress);
|
|
|
-
|
|
|
- const otherUserAddress = deliveryAddressRepository.create({
|
|
|
- userId: otherUser.id,
|
|
|
- name: '其他用户地址',
|
|
|
- phone: '13800138005',
|
|
|
- address: '其他用户地址',
|
|
|
- receiverProvince: testProvince.id,
|
|
|
- receiverCity: testCity.id,
|
|
|
- receiverDistrict: testDistrict.id,
|
|
|
- receiverTown: 1,
|
|
|
- state: 1,
|
|
|
- isDefault: 0,
|
|
|
- createdBy: otherUser.id
|
|
|
- });
|
|
|
- await deliveryAddressRepository.save(otherUserAddress);
|
|
|
+ const userAddress = await TestDataFactory.createTestDeliveryAddress(
|
|
|
+ testUser.id,
|
|
|
+ testProvince.id,
|
|
|
+ testCity.id,
|
|
|
+ testDistrict.id,
|
|
|
+ {
|
|
|
+ name: '用户地址',
|
|
|
+ phone: '13800138004',
|
|
|
+ address: '用户地址'
|
|
|
+ }
|
|
|
+ );
|
|
|
+
|
|
|
+ const otherUserAddress = await TestDataFactory.createTestDeliveryAddress(
|
|
|
+ otherUser.id,
|
|
|
+ testProvince.id,
|
|
|
+ testCity.id,
|
|
|
+ testDistrict.id,
|
|
|
+ {
|
|
|
+ name: '其他用户地址',
|
|
|
+ phone: '13800138005',
|
|
|
+ address: '其他用户地址'
|
|
|
+ }
|
|
|
+ );
|
|
|
|
|
|
// 当前用户应该只能看到自己的地址
|
|
|
const listResponse = await client.index.$get({
|
|
|
@@ -540,7 +449,7 @@ describe('用户配送地址管理API集成测试', () => {
|
|
|
'Authorization': `Bearer ${userToken}`
|
|
|
}
|
|
|
});
|
|
|
- expect(getResponse.status).toBe(404);
|
|
|
+ expect(getResponse.status).toBe(403);
|
|
|
|
|
|
// 当前用户应该无法更新其他用户的地址
|
|
|
const updateResponse = await client[':id'].$put({
|