Files
govoplan-search/webui/scripts/test-interface-pattern.mjs
T

28 lines
1.9 KiB
JavaScript

import assert from "node:assert/strict";
import fs from "node:fs";
const page = fs.readFileSync("src/features/search/SearchPage.tsx", "utf8");
const overlay = fs.readFileSync("src/components/GlobalSearch.tsx", "utf8");
const admin = fs.readFileSync("src/features/search/SearchAdminPanel.tsx", "utf8");
const styles = fs.readFileSync("src/styles/search.css", "utf8");
for (const source of [page, overlay]) {
assert.ok(source.includes("DocumentationHelpLink"), "Search surfaces expose configured-system help");
assert.ok(source.includes("DismissibleAlert"), "Search failures use the shared alert contract");
assert.ok(!source.includes("window.alert("), "Search must not use browser alerts");
assert.ok(!/<(div|span|li|tr)\b[^>]*\bonClick\s*=/.test(source), "Search uses semantic interactive elements");
}
assert.ok(page.includes("PageScrollViewport"), "The full search route owns bounded result scrolling");
assert.ok(overlay.includes("<Dialog"), "The title-bar search uses the shared focus-contained dialog");
assert.ok(overlay.includes('role="listbox"'), "Overlay results expose listbox keyboard semantics");
assert.ok(overlay.includes('aria-keyshortcuts="F3 Control+K Meta+K"'), "Search announces its keyboard shortcuts");
assert.ok(styles.includes("@media (max-width: 900px)"), "Search retains a narrow-viewport layout");
assert.ok(admin.includes("AdminPageLayout"), "Search operations use the shared administration layout");
assert.ok(admin.includes("DataGrid"), "Search source coverage uses the shared data grid");
assert.ok(admin.includes("DismissibleAlert"), "Search operator failures use the shared alert contract");
assert.ok(admin.includes("DocumentationHelpLink"), "Search operators can open contextual documentation");
assert.ok(!admin.includes("window.alert("), "Search administration must not use browser alerts");
console.log("Search interface pattern contract passed.");