// 已读取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); }); });