67 lines
4.3 KiB
JavaScript
67 lines
4.3 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import { readFileSync } from "node:fs";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
function read(relativePath) {
|
|
return readFileSync(fileURLToPath(new URL(relativePath, import.meta.url)), "utf8");
|
|
}
|
|
|
|
const connector = read("../src/features/files/FileConnectorSettingsPanel.tsx");
|
|
const integrity = read("../src/features/files/FileIntegrityPanel.tsx");
|
|
const filesApi = read("../src/api/files.ts");
|
|
const filesPage = read("../src/features/files/FilesPage.tsx");
|
|
const moduleSource = read("../src/module.ts");
|
|
const styles = read("../src/styles/file-manager.css");
|
|
const migration = read("../../docs/INTERFACE_PATTERN_MIGRATION.md");
|
|
|
|
assert.match(connector, /ActionBlockerHint,[\s\S]*AdvancedOptionsPanel,[\s\S]*DocumentationHelpLink/);
|
|
assert.match(connector, /ConnectionTree,[\s\S]*ConfirmDialog,[\s\S]*Dialog,[\s\S]*LoadingFrame/);
|
|
assert.match(connector, /topicId: "files\.governed-connectors-and-provenance"/);
|
|
assert.match(connector, /documentation=\{CONNECTOR_DOCUMENTATION\}/);
|
|
assert.match(connector, /disabledReason=\{profileSaveDisabledReason\}/);
|
|
assert.match(connector, /disabledReason=\{credentialSaveDisabledReason\}/);
|
|
assert.match(connector, /disabledReason: mutationBlocker/);
|
|
assert.match(connector, /<AdvancedOptionsPanel title="Connection metadata JSON"/);
|
|
assert.match(connector, /<AdvancedOptionsPanel title="Credential metadata JSON"/);
|
|
assert.doesNotMatch(connector, /window\.(?:alert|confirm)\(/);
|
|
|
|
assert.match(integrity, /File integrity/);
|
|
assert.match(filesApi, /expected_revision/);
|
|
assert.match(integrity, /cleanupFileIntegrityFinding\(settings, finding, true\)/);
|
|
assert.match(integrity, /<ConfirmDialog[\s\S]*Delete unreferenced storage object/);
|
|
assert.match(integrity, /files\.reference\.integrity-recovery-and-fail-closed-transports/);
|
|
assert.match(moduleSource, /files\.admin\.tenant-integrity/);
|
|
assert.doesNotMatch(integrity, /window\.(?:alert|confirm)\(/);
|
|
|
|
assert.match(filesPage, /DocumentationHelpLink/);
|
|
assert.match(filesPage, /topicId: "files\.workflow\.organize-managed-files"/);
|
|
assert.match(filesPage, /disabledReason=\{uploadBlocker\}/);
|
|
assert.match(filesPage, /disabledReason=\{deleteBlocker\}/);
|
|
assert.match(filesPage, /<ConfirmDialog[\s\S]*tone="danger"/);
|
|
assert.match(filesPage, /<WorkspaceFrame as="main" height="viewport" surface="plain"/);
|
|
assert.match(filesPage, /const toolbar = <WorkspaceActionBar\s+scope="workspace"\s+variant="collection"\s+refreshable/);
|
|
assert.match(filesPage, /\{toolbar\}[\s\S]*className=\{`file-manager-shell/);
|
|
assert.match(filesPage, /const selectionToolbar = <WorkspaceActionBar\s+scope="detail-pane"/);
|
|
assert.match(filesPage, /<Dialog\s+open=\{toolsPanel !== null\}/);
|
|
assert.match(filesPage, /destructiveActions=\{<Button variant="danger"/);
|
|
const reload = filesPage.slice(filesPage.indexOf(" async function reloadCurrentView()"), filesPage.indexOf(" function applyManagedSpaceDelta"));
|
|
for (const readOperation of ["listManagedFileSnapshot", "resolveFilePatterns", "listFilesByProperties", "browseFileConnectorProfile"]) assert.ok(reload.includes(readOperation));
|
|
assert.doesNotMatch(reload, /syncConnector|importFile|uploadFile|deleteFile|resetTransientState|setCurrentFolder|clearSelection|setSearchActive/);
|
|
assert.match(reload, /if \(!isCurrent\(\)\) return;/);
|
|
assert.doesNotMatch(reload, /setBusy\(/, "manual reload owns only its own busy state");
|
|
assert.doesNotMatch(filesPage, /window\.(?:alert|confirm)\(/);
|
|
|
|
assert.doesNotMatch(`${connector}\n${integrity}\n${filesPage}\n${moduleSource}`, /@govoplan\/(?:campaign|mail|docs)-webui|govoplan_(?:campaign|mail|docs)/);
|
|
assert.match(moduleSource, /"files\.connectors"/);
|
|
assert.match(moduleSource, /"files\.fileExplorer"/);
|
|
assert.match(styles, /@media \(max-width: 1100px\)[\s\S]*\.files-page \.file-manager-shell[\s\S]*grid-template-columns: 1fr/);
|
|
assert.match(styles, /@media \(max-width: 760px\)[\s\S]*\.file-connector-profile-row[\s\S]*grid-template-columns: 1fr/);
|
|
|
|
for (const archetype of ["Directory/explorer", "Adaptive create/edit", "Effective-policy editor", "Dashboard widget"]) {
|
|
assert.match(migration, new RegExp(archetype.replace("/", "\\/")));
|
|
}
|
|
assert.match(migration, /Shared `Dialog` owns focus entry, Escape handling and focus return/);
|
|
assert.match(migration, /Secret values are[\s\S]*never returned for rendering/);
|
|
|
|
console.log("Files surfaces satisfy the recorded interface pattern-language contract.");
|