Files
mgm-daylight-mcrm-mobile-ios/tests/dashboardMigration.test.mjs
T
2026-09-16 10:43:59 +08:00

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);
});