writing-stage-decision.test.mjs 2.6 KB

1234567891011121314151617181920212223242526272829
  1. import {test} from 'node:test';
  2. import assert from 'node:assert/strict';
  3. import vm from 'node:vm';
  4. import {readFileSync} from 'node:fs';
  5. const context=vm.createContext({Date,text:v=>String(v??'').trim()});
  6. vm.runInContext(readFileSync(new URL('../cloud/payroll-integrity.js',import.meta.url),'utf8'),context);
  7. const row={studentId:'20',startsAt:'2026-09-09 20:00',studentName:'同学',grade:'',nickname:'同学'};
  8. const decide=(r,prior=[])=>context.writingStageAssessment({...row,...r},prior,'2026-10-12');
  9. test('明确年级和姓名标注可判断,数字年级不会误判十一年级为一年级',()=>{
  10. for(const [value,category] of [['小学五年级','primary_writing'],['7年级','middle_writing'],['初三','middle_writing'],['某同学高中','high_writing'],['某同学高三','high_writing'],['十一年级','high_writing'],['10年级','high_writing']]){
  11. const result=decide({nickname:value});assert.equal(result.canAutoConfirm,true);assert.equal(result.suggestedCategoryKey,category);assert.ok(result.evidence.includes(value));
  12. }
  13. });
  14. test('空年级仍能读取旧档案,城市学校名称和不确定描述不能推断学段',()=>{
  15. assert.equal(decide({grade:'',position:'初中八年级'}).suggestedCategoryKey,'middle_writing');
  16. for(const name of ['某同学丰城','小同学','某同学高安中学','可能高中','初中?'])assert.equal(decide({nickname:name}).canAutoConfirm,false);
  17. });
  18. test('同学年已确认预约可复用,其他学员和跨学年证据不会串用',()=>{
  19. const prior={studentId:'20',startsAt:'2026-09-02 19:00',category:'middle_writing',evidence:'人工确认初中',appointmentGeneralId:123};
  20. assert.equal(decide({},[prior]).suggestedCategoryKey,'middle_writing');
  21. assert.equal(decide({},[{...prior,studentId:'21'}]).canAutoConfirm,false);
  22. assert.equal(decide({},[{...prior,startsAt:'2025-09-02 19:00'}]).canAutoConfirm,false);
  23. assert.equal(decide({startsAt:'2027-09-02 19:00',grade:'初中'}).canAutoConfirm,false);
  24. });
  25. test('档案、姓名或既往确认冲突时保留人工核对,日期无效不自动确认',()=>{
  26. for(const r of [{grade:'初中',nickname:'某同学高中'},{grade:'小学/初中'},{startsAt:'2026-02-30 19:00',grade:'高中'}])assert.equal(decide(r).canAutoConfirm,false);
  27. const conflicting=[{studentId:'20',startsAt:'2026-09-02',category:'middle_writing',evidence:'人工确认',appointmentGeneralId:1},{studentId:'20',startsAt:'2026-09-03',category:'high_writing',evidence:'人工确认',appointmentGeneralId:2}];
  28. const result=decide({},conflicting);assert.equal(result.canAutoConfirm,false);assert.match(result.assessmentReason,/冲突/);assert.equal(result.suggestedCategoryKey,'');
  29. });