73 lines
2.5 KiB
TypeScript
73 lines
2.5 KiB
TypeScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
import type { HydrogenOverviewResponse } from '../api.js';
|
|
import {
|
|
deriveOverviewMetrics,
|
|
formatKg,
|
|
formatRelative,
|
|
formatYuan,
|
|
} from './model.js';
|
|
|
|
test('重量和金额单位保持现有阈值及负数格式', () => {
|
|
assert.deepEqual(formatKg(999.5), { value: '999.50', unit: 'Kg' });
|
|
assert.deepEqual(formatKg(1000), { value: '1.00', unit: 'T' });
|
|
assert.deepEqual(formatYuan(9999), { value: '9,999', unit: '元' });
|
|
assert.deepEqual(formatYuan(12345), { value: '1.23', unit: '万元' });
|
|
assert.deepEqual(formatYuan(-100_000_000), { value: '-1.00', unit: '亿元' });
|
|
});
|
|
|
|
test('相对更新时间保持秒、分钟、小时和未来时间边界', () => {
|
|
const now = new Date(2026, 7, 13, 12, 0, 0).getTime();
|
|
assert.equal(formatRelative(now + 60_000, now), '刚刚');
|
|
assert.equal(formatRelative(now - 30_000, now), '30 秒前');
|
|
assert.equal(formatRelative(now - 5 * 60_000, now), '5 分钟前');
|
|
assert.equal(formatRelative(now - 3 * 60 * 60_000, now), '3 小时前');
|
|
});
|
|
|
|
test('总览派生指标保持月份顺序、动能、集中度和收益率口径', () => {
|
|
const data = {
|
|
kpi: {
|
|
yearKg: 1000,
|
|
yearFee: 0,
|
|
yearProfit: -50,
|
|
ourYearKg: 0,
|
|
customerYearKg: 0,
|
|
ourYearFee: 0,
|
|
yearRevenue: 500,
|
|
monthKg: 0,
|
|
monthFee: 0,
|
|
monthRevenue: 0,
|
|
monthProfit: 0,
|
|
todayKg: 0,
|
|
todayFee: 0,
|
|
todayRevenue: 0,
|
|
todayProfit: 0,
|
|
lingniuBornKg: 0,
|
|
lingniuBornFee: 0,
|
|
},
|
|
top5: [{ rank: 1, name: 'A', kg: 600, fee: 100, share: 0.6 }],
|
|
regions: [],
|
|
monthly: [
|
|
{ month: '2026-01', kg: 100, fee: 20, revenue: 30, profit: 10 },
|
|
{ month: '2026-02', kg: 150, fee: 30, revenue: 40, profit: 10 },
|
|
],
|
|
customers: [],
|
|
stations: [
|
|
{ name: 'A', kg: 600, share: 0.6, revenue: 300, revenueShare: 0.6 },
|
|
{ name: 'B', kg: 400, share: 0.4, revenue: 200, revenueShare: 0.4 },
|
|
],
|
|
availableYears: [2026],
|
|
year: 2026,
|
|
} satisfies HydrogenOverviewResponse;
|
|
|
|
const metrics = deriveOverviewMetrics(data);
|
|
assert.equal(metrics.monthAvgKg, 125);
|
|
assert.equal(metrics.bestMonth?.month, '2026-02');
|
|
assert.equal(metrics.latestMonth?.month, '2026-02');
|
|
assert.equal(metrics.monthMomentum, 50);
|
|
assert.equal(metrics.top5Share, 60);
|
|
assert.equal(metrics.profitYield, -10);
|
|
assert.equal(metrics.stationAvgKg, 500);
|
|
assert.deepEqual(metrics.monthlyDual.map(item => item.monthLabel), ['1月', '2月']);
|
|
});
|