Enable editing for draft exams

This commit is contained in:
2026-07-19 21:58:35 +08:00 Unverified
parent bb5d3da766
commit 1ed3b6722f
5 changed files with 79 additions and 14 deletions
+26
View File
@@ -59,6 +59,11 @@ try {
const sqliteFile = await readFile(testDb);
assert.equal(sqliteFile.subarray(0, 16).toString(), 'SQLite format 3\0', '测试持久化文件必须是真实 SQLite 数据库');
const appSource = await readFile(resolve(root, 'app.js'), 'utf8');
assert.doesNotMatch(appSource, /onclick=["']event\.stopPropagation\(\)/, '弹窗不得截断内部按钮的委托点击事件');
assert.match(appSource, /data-modal-backdrop/, '弹窗应仅在点击背景层本身时关闭');
assert.match(appSource, /data-action="edit-exam"/, '考试草稿应提供编辑入口');
const { DatabaseSync } = await import('node:sqlite');
const inspector = new DatabaseSync(testDb, { readOnly: true });
const tableNames = inspector.prepare(`
@@ -115,6 +120,27 @@ try {
assert.equal(createExam.data.exam.subjects.length, 3, '管理员应可创建多科目考试');
const exam = createExam.data.exam;
const draftResponse = await admin.request('/api/admin/exams', {
method: 'POST',
body: {
name: '待完善考试草稿', code: 'EX-TEST-DRAFT', description: '等待管理员继续配置',
registrationStart: new Date(now + 72 * hour).toISOString(), registrationEnd: new Date(now + 96 * hour).toISOString(),
examStart: new Date(now + 120 * hour).toISOString(), examEnd: new Date(now + 132 * hour).toISOString(),
admitDownloadStart: new Date(now + 100 * hour).toISOString(), admitDownloadEnd: new Date(now + 119 * hour).toISOString(),
location: '待定考点', status: 'draft', subjects: ['待定科目']
}
});
const editedDraft = await admin.request(`/api/admin/exams/${draftResponse.data.exam.id}`, {
method: 'PATCH',
body: { name: '已完善考试草稿', location: '测试中心', status: 'draft', subjects: ['语文', '数学'] }
});
assert.equal(editedDraft.response.status, 200, '管理员应可继续编辑考试草稿');
assert.deepEqual(editedDraft.data.exam.subjects.map(subject => subject.name), ['语文', '数学'], '草稿编辑应保存科目配置');
const refreshedAdminExams = await admin.request('/api/admin/exams');
const persistedDraft = refreshedAdminExams.data.exams.find(item => item.id === draftResponse.data.exam.id);
assert.equal(persistedDraft.name, '已完善考试草稿', '草稿修改应持久化');
assert.equal(persistedDraft.subjects.length, 2, '草稿科目修改应持久化');
const beforeApproval = await candidate.request('/api/candidate/registrations', { method: 'POST', body: { examId: exam.id, subjectIds: [exam.subjects[0].id] } });
assert.equal(beforeApproval.response.status, 403, '资料审核前不得报名考试');