Files
DashBoard/frontend/tests/portal-shell-wave-b-native-smoke.test.js

82 lines
2.5 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import { buildDynamicNavigationState } from '../src/portal-shell/navigationState.js';
import { buildLaunchHref } from '../src/portal-shell/routeQuery.js';
import { getRouteContract } from '../src/portal-shell/routeContracts.js';
const WAVE_B_NATIVE_CASES = Object.freeze([
{
route: '/job-query',
page: '設備維修查詢',
query: {
start_date: '2026-02-01',
end_date: '2026-02-11',
resource_ids: ['EQ-01', 'EQ-02'],
},
expectedParams: ['start_date=2026-02-01', 'end_date=2026-02-11', 'resource_ids=EQ-01', 'resource_ids=EQ-02'],
},
{
route: '/excel-query',
page: 'Excel 查詢工具',
query: {
mode: 'upload',
table_name: 'DWH.DW_MES_WIP',
search_column: 'LOT_ID',
},
expectedParams: ['mode=upload', 'table_name=DWH.DW_MES_WIP', 'search_column=LOT_ID'],
},
{
route: '/query-tool',
page: 'Query Tool',
query: {
input_type: 'lot_id',
values: ['GA23100020-A00-001'],
},
expectedParams: ['input_type=lot_id', 'values=GA23100020-A00-001'],
},
]);
test('Wave B routes use native mode after rewrite cutover', () => {
WAVE_B_NATIVE_CASES.forEach(({ route }) => {
const contract = getRouteContract(route);
assert.ok(contract, `missing contract for ${route}`);
assert.equal(contract.renderMode, 'native', `expected native mode for ${route}`);
assert.equal(contract.rollbackStrategy, 'fallback_to_legacy_route');
});
});
test('Wave B shell launch href keeps workflow query context', () => {
WAVE_B_NATIVE_CASES.forEach(({ route, query, expectedParams }) => {
const href = buildLaunchHref(route, query);
assert.ok(href.startsWith(route), `unexpected href path for ${route}: ${href}`);
expectedParams.forEach((token) => {
assert.ok(href.includes(token), `missing query token ${token} in ${href}`);
});
});
});
test('Wave B routes are registered as native targets from navigation payload', () => {
const state = buildDynamicNavigationState(
[
{
id: 'native-tools',
name: 'Native Tools',
order: 1,
pages: WAVE_B_NATIVE_CASES.map((entry, index) => ({
route: entry.route,
name: entry.page,
status: 'released',
order: index + 1,
})),
},
],
{ isAdmin: true },
);
assert.equal(state.dynamicRoutes.length, WAVE_B_NATIVE_CASES.length);
state.dynamicRoutes.forEach((entry) => {
assert.equal(entry.renderMode, 'native');
});
});