|
|
@@ -177,3 +177,32 @@ test('同一预约多个已开通词库汇总学习词汇,按实际词库生
|
|
|
assert.equal(reviews.length,2);assert.deepEqual(reviews.map(r=>Number(r.kcid)),[100,102]);
|
|
|
await complete(a.gid,a.updatedAt,'multi-book-complete');assert.equal(await balance(),before-1);
|
|
|
});
|
|
|
+
|
|
|
+
|
|
|
+test('选填复习情况和训练状态允许留空或自由文本,报告保存原文且重试不重复扣费',async()=>{
|
|
|
+ const {default:vm}=await import('node:vm');
|
|
|
+ const context={parseObject:value=>JSON.parse(value),fail:(code,message)=>{throw Error(message);}};
|
|
|
+ vm.createContext(context);vm.runInContext(readFileSync(new URL('../cloud/lesson-workflow.js',import.meta.url),'utf8'),context);
|
|
|
+ for (const value of ['', ' 复习到第十页,易错词下次继续 ']) {
|
|
|
+ const f=context.lessonFeedbackInput({feedback:JSON.stringify({...feedback,reviewStatus:value,trainingStatus:value})});
|
|
|
+ assert.equal(f.reviewStatus,value.trim());assert.equal(f.trainingStatus,value.trim());
|
|
|
+ const a=await appointment(),before=await balance(),key='optional-feedback-'+a.gid;
|
|
|
+ assert.equal((await complete(a.gid,a.updatedAt,key,'teacher',30,f)).status,30);
|
|
|
+ assert.equal((await complete(a.gid,a.updatedAt,key,'teacher',30,f)).status,30);
|
|
|
+ assert.equal(await balance(),before-1);
|
|
|
+ const report=await one('SELECT "reviewStatus","trainingStatus" FROM "LessonCompletionReport" WHERE "appointmentGeneralId"::text=$1',[a.gid]);
|
|
|
+ assert.equal(report.reviewStatus,value.trim());assert.equal(report.trainingStatus,value.trim());
|
|
|
+ }
|
|
|
+ for(const field of ['reviewStatus','trainingStatus']){
|
|
|
+ const f={...feedback,[field]:'字'.repeat(201)};
|
|
|
+ assert.throws(()=>context.lessonFeedbackInput({feedback:JSON.stringify(f)}),/200字/);
|
|
|
+ const a=await appointment(),before=await balance();
|
|
|
+ await assert.rejects(complete(a.gid,a.updatedAt,'too-long-'+a.gid,'teacher',30,f),/请完整填写/);
|
|
|
+ assert.equal(await balance(),before);
|
|
|
+ }
|
|
|
+ const missing={...feedback,reviewStatus:'',trainingStatus:'',trainingSummary:''};
|
|
|
+ assert.throws(()=>context.lessonFeedbackInput({feedback:JSON.stringify(missing)}),/进度说明/);
|
|
|
+ const a=await appointment(),before=await balance();
|
|
|
+ await assert.rejects(complete(a.gid,a.updatedAt,'missing-progress-'+a.gid,'teacher',30,missing),/进度说明/);
|
|
|
+ assert.equal(await balance(),before);
|
|
|
+});
|