文件
shanghaipeiwan/server/tests/activity-time-range.spec.ts

69 行
3.4 KiB
TypeScript

// 已读取AGENTS.md
import * as fs from 'fs';
import * as path from 'path';
/**
* 第一百零一批回归闸门:活动时段与快捷时段起止时间闭环校验
*/
describe('第一百零一批活动时段与快捷时段起止时间闭环', () => {
const rootDir = path.resolve(__dirname, '../../');
const createVuePath = path.join(rootDir, 'pwuniapp/pages/activity/create.vue');
const detailVuePath = path.join(rootDir, 'pwuniapp/pages/activity/detail.vue');
const createVueContent = fs.readFileSync(createVuePath, 'utf-8');
const detailVueContent = fs.readFileSync(detailVuePath, 'utf-8');
it('快捷时段必须包含起止时间,不得仅有单点开始时间', () => {
expect(createVueContent).toContain("'今晚 19:30 - 21:30'");
expect(createVueContent).toContain("'今晚 20:30 - 22:30'");
expect(createVueContent).toContain("'明天 14:00 - 17:00'");
expect(createVueContent).toContain("'周六 18:30 - 21:30'");
expect(createVueContent).toContain("'周日 15:00 - 18:00'");
// 确保不再包含旧的无结束时间单点快捷项
expect(createVueContent).not.toMatch(/'今晚 19:30',/);
expect(createVueContent).not.toMatch(/'周六 18:30',/);
});
it('时间选择器必须升级为三列多列选择器(日期、开始时间、结束时间)', () => {
expect(createVueContent).toContain('const timePickerStartSlots =');
expect(createVueContent).toContain('const timePickerEndSlots =');
expect(createVueContent).toContain('const timePickerRange = ref([timePickerDays, timePickerStartSlots, timePickerEndSlots]);');
expect(createVueContent).toContain('const timePickerIndex = ref([5, 19, 24]);');
});
it('时间选择变动必须输出带有起止时间范围的完整时段字符串', () => {
expect(createVueContent).toContain('${dayStr} ${startStr} - ${endStr}');
expect(createVueContent).toContain('toSlotMinutes');
});
it('快捷时段点击必须支持解析起止时间并同步更新三列索引', () => {
expect(createVueContent).toContain('const match = String(timeItem).trim().match(/^(\\S+)\\s+([\\d:]+)(?:\\s*-\\s*([\\d:]+))?$/);');
expect(createVueContent).toContain('timePickerIndex.value = [');
});
it('活动详情页必须将展示文案统一为「活动时段」', () => {
expect(detailVueContent).toContain('<text class="info-label">活动时段</text>');
expect(detailVueContent).not.toContain('<text class="info-label">开始时间</text>');
});
it('时段选择器布局必须具备防挤压换行保护(无换行、省略截断与标签不压缩)', () => {
// 占位符必须精炼,避免超长换行
expect(createVueContent).toContain("{{ form.startTime || '请选择活动时段' }}");
expect(createVueContent).not.toContain('请选择活动时段 (起止时间)');
// 标签必须 flex-shrink: 0 且 white-space: nowrap 防止文字折行
expect(createVueContent).toContain('flex-shrink: 0;');
expect(createVueContent).toContain('white-space: nowrap;');
expect(createVueContent).toContain('text-overflow: ellipsis;');
// 基础信息卡片针对短标签优化宽度
expect(createVueContent).toContain('&.basic-info-card');
});
it('修改文件必须严格遵循零 Emoji 门禁规范', () => {
const emojiRegex = /[\u{1F300}-\u{1F9FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}]/u;
expect(emojiRegex.test(createVueContent)).toBe(false);
expect(emojiRegex.test(detailVueContent)).toBe(false);
});
});