Files
PolyWeather/frontend/components/dashboard/scan-terminal/__tests__/advancedWeatherVariables.test.ts
2026-06-06 19:17:24 +08:00

67 lines
2.9 KiB
TypeScript

import * as Chart from "@/components/dashboard/scan-terminal/LiveTemperatureThresholdChart";
function assert(condition: unknown, message: string): asserts condition {
if (!condition) throw new Error(message);
}
export function runTests() {
const buildItems = (Chart as any).__buildAdvancedWeatherVariableItemsForTest;
assert(typeof buildItems === "function", "advanced weather variable item builder should be exported for tests");
const buildCadence = (Chart as any).__buildSourceCadenceSummaryForTest;
assert(typeof buildCadence === "function", "source cadence summary builder should be exported for tests");
const items = buildItems(
{
metar_context: {
airport_wind_speed_kt: 7,
airport_wind_dir: 220,
airport_humidity: 68,
},
},
{
current: { dewpoint: 18.2 },
airportPrimary: {
wind_speed_kt: 9,
wind_dir: 240,
humidity: 64,
pressure_hpa: 1009.4,
source_label: "MADIS HFMETAR",
},
},
false,
);
assert(items.length === 5, `expected five advanced variable items, got ${items.length}`);
assert(items.some((item: any) => item.key === "wind_dir" && item.value === "240°"), "wind direction should prefer airport-primary detail data");
assert(items.some((item: any) => item.key === "wind_speed" && item.value === "9 kt"), "wind speed should include kt units");
assert(items.some((item: any) => item.key === "dewpoint" && item.value === "18.2°C"), "dew point should render from current conditions");
assert(items.some((item: any) => item.key === "humidity" && item.value === "64%"), "humidity should render as a percentage");
assert(items.some((item: any) => item.key === "pressure" && item.value === "1009.4 hPa"), "pressure should render as hPa");
const emptyItems = buildItems({}, {}, true);
assert(emptyItems.length === 0, "advanced variables should stay hidden when no source fields exist");
const backendCadence = buildCadence(
{},
{
airportPrimary: {
source_code: "custom_source",
source_label: "Custom Feed",
freshness: { native_update_interval_sec: 420, freshness_status: "fresh" },
},
},
true,
);
assert(backendCadence?.cadence === "420s", "source cadence should prefer backend native_update_interval_sec");
assert(backendCadence?.label.includes("Custom Feed"), "source cadence should include the source label");
const amscCadence = buildCadence({}, { airportPrimary: { source: "amsc_awos" } }, false);
assert(amscCadence?.cadence === "180s", "AMSC AWOS should fall back to 180s source cadence");
const amosCadence = buildCadence({}, { airportPrimary: { source_label: "AMOS runway" } }, false);
assert(amosCadence?.cadence === "60s", "AMOS should fall back to 60s source cadence");
const madisCadence = buildCadence({}, { airportPrimary: { source_code: "madis_hfmetar" } }, false);
assert(madisCadence?.cadence === "300s", "MADIS should fall back to 300s source cadence");
}