|
|
@@ -5,7 +5,9 @@ import { JWTUtil } from '@d8d/shared-utils';
|
|
|
import { UserEntityMt, RoleMt } from '@d8d/core-module-mt/user-module-mt';
|
|
|
import { FileMt } from '@d8d/core-module-mt/file-module-mt';
|
|
|
import unifiedAdvertisementAdminRoutes from '../../src/routes/admin/unified-advertisements.admin.routes';
|
|
|
+import unifiedAdvertisementTypeAdminRoutes from '../../src/routes/admin/unified-advertisement-types.admin.routes';
|
|
|
import unifiedAdvertisementRoutes from '../../src/routes/unified-advertisements.routes';
|
|
|
+import unifiedAdvertisementTypeRoutes from '../../src/routes/unified-advertisement-types.routes';
|
|
|
import { UnifiedAdvertisement } from '../../src/entities/unified-advertisement.entity';
|
|
|
import { UnifiedAdvertisementType } from '../../src/entities/unified-advertisement-type.entity';
|
|
|
|
|
|
@@ -444,4 +446,556 @@ describe('统一广告模块集成测试', () => {
|
|
|
expect([200, 401]).toContain(listResponse.status);
|
|
|
});
|
|
|
});
|
|
|
+
|
|
|
+ describe('广告类型管理员路由(超级管理员专用)', () => {
|
|
|
+ let adminClient: ReturnType<typeof testClient<typeof unifiedAdvertisementTypeAdminRoutes>>;
|
|
|
+ let superAdminToken: string;
|
|
|
+ let regularUserToken: string;
|
|
|
+
|
|
|
+ beforeEach(async () => {
|
|
|
+ adminClient = testClient(unifiedAdvertisementTypeAdminRoutes);
|
|
|
+
|
|
|
+ // 生成超级管理员token (ID=1)
|
|
|
+ superAdminToken = JWTUtil.generateToken({
|
|
|
+ id: 1,
|
|
|
+ username: 'admin',
|
|
|
+ roles: [{ name: 'admin' }]
|
|
|
+ });
|
|
|
+
|
|
|
+ // 生成普通用户token (ID=2)
|
|
|
+ regularUserToken = JWTUtil.generateToken({
|
|
|
+ id: 2,
|
|
|
+ username: 'user',
|
|
|
+ roles: [{ name: 'user' }]
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('GET /api/v1/admin/unified-advertisement-types', () => {
|
|
|
+ it('应该允许超级管理员获取广告类型列表', async () => {
|
|
|
+ const response = await adminClient['/api/v1/admin/unified-advertisement-types'].$get({
|
|
|
+ query: { page: 1, pageSize: 10 }
|
|
|
+ }, {
|
|
|
+ headers: {
|
|
|
+ 'Authorization': `Bearer ${superAdminToken}`
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ console.debug('管理员广告类型列表响应状态:', response.status);
|
|
|
+ expect(response.status).toBe(200);
|
|
|
+
|
|
|
+ if (response.status === 200) {
|
|
|
+ const data = await response.json();
|
|
|
+ expect(data).toHaveProperty('code', 200);
|
|
|
+ expect(data).toHaveProperty('data');
|
|
|
+ expect(data.data).toHaveProperty('list');
|
|
|
+ expect(Array.isArray(data.data.list)).toBe(true);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该支持关键词搜索', async () => {
|
|
|
+ const dataSource = await IntegrationTestDatabase.getDataSource();
|
|
|
+ const typeRepository = dataSource.getRepository(UnifiedAdvertisementType);
|
|
|
+
|
|
|
+ const timestamp = Math.floor(Date.now() / 1000).toString().slice(-6);
|
|
|
+ await typeRepository.save({
|
|
|
+ name: '测试类型搜索',
|
|
|
+ code: `ts_${timestamp}`,
|
|
|
+ remark: '用于测试关键词搜索',
|
|
|
+ status: 1
|
|
|
+ });
|
|
|
+
|
|
|
+ const response = await adminClient['/api/v1/admin/unified-advertisement-types'].$get({
|
|
|
+ query: { page: 1, pageSize: 10, keyword: '测试类型搜索' }
|
|
|
+ }, {
|
|
|
+ headers: {
|
|
|
+ 'Authorization': `Bearer ${superAdminToken}`
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ expect(response.status).toBe(200);
|
|
|
+ if (response.status === 200) {
|
|
|
+ const data = await response.json();
|
|
|
+ expect(data.data.list.some((t: any) => t.name === '测试类型搜索')).toBe(true);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该支持状态筛选', async () => {
|
|
|
+ const response = await adminClient['/api/v1/admin/unified-advertisement-types'].$get({
|
|
|
+ query: { page: 1, pageSize: 10, status: 1 }
|
|
|
+ }, {
|
|
|
+ headers: {
|
|
|
+ 'Authorization': `Bearer ${superAdminToken}`
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ expect(response.status).toBe(200);
|
|
|
+ if (response.status === 200) {
|
|
|
+ const data = await response.json();
|
|
|
+ expect(data.data.list.every((t: any) => t.status === 1)).toBe(true);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该拒绝普通用户访问管理员接口', async () => {
|
|
|
+ const response = await adminClient['/api/v1/admin/unified-advertisement-types'].$get({
|
|
|
+ query: { page: 1, pageSize: 10 }
|
|
|
+ }, {
|
|
|
+ headers: {
|
|
|
+ 'Authorization': `Bearer ${regularUserToken}`
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ expect(response.status).toBe(403);
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该拒绝未认证用户访问', async () => {
|
|
|
+ const response = await adminClient['/api/v1/admin/unified-advertisement-types'].$get({
|
|
|
+ query: { page: 1, pageSize: 10 }
|
|
|
+ });
|
|
|
+
|
|
|
+ expect(response.status).toBe(401);
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('GET /api/v1/admin/unified-advertisement-types/:id', () => {
|
|
|
+ it('应该允许超级管理员获取广告类型详情', async () => {
|
|
|
+ const dataSource = await IntegrationTestDatabase.getDataSource();
|
|
|
+ const typeRepository = dataSource.getRepository(UnifiedAdvertisementType);
|
|
|
+
|
|
|
+ const timestamp = Math.floor(Date.now() / 1000).toString().slice(-6);
|
|
|
+ const testType = typeRepository.create({
|
|
|
+ name: '测试类型详情',
|
|
|
+ code: `td_${timestamp}`,
|
|
|
+ remark: '用于测试详情接口',
|
|
|
+ status: 1
|
|
|
+ });
|
|
|
+ await typeRepository.save(testType);
|
|
|
+
|
|
|
+ const response = await adminClient['/api/v1/admin/unified-advertisement-types/:id'].$get({
|
|
|
+ param: { id: testType.id }
|
|
|
+ }, {
|
|
|
+ headers: {
|
|
|
+ 'Authorization': `Bearer ${superAdminToken}`
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ console.debug('广告类型详情响应状态:', response.status);
|
|
|
+ expect(response.status).toBe(200);
|
|
|
+
|
|
|
+ if (response.status === 200) {
|
|
|
+ const data = await response.json();
|
|
|
+ expect(data.data.id).toBe(testType.id);
|
|
|
+ expect(data.data.name).toBe(testType.name);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该返回404对于不存在的类型', async () => {
|
|
|
+ const response = await adminClient['/api/v1/admin/unified-advertisement-types/:id'].$get({
|
|
|
+ param: { id: 999999 }
|
|
|
+ }, {
|
|
|
+ headers: {
|
|
|
+ 'Authorization': `Bearer ${superAdminToken}`
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ expect(response.status).toBe(404);
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('POST /api/v1/admin/unified-advertisement-types', () => {
|
|
|
+ it('应该允许超级管理员创建广告类型', async () => {
|
|
|
+ const timestamp = Math.floor(Date.now() / 1000).toString().slice(-6);
|
|
|
+ const createData = {
|
|
|
+ name: '首页轮播',
|
|
|
+ code: `hb_${timestamp}`,
|
|
|
+ remark: '用于首页轮播图展示',
|
|
|
+ status: 1
|
|
|
+ };
|
|
|
+
|
|
|
+ const response = await adminClient['/api/v1/admin/unified-advertisement-types'].$post({
|
|
|
+ json: createData
|
|
|
+ }, {
|
|
|
+ headers: {
|
|
|
+ 'Authorization': `Bearer ${superAdminToken}`
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ console.debug('创建广告类型响应状态:', response.status);
|
|
|
+ expect(response.status).toBe(201);
|
|
|
+
|
|
|
+ if (response.status === 201) {
|
|
|
+ const data = await response.json();
|
|
|
+ expect(data).toHaveProperty('code', 201);
|
|
|
+ expect(data.data).toHaveProperty('id');
|
|
|
+ expect(data.data.name).toBe(createData.name);
|
|
|
+ expect(data.data.code).toBe(createData.code);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该拒绝普通用户创建广告类型', async () => {
|
|
|
+ const response = await adminClient['/api/v1/admin/unified-advertisement-types'].$post({
|
|
|
+ json: {
|
|
|
+ name: '测试类型',
|
|
|
+ code: 'test_type',
|
|
|
+ remark: '测试'
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ headers: {
|
|
|
+ 'Authorization': `Bearer ${regularUserToken}`
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ expect(response.status).toBe(403);
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该拒绝创建重复code的类型', async () => {
|
|
|
+ const dataSource = await IntegrationTestDatabase.getDataSource();
|
|
|
+ const typeRepository = dataSource.getRepository(UnifiedAdvertisementType);
|
|
|
+
|
|
|
+ const timestamp = Math.floor(Date.now() / 1000).toString().slice(-6);
|
|
|
+ const existingType = typeRepository.create({
|
|
|
+ name: '已存在类型',
|
|
|
+ code: `dup_${timestamp}`,
|
|
|
+ remark: '用于测试重复code',
|
|
|
+ status: 1
|
|
|
+ });
|
|
|
+ await typeRepository.save(existingType);
|
|
|
+
|
|
|
+ const response = await adminClient['/api/v1/admin/unified-advertisement-types'].$post({
|
|
|
+ json: {
|
|
|
+ name: '新类型',
|
|
|
+ code: `dup_${timestamp}`,
|
|
|
+ remark: '测试重复code'
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ headers: {
|
|
|
+ 'Authorization': `Bearer ${superAdminToken}`
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ expect(response.status).toBe(500);
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('PUT /api/v1/admin/unified-advertisement-types/:id', () => {
|
|
|
+ it('应该允许超级管理员更新广告类型', async () => {
|
|
|
+ const dataSource = await IntegrationTestDatabase.getDataSource();
|
|
|
+ const typeRepository = dataSource.getRepository(UnifiedAdvertisementType);
|
|
|
+
|
|
|
+ const timestamp = Math.floor(Date.now() / 1000).toString().slice(-6);
|
|
|
+ const testType = typeRepository.create({
|
|
|
+ name: '原始类型',
|
|
|
+ code: `ot_${timestamp}`,
|
|
|
+ remark: '原始备注',
|
|
|
+ status: 1
|
|
|
+ });
|
|
|
+ await typeRepository.save(testType);
|
|
|
+
|
|
|
+ const updateData = {
|
|
|
+ name: '更新后的类型',
|
|
|
+ code: `ut_${timestamp}`,
|
|
|
+ remark: '更新后的备注'
|
|
|
+ };
|
|
|
+
|
|
|
+ const response = await adminClient['/api/v1/admin/unified-advertisement-types/:id'].$put({
|
|
|
+ param: { id: testType.id },
|
|
|
+ json: updateData
|
|
|
+ }, {
|
|
|
+ headers: {
|
|
|
+ 'Authorization': `Bearer ${superAdminToken}`
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ console.debug('更新广告类型响应状态:', response.status);
|
|
|
+ expect(response.status).toBe(200);
|
|
|
+
|
|
|
+ if (response.status === 200) {
|
|
|
+ const data = await response.json();
|
|
|
+ expect(data.data.name).toBe(updateData.name);
|
|
|
+ expect(data.data.remark).toBe(updateData.remark);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该返回404对于不存在的类型', async () => {
|
|
|
+ const response = await adminClient['/api/v1/admin/unified-advertisement-types/:id'].$put({
|
|
|
+ param: { id: 999999 },
|
|
|
+ json: { name: '更新' }
|
|
|
+ }, {
|
|
|
+ headers: {
|
|
|
+ 'Authorization': `Bearer ${superAdminToken}`
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ expect(response.status).toBe(404);
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('DELETE /api/v1/admin/unified-advertisement-types/:id', () => {
|
|
|
+ it('应该允许超级管理员软删除广告类型', async () => {
|
|
|
+ const dataSource = await IntegrationTestDatabase.getDataSource();
|
|
|
+ const typeRepository = dataSource.getRepository(UnifiedAdvertisementType);
|
|
|
+
|
|
|
+ const timestamp = Math.floor(Date.now() / 1000).toString().slice(-6);
|
|
|
+ const testType = typeRepository.create({
|
|
|
+ name: '待删除类型',
|
|
|
+ code: `dt_${timestamp}`,
|
|
|
+ remark: '用于测试软删除',
|
|
|
+ status: 1
|
|
|
+ });
|
|
|
+ await typeRepository.save(testType);
|
|
|
+
|
|
|
+ const response = await adminClient['/api/v1/admin/unified-advertisement-types/:id'].$delete({
|
|
|
+ param: { id: testType.id }
|
|
|
+ }, {
|
|
|
+ headers: {
|
|
|
+ 'Authorization': `Bearer ${superAdminToken}`
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ console.debug('删除广告类型响应状态:', response.status);
|
|
|
+ expect(response.status).toBe(200);
|
|
|
+
|
|
|
+ // 验证软删除
|
|
|
+ const deletedType = await typeRepository.findOne({
|
|
|
+ where: { id: testType.id }
|
|
|
+ });
|
|
|
+ expect(deletedType).toBeDefined();
|
|
|
+ expect(deletedType?.status).toBe(0);
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该返回404对于不存在的类型', async () => {
|
|
|
+ const response = await adminClient['/api/v1/admin/unified-advertisement-types/:id'].$delete({
|
|
|
+ param: { id: 999999 }
|
|
|
+ }, {
|
|
|
+ headers: {
|
|
|
+ 'Authorization': `Bearer ${superAdminToken}`
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ expect(response.status).toBe(404);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('广告类型用户展示路由', () => {
|
|
|
+ let userClient: ReturnType<typeof testClient<typeof unifiedAdvertisementTypeRoutes>>;
|
|
|
+ let testToken: string;
|
|
|
+ let testUser: UserEntityMt;
|
|
|
+
|
|
|
+ beforeEach(async () => {
|
|
|
+ userClient = testClient(unifiedAdvertisementTypeRoutes);
|
|
|
+
|
|
|
+ const dataSource = await IntegrationTestDatabase.getDataSource();
|
|
|
+ const userRepository = dataSource.getRepository(UserEntityMt);
|
|
|
+
|
|
|
+ testUser = userRepository.create({
|
|
|
+ username: `test_user_${Date.now()}`,
|
|
|
+ password: 'test_password',
|
|
|
+ nickname: '测试用户',
|
|
|
+ registrationSource: 'web',
|
|
|
+ tenantId: 1
|
|
|
+ });
|
|
|
+ await userRepository.save(testUser);
|
|
|
+
|
|
|
+ testToken = JWTUtil.generateToken({
|
|
|
+ id: testUser.id,
|
|
|
+ username: testUser.username,
|
|
|
+ roles: [{ name: 'user' }]
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('GET /advertisement-types', () => {
|
|
|
+ beforeEach(async () => {
|
|
|
+ const dataSource = await IntegrationTestDatabase.getDataSource();
|
|
|
+ const typeRepository = dataSource.getRepository(UnifiedAdvertisementType);
|
|
|
+ const timestamp = Math.floor(Date.now() / 1000).toString().slice(-6);
|
|
|
+
|
|
|
+ await typeRepository.save([
|
|
|
+ {
|
|
|
+ name: '首页轮播',
|
|
|
+ code: `hbn_${timestamp}`,
|
|
|
+ remark: '首页轮播图',
|
|
|
+ status: 1
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: '详情页推荐',
|
|
|
+ code: `dr_${timestamp}`,
|
|
|
+ remark: '详情页推荐',
|
|
|
+ status: 1
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: '禁用类型',
|
|
|
+ code: `dis_${timestamp}`,
|
|
|
+ remark: '已禁用',
|
|
|
+ status: 0
|
|
|
+ }
|
|
|
+ ]);
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该返回有效的广告类型列表(status=1)', async () => {
|
|
|
+ const response = await userClient['/api/v1/advertisement-types'].$get({
|
|
|
+ query: { page: 1, pageSize: 10 }
|
|
|
+ }, {
|
|
|
+ headers: {
|
|
|
+ 'Authorization': `Bearer ${testToken}`
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ console.debug('用户广告类型列表响应状态:', response.status);
|
|
|
+ expect(response.status).toBe(200);
|
|
|
+
|
|
|
+ if (response.status === 200) {
|
|
|
+ const data = await response.json();
|
|
|
+ expect(data).toHaveProperty('code', 200);
|
|
|
+ expect(data.data).toHaveProperty('list');
|
|
|
+ expect(Array.isArray(data.data.list)).toBe(true);
|
|
|
+ // 验证只返回启用状态的类型
|
|
|
+ expect(data.data.list.every((t: any) => t.status === 1)).toBe(true);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该支持关键词搜索', async () => {
|
|
|
+ const response = await userClient['/api/v1/advertisement-types'].$get({
|
|
|
+ query: { page: 1, pageSize: 10, keyword: '首页' }
|
|
|
+ }, {
|
|
|
+ headers: {
|
|
|
+ 'Authorization': `Bearer ${testToken}`
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ expect(response.status).toBe(200);
|
|
|
+ if (response.status === 200) {
|
|
|
+ const data = await response.json();
|
|
|
+ expect(data.data.list.some((t: any) => t.name.includes('首页'))).toBe(true);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该拒绝未认证用户访问', async () => {
|
|
|
+ const response = await userClient['/api/v1/advertisement-types'].$get({
|
|
|
+ query: { page: 1, pageSize: 10 }
|
|
|
+ });
|
|
|
+
|
|
|
+ expect(response.status).toBe(401);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('类型与广告的关联查询测试', () => {
|
|
|
+ let adminClient: ReturnType<typeof testClient<typeof unifiedAdvertisementAdminRoutes>>;
|
|
|
+ let superAdminToken: string;
|
|
|
+ let testType: UnifiedAdvertisementType;
|
|
|
+
|
|
|
+ beforeEach(async () => {
|
|
|
+ adminClient = testClient(unifiedAdvertisementAdminRoutes);
|
|
|
+
|
|
|
+ const dataSource = await IntegrationTestDatabase.getDataSource();
|
|
|
+ const typeRepository = dataSource.getRepository(UnifiedAdvertisementType);
|
|
|
+ const advertisementRepository = dataSource.getRepository(UnifiedAdvertisement);
|
|
|
+ const timestamp = Math.floor(Date.now() / 1000).toString().slice(-6);
|
|
|
+
|
|
|
+ // 创建测试类型
|
|
|
+ testType = typeRepository.create({
|
|
|
+ name: '测试关联类型',
|
|
|
+ code: `trt_${timestamp}`,
|
|
|
+ remark: '用于测试关联查询',
|
|
|
+ status: 1
|
|
|
+ });
|
|
|
+ await typeRepository.save(testType);
|
|
|
+
|
|
|
+ // 创建该类型下的多个广告
|
|
|
+ await advertisementRepository.save([
|
|
|
+ {
|
|
|
+ title: '关联广告1',
|
|
|
+ typeId: testType.id,
|
|
|
+ code: `ra1_${timestamp}`,
|
|
|
+ url: 'https://example.com/1',
|
|
|
+ sort: 1,
|
|
|
+ status: 1,
|
|
|
+ actionType: 1,
|
|
|
+ createdBy: 1
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '关联广告2',
|
|
|
+ typeId: testType.id,
|
|
|
+ code: `ra2_${timestamp}`,
|
|
|
+ url: 'https://example.com/2',
|
|
|
+ sort: 2,
|
|
|
+ status: 1,
|
|
|
+ actionType: 1,
|
|
|
+ createdBy: 1
|
|
|
+ }
|
|
|
+ ]);
|
|
|
+
|
|
|
+ superAdminToken = JWTUtil.generateToken({
|
|
|
+ id: 1,
|
|
|
+ username: 'admin',
|
|
|
+ roles: [{ name: 'admin' }]
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该能够通过类型查询关联的广告', async () => {
|
|
|
+ const dataSource = await IntegrationTestDatabase.getDataSource();
|
|
|
+ const typeRepository = dataSource.getRepository(UnifiedAdvertisementType);
|
|
|
+
|
|
|
+ // 查询类型及其关联的广告
|
|
|
+ const typeWithAds = await typeRepository.findOne({
|
|
|
+ where: { id: testType.id },
|
|
|
+ relations: ['advertisements']
|
|
|
+ });
|
|
|
+
|
|
|
+ expect(typeWithAds).toBeDefined();
|
|
|
+ expect(typeWithAds?.advertisements).toBeDefined();
|
|
|
+ expect(typeWithAds?.advertisements.length).toBeGreaterThan(0);
|
|
|
+ expect(typeWithAds?.advertisements.every(ad => ad.typeId === testType.id)).toBe(true);
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该能够在广告列表中包含类型信息', async () => {
|
|
|
+ const response = await adminClient['/api/v1/admin/unified-advertisements'].$get({
|
|
|
+ query: { page: 1, pageSize: 10 }
|
|
|
+ }, {
|
|
|
+ headers: {
|
|
|
+ 'Authorization': `Bearer ${superAdminToken}`
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ expect(response.status).toBe(200);
|
|
|
+ if (response.status === 200) {
|
|
|
+ const data = await response.json();
|
|
|
+ // 验证返回的广告包含typeId字段
|
|
|
+ const adsOfType = data.data.list.filter((ad: any) => ad.typeId === testType.id);
|
|
|
+ expect(adsOfType.length).toBeGreaterThan(0);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ it('应该支持按类型ID筛选广告', async () => {
|
|
|
+ const response = await adminClient['/api/v1/admin/unified-advertisements'].$get({
|
|
|
+ query: { page: 1, pageSize: 10, typeId: testType.id }
|
|
|
+ }, {
|
|
|
+ headers: {
|
|
|
+ 'Authorization': `Bearer ${superAdminToken}`
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ expect(response.status).toBe(200);
|
|
|
+ if (response.status === 200) {
|
|
|
+ const data = await response.json();
|
|
|
+ // 验证返回的广告都属于指定类型
|
|
|
+ expect(data.data.list.every((ad: any) => ad.typeId === testType.id)).toBe(true);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ it('软删除类型不应影响关联的广告', async () => {
|
|
|
+ const dataSource = await IntegrationTestDatabase.getDataSource();
|
|
|
+ const typeRepository = dataSource.getRepository(UnifiedAdvertisementType);
|
|
|
+ const advertisementRepository = dataSource.getRepository(UnifiedAdvertisement);
|
|
|
+
|
|
|
+ // 软删除类型
|
|
|
+ await typeRepository.update(testType.id, { status: 0 });
|
|
|
+
|
|
|
+ // 广告应该仍然存在
|
|
|
+ const ads = await advertisementRepository.find({
|
|
|
+ where: { typeId: testType.id }
|
|
|
+ });
|
|
|
+ expect(ads.length).toBeGreaterThan(0);
|
|
|
+ });
|
|
|
+ });
|
|
|
});
|