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