import assert from 'node:assert/strict' import test from 'node:test' import { run, validOperationalMetrics } from './dashboard.mjs' import { readFileSync } from 'node:fs' const metrics = () => ({ inTransitContainerCount: '3', inTransitTeu: '4.5', unknownContainerTypeCount: '1', pendingCustomsOrderCount: '2', asOf: '2026-10-06T01:00:00' }) test('实时指标拒绝缺失、负数、非整数计数及未知箱型超出总柜数', () => { assert.equal(validOperationalMetrics(metrics()), true) for (const field of ['inTransitContainerCount', 'unknownContainerTypeCount', 'pendingCustomsOrderCount', 'inTransitTeu', 'asOf']) { for (const value of [null, undefined, '', -1, 'invalid']) assert.equal(validOperationalMetrics({ ...metrics(), [field]: value }), false) } assert.equal(validOperationalMetrics({ ...metrics(), pendingCustomsOrderCount: 1.5 }), false) assert.equal(validOperationalMetrics({ ...metrics(), unknownContainerTypeCount: 4 }), false) }) const fake = () => { const calls = [] return { calls, createdResources: {}, assert(_m, _n, _r, passed) { assert.equal(passed, true) }, apiSuccess(_m, _n, response) { return response.body.data }, async request(method, path) { calls.push({ method, path }); return { http: 200, body: { code: '200', data: path.includes('/operational-metrics') ? metrics() : { total: '9', records: [{}] } } } } } } test('默认编排实时首页三次只读查询,今日范围和启用客户筛选与页面一致', async () => { const context = fake(); await run(context) assert.equal(context.createdResources.dashboard.status, 'VERIFIED') assert.equal(context.calls.length, 3) assert.ok(context.calls.every(row => row.method === 'GET')) const query = new URL(context.calls[1].path, 'https://offline.invalid').searchParams assert.equal(query.get('createdFrom'), context.createdResources.dashboard.businessDate + 'T00:00:00.000') assert.equal(query.get('createdTo'), context.createdResources.dashboard.businessDate + 'T23:59:59.999') assert.equal(query.get('size'), '1') assert.ok(context.calls[2].path.endsWith('status=ACTIVE')) const entry = readFileSync(new URL('../admin-test-env-acceptance.mjs', import.meta.url), 'utf8') assert.match(entry, /const CONFIGURED_MODULES = \[[^\n]*'dashboard'/) assert.doesNotMatch(entry, /首页为静态演示数据/) }) test('非成功响应和缺失服务端总数不得被记为看板通过', async () => { for (const response of [{ http: 200, body: { code: 'S0500', data: metrics() } }, { http: 200, body: { code: '200', data: { records: [] } } }]) { const context = fake(); context.request = async () => response await assert.rejects(run(context)); assert.equal(context.createdResources.dashboard.status, 'CHECKING') } })