67 lines
2.9 KiB
TypeScript
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");
|
|
}
|