74 行
3.6 KiB
TypeScript
74 行
3.6 KiB
TypeScript
// 已读取AGENTS.md
|
|
import * as fs from 'fs';
|
|
import * as path from 'path';
|
|
|
|
/**
|
|
* 第一百零二批回归闸门:组局性别限制功能全链路闭环测试
|
|
*/
|
|
describe('第一百零二批组局性别限制闭环测试', () => {
|
|
const rootDir = path.resolve(__dirname, '../../');
|
|
const mysqlTsPath = path.join(rootDir, 'server/src/db/mysql.ts');
|
|
const repoTsPath = path.join(rootDir, 'server/src/db/repository.ts');
|
|
const apiJsPath = path.join(rootDir, 'pwuniapp/common/api.js');
|
|
const createVuePath = path.join(rootDir, 'pwuniapp/pages/activity/create.vue');
|
|
const detailVuePath = path.join(rootDir, 'pwuniapp/pages/activity/detail.vue');
|
|
const listVuePath = path.join(rootDir, 'pwuniapp/pages/activity/list.vue');
|
|
|
|
const mysqlContent = fs.readFileSync(mysqlTsPath, 'utf-8');
|
|
const repoContent = fs.readFileSync(repoTsPath, 'utf-8');
|
|
const apiJsContent = fs.readFileSync(apiJsPath, 'utf-8');
|
|
const createVueContent = fs.readFileSync(createVuePath, 'utf-8');
|
|
const detailVueContent = fs.readFileSync(detailVuePath, 'utf-8');
|
|
const listVueContent = fs.readFileSync(listVuePath, 'utf-8');
|
|
|
|
it('数据库结构必须包含 gender_requirement 字段及迁移补丁', () => {
|
|
expect(mysqlContent).toContain('gender_requirement VARCHAR(32) DEFAULT \'ALL\'');
|
|
expect(mysqlContent).toContain('ADD COLUMN gender_requirement VARCHAR(32)');
|
|
});
|
|
|
|
it('仓储层 createActivity 必须支持并归一化 genderRequirement', () => {
|
|
expect(repoContent).toContain('genderRequirement?: string;');
|
|
expect(repoContent).toContain("genderRequirement = 'FEMALE_ONLY'");
|
|
expect(repoContent).toContain("genderRequirement = 'MALE_ONLY'");
|
|
expect(repoContent).toContain('gender_requirement');
|
|
});
|
|
|
|
it('仓储层 joinActivity 必须严格执行性别限制校验,违规时拦截', () => {
|
|
expect(repoContent).toContain('该组局仅限女生报名参与');
|
|
expect(repoContent).toContain('该组局仅限男生报名参与');
|
|
expect(repoContent).toContain('genderRequirement || \'ALL\'');
|
|
});
|
|
|
|
it('小程序 API 层必须透传与格式化 genderRequirement', () => {
|
|
expect(apiJsContent).toContain('genderRequirement: payload.genderRequirement || \'ALL\'');
|
|
expect(apiJsContent).toContain('raw.genderRequirement || raw.gender_requirement || \'ALL\'');
|
|
});
|
|
|
|
it('组局发布页 create.vue 必须提供「凑局性别限制」配置项及三选一胶囊', () => {
|
|
expect(createVueContent).toContain('凑局性别限制');
|
|
expect(createVueContent).toContain('genderOptions');
|
|
expect(createVueContent).toContain("'仅女生'");
|
|
expect(createVueContent).toContain("'仅男生'");
|
|
expect(createVueContent).toContain("'不限'");
|
|
expect(createVueContent).toContain('genderRequirement: \'ALL\'');
|
|
expect(createVueContent).toContain('.gender-limit-block');
|
|
});
|
|
|
|
it('详情页与大厅列表必须展示对应性别限制标签', () => {
|
|
expect(detailVueContent).toContain('性别限制');
|
|
expect(detailVueContent).toContain('formatGenderRequirement');
|
|
expect(listVueContent).toContain('仅限女生');
|
|
expect(listVueContent).toContain('仅限男生');
|
|
expect(listVueContent).toContain('gender-req-tag');
|
|
});
|
|
|
|
it('全量修改文件必须严格遵守零 Emoji 门禁规范', () => {
|
|
const emojiRegex = /[\u{1F300}-\u{1F9FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}]/u;
|
|
expect(emojiRegex.test(mysqlContent)).toBe(false);
|
|
expect(emojiRegex.test(repoContent)).toBe(false);
|
|
expect(emojiRegex.test(createVueContent)).toBe(false);
|
|
expect(emojiRegex.test(detailVueContent)).toBe(false);
|
|
expect(emojiRegex.test(listVueContent)).toBe(false);
|
|
});
|
|
});
|