51 lines
1.7 KiB
TypeScript
51 lines
1.7 KiB
TypeScript
import fs from "node:fs";
|
|
import path from "node:path";
|
|
|
|
function assert(condition: unknown, message: string) {
|
|
if (!condition) throw new Error(message);
|
|
}
|
|
|
|
export function runTests() {
|
|
const projectRoot = process.cwd();
|
|
const workspacePath = path.join(
|
|
projectRoot,
|
|
"components",
|
|
"dashboard",
|
|
"scan-terminal",
|
|
"use-ai-pinned-city-workspace.ts",
|
|
);
|
|
const storePath = path.join(projectRoot, "hooks", "useDashboardStore.tsx");
|
|
const cardPath = path.join(
|
|
projectRoot,
|
|
"components",
|
|
"dashboard",
|
|
"scan-terminal",
|
|
"AiPinnedCityCard.tsx",
|
|
);
|
|
const source = fs.readFileSync(workspacePath, "utf8");
|
|
const storeSource = fs.readFileSync(storePath, "utf8");
|
|
const cardSource = fs.readFileSync(cardPath, "utf8");
|
|
|
|
assert(
|
|
!source.includes("waitForDeepAnalysisQueue"),
|
|
"decision-card deep analysis hydration must not add an artificial queue delay",
|
|
);
|
|
assert(
|
|
/store\.ensureCityDetail\(\s*nextCity,\s*false,\s*"full",?\s*\)/.test(source),
|
|
"automatic deep analysis hydration should use cache-friendly full detail requests",
|
|
);
|
|
assert(
|
|
storeSource.includes("row.model_cluster_sources") &&
|
|
storeSource.includes("deb_prediction") &&
|
|
storeSource.includes("multi_model: multiModel"),
|
|
"decision-card preload must hydrate model cluster and DEB data from the scan row",
|
|
);
|
|
assert(
|
|
cardSource.includes("getRowModelEntries") &&
|
|
cardSource.includes("row?.ai_predicted_max") &&
|
|
cardSource.includes("row?.cluster_median") &&
|
|
cardSource.includes("detailModelEntries.length ? detailModelEntries : getRowModelEntries(row)"),
|
|
"decision card should render model support and AI predicted max from the row before full detail/AI stream arrives",
|
|
);
|
|
}
|