Files
juzi/h5/test/report-copy-cases.js
T

38 lines
1.9 KiB
JavaScript

'use strict';
// Input is private, sanitized real-case data outside Git. No HTTP writes,
// upstream API calls, scoring recalculation or production database access.
const fs=require('node:fs'), assert=require('node:assert/strict'), UI=require('../js/report-ui');
const input=process.env.H5_COPY_CASE_FILE;
if (!input) throw Error('Set H5_COPY_CASE_FILE to private JSON outside the repository');
const cases=JSON.parse(fs.readFileSync(input,'utf8'));
let views=0, careItems=0;
for(const c of cases) {
const bytes=JSON.stringify(c), out=UI.forDisplay(c.vm,c.result,c.saved);
assert.equal(JSON.stringify(c),bytes,c.id+' immutable input');
assert.deepEqual(out.product,c.saved.product,c.id+' saved recommendation');
assert.deepEqual(out.care.map(v=>v.name),c.saved.care.map(v=>v.name),c.id+' care selection/order');
assert.equal(out.views.length,7);
for(const v of out.views) {
views++;
assert.equal(v.level,UI.levelForScore(v.S),c.id+' '+v.key);
assert(!/[{}]|undefined|NaN/.test(v.text),c.id+' unresolved copy');
if(v.key==='wrinkles'&&v.level==='优秀') {
const vars=c.vm.cats.wrinkles.vars;
if(vars.wr_cnt!=null) assert(v.text.includes('皱纹 '+vars.wr_cnt+' 条'));
if(vars.fl_cnt!=null) assert(v.text.includes('细纹 '+vars.fl_cnt+' 条'));
assert(!/无静态深纹|均无明显皱纹|固化趋势/.test(v.text));
}
if(v.key==='acne'&&c.vm.cats.acne.vars.acne_cnt>0) {
assert(v.text.includes('局部皮损仍需关注')); assert(!v.text.includes('未检出'));
}
}
for(const item of out.care) {
careItems++;
const v=out.views.find(v=>v.key===item.key);
assert(v,c.id+' legacy name unresolved: '+item.name);
assert.equal(item.level,v.level);
assert.equal(item.text,v.advice.care+v.advice.lifestyle);
}
}
console.log(`PASS ${cases.length} real cases, ${views} views, ${careItems} care items: score-based grades, factual copy, legacy care names, immutable scores/product/order`);