61 lines
3.3 KiB
JavaScript
61 lines
3.3 KiB
JavaScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import {readFile} from 'node:fs/promises';
|
|
const source = await readFile(new URL('../pages/dashboard/dashboard.vue',import.meta.url),'utf8');
|
|
const script = source.match(/<script>([\s\S]*?)<\/script>/)[1]
|
|
.replace(/import[\s\S]*?from\s+['"][^'"]+['"];?[^\n]*/g,'').replace('export default','return');
|
|
function setup(data) {
|
|
let requests=0;
|
|
const page = new Function('mgmHeader','uni','getTodoDashboard',script)({},
|
|
{showLoading(){},hideLoading(){}},async()=>{requests++;return typeof data === 'function' ? data() : {success:true,data};});
|
|
const vm={$t:k=>k};
|
|
Object.assign(vm,page.data.call(vm),{userData:{userId:'80001'}});
|
|
for(const [key,fn] of Object.entries(page.methods)) vm[key]=fn.bind(vm);
|
|
return {vm,requests:()=>requests};
|
|
}
|
|
test('Dashboard request accepts both response casings and sets IM totals and data date',async()=>{
|
|
for(const pascal of [false,true]) {
|
|
const records=[{currentValue:0,itemName:'MF Turnover',userSegment:'IM',type:'Achievement',targetValue:100},
|
|
{itemName:'2026-09-09',type:'DataAsOf'}];
|
|
const data=pascal?{Records:records.map(r=>Object.fromEntries(Object.entries(r).map(([k,v])=>[k[0].toUpperCase()+k.slice(1),v])))}:{records};
|
|
const {vm,requests}=setup(data);
|
|
await vm.getTodoDashboardByuserId();
|
|
assert.equal(requests(),1);
|
|
assert.equal(vm.showDashboardView,true);
|
|
assert.equal(vm.userSegment,'IM');
|
|
assert.equal(vm.MFValue,0);
|
|
assert.equal(vm.dataAsOf,'2026-09-09');
|
|
}
|
|
});
|
|
test('Dashboard shows only populated sections and preserves IM turnover-only Achievement',async()=>{
|
|
for(const [records,achievement,kpi] of [
|
|
[[{type:'KPI',itemName:'Rate'}],false,true],
|
|
[[{type:'Achievement',itemName:'Target'}],true,false],
|
|
[[{type:'Achievement',itemName:'MF Turnover',userSegment:'IM',currentValue:0}],true,false]
|
|
]) {
|
|
const {vm}=setup({records}); await vm.getTodoDashboardByuserId();
|
|
assert.equal(vm.showAchievement,achievement); assert.equal(vm.showKPI,kpi);
|
|
}
|
|
});
|
|
test('Dashboard empty refresh clears old data and hides both sections',async()=>{
|
|
const data={records:[{type:'Achievement',itemName:'MF Turnover',userSegment:'IM',currentValue:99}]};
|
|
const {vm}=setup(data); await vm.getTodoDashboardByuserId();
|
|
data.records=[]; await vm.getTodoDashboardByuserId();
|
|
assert.deepEqual(vm.dashboardData,[]); assert.equal(vm.MFValue,'0');
|
|
assert.equal(vm.showDashboardView,false); assert.equal(vm.showAchievement,false); assert.equal(vm.showKPI,false);
|
|
});
|
|
test('Dashboard failed refresh hides previously displayed data',async()=>{
|
|
let fail=false;
|
|
const {vm}=setup(()=>{if(fail)throw Error('network');return {success:true,data:{records:[{type:'KPI',itemName:'Rate'}]}};});
|
|
await vm.getTodoDashboardByuserId(); fail=true; await vm.getTodoDashboardByuserId();
|
|
assert.equal(vm.showDashboardView,false); assert.equal(vm.showKPI,false); assert.equal(vm.showAchievement,false);
|
|
});
|
|
test('Dashboard normalization preserves camelCase zero over PascalCase fallback',()=>{
|
|
const {vm}=setup({});
|
|
const record={currentValue:0,CurrentValue:99,targetValue:0,TargetValue:100};
|
|
const normalized=vm.normalizeDashboardRecord(record);
|
|
assert.equal(normalized.currentValue,0);
|
|
assert.equal(normalized.targetValue,0);
|
|
assert.equal(record.CurrentValue,99);
|
|
});
|