Files
mi-fitness-health/maintenance/legacy-tests/health-references.test.cjs
T

55 lines
4.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const test=require('node:test');
const assert=require('node:assert/strict');
const h=require('../mi-fitness-mcp-cn/src/mi_fitness_mcp/web_assets/static/js/health-views.js');
const range={start:'2026-10-01',end:'2026-10-30'};
const stress=values=>values.map((v,i)=>({timestamp:`2026-10-${String(i+1).padStart(2,'0')}T08:00:00+08:00`,stress_score:v,level:'old-source-level'}));
test('所有压力低于25时保持20以内的纵轴,25/50/80仅在上方标注,平均值在图内',()=>{
const m=h.build('stress',stress([5,12,18]),range);
assert.ok(Array.isArray(m.references),'参考线尚未实现');
const layout=h.referenceLayout(m);
assert.equal(layout.max,20);
assert.deepEqual(layout.outside.map(r=>r.value),[25,50,80]);
assert.deepEqual(layout.inside.map(r=>r.value),[35/3]);
const html=h.render(m);
assert.equal((html.match(/class="health-reference"/g)||[]).length,1);
assert.match(html,/平均/);assert.match(html,/放松 1–25/);assert.match(html,/重度 81–100/);
});
test('58的压力数据纵轴至60,25/50在图内,80在上方;25恰在上界时不隐藏',()=>{
const m=h.build('stress',stress([10,58]),range),layout=h.referenceLayout(m);
assert.equal(layout.max,60);
assert.ok(layout.inside.some(r=>r.value===25));assert.ok(layout.inside.some(r=>r.value===50));
assert.deepEqual(layout.outside.map(r=>r.value),[80]);
const edge=h.referenceLayout(h.build('stress',stress([25]),range));
assert.equal(edge.max,25);assert.ok(edge.inside.some(r=>r.key==='stress-25'));
});
test('六类页面平均值按日期和筛选结果计算,心率170不撑高纵轴',()=>{
const activity=h.build('activity',[{date:'2026-10-01',steps:4000},{date:'2026-10-02',steps:8000}],range);
assert.equal(activity.references.find(r=>r.key==='average').value,6000);
assert.equal(activity.references.find(r=>r.key==='fixed').value,7000);
const seven=h.build('activity',[{date:'2026-10-01',steps:4000},{date:'2026-10-02',steps:8000}],{start:'2026-10-02',end:'2026-10-08'});
assert.equal(seven.references.find(r=>r.key==='average').value,8000);
const hr=h.build('heartrate',[{timestamp:'2026-10-01T08:00:00+08:00',bpm:60,sample_type:'resting'},{timestamp:'2026-10-01T08:01:00+08:00',bpm:100,sample_type:'passive'},{timestamp:'2026-10-01T08:02:00+08:00',bpm:110,sample_type:'passive'}],range);
assert.equal(hr.references.find(r=>r.key==='average').value,90);
assert.equal(hr.references.find(r=>r.key==='resting-average').value,60);
assert.ok(h.referenceLayout(hr).max<170);assert.equal(h.referenceLayout(hr).outside[0].value,170);
const sleep=h.build('sleep',[{end_at:'2026-10-01T08:00:00+08:00',time_asleep_minutes:420},{end_at:'2026-10-01T14:00:00+08:00',time_asleep_minutes:30,is_nap:1},{end_at:'2026-10-02T08:00:00+08:00',time_asleep_minutes:510}],range);
assert.equal(sleep.references.find(r=>r.key==='average').value,8);assert.equal(sleep.references.find(r=>r.key==='fixed').value,8);
const body=h.build('body',[{timestamp:'2026-10-01T08:00:00+08:00',weight_kg:80},{timestamp:'2026-10-02T08:00:00+08:00',weight_kg:84}],range);
assert.equal(body.references.find(r=>r.key==='average').value,82);assert.equal(body.references.find(r=>r.key==='fixed').value,65);
const spo2=h.build('spo2',[{timestamp:'2026-10-01T08:00:00+08:00',spo2_pct:94},{timestamp:'2026-10-02T08:00:00+08:00',spo2_pct:98}],range);
assert.equal(spo2.references.length,1);assert.equal(spo2.references[0].value,96);
});
test('压力四档含边界,0保持未分类;筛选和导出不改源等级',()=>{
for(const [v,name]of [[1,'放松'],[25,'放松'],[26,'轻度'],[50,'轻度'],[51,'中度'],[80,'中度'],[81,'重度'],[100,'重度'],[0,'未分类']])assert.equal(h.pressureBand(v).label,name);
const m=h.build('stress',stress([0,25,26,50,51,80,81,100]),{...range,pressureLevel:'moderate',limit:1});
assert.equal(m.records.length,1);assert.equal(m.records[0].stress_score,80);assert.equal(m.cards[0].raw,80);
assert.match(h.csv(m),/old-source-level/);assert.match(h.csv(m),/压力等级(当前分界)/);assert.match(h.csv(m),/中度/);assert.match(h.detail(m),/中度/);
});
test('重叠均值和固定值的标注分开摆放;无数值不生成伪均值',()=>{
const m=h.build('sleep',[{end_at:'2026-10-01T08:00:00+08:00',time_asleep_minutes:480}],range);
const layout=h.referenceLayout(m);
assert.equal(layout.inside.length,2);assert.ok(Math.abs(layout.inside[0].labelY-layout.inside[1].labelY)>=18);
const empty=h.build('stress',[],range);assert.ok(!empty.references.some(r=>r.key==='average'));assert.ok(!h.render(empty).includes('class="health-reference"'));
const zero=h.build('stress',stress([0]),range);assert.equal(zero.references.find(r=>r.key==='average').value,0);
});