38 lines
1.9 KiB
JavaScript
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`);
|