Files
fusion/packages/dashboard/app/__tests__/lazy-loaded-views-docs.test.ts
Fusion 7e8541b92d feat(FN-3863): add stash recovery dashboard surface and API routes
Merged FN-3863 brings stash recovery to the dashboard via three coordinated steps: engine-side orphan stash surfacing API in `merger.ts`, dashboard API routes for stash recovery data, and a new `StashRecoveryView` component with mobile support and inspect-diff row actions, integrated into the header

Fusion-Task-Id: FN-3863
2026-05-09 19:49:02 -07:00

85 lines
2.6 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { readFileSync } from "node:fs";
import { resolve } from "node:path";
const EXPECTED_DOCUMENTED_VIEWS = new Set([
"AgentsView",
"NodesView",
"ChatView",
"MemoryView",
"DevServerView",
"InsightsView",
"DocumentsView",
"SkillsView",
"ResearchView",
"EvalsView",
"TodoView",
"StashRecoveryView",
"SetupWizardModal",
"PluginManager",
"PiExtensionsManager",
"AgentDetailView",
]);
const EXPECTED_APP_LEVEL_VIEWS = new Set([
"AgentsView",
"DocumentsView",
"InsightsView",
"ResearchView",
"EvalsView",
"NodesView",
"ChatView",
"SkillsView",
"MemoryView",
"DevServerView",
"TodoView",
"StashRecoveryView",
]);
function extractLazyLoadedSection(agentsDoc: string): string {
const match = agentsDoc.match(/### Lazy-Loaded Heavy Views[\s\S]*?(?=\n### |\n---|$)/);
if (!match) {
throw new Error("Lazy-Loaded Heavy Views section not found in AGENTS.md");
}
return match[0];
}
function extractBacktickedNamesFromBullets(section: string): string[] {
return section
.split("\n")
.filter((line) => line.trim().startsWith("- "))
.flatMap((line) => [...line.matchAll(/`([^`]+)`/g)].map((m) => m[1]));
}
function extractAppLazyViews(appSource: string): Set<string> {
const matches = [...appSource.matchAll(/const\s+(\w+)\s*=\s*lazy\(/g)].map((m) => m[1]);
return new Set(matches.map((name) => (name === "_TodoView" ? "TodoView" : name)));
}
describe("AGENTS lazy-loaded views inventory", () => {
it("documents the App-level lazy views accurately and keeps the curated 15-view list in sync", () => {
const agentsDoc = readFileSync(resolve(__dirname, "../../../../AGENTS.md"), "utf-8");
const appSource = readFileSync(resolve(__dirname, "../App.tsx"), "utf-8");
const section = extractLazyLoadedSection(agentsDoc);
const countMatch = section.match(/These\s+(\d+)\s+views\s+are lazy-loaded/);
expect(countMatch).toBeTruthy();
expect(Number(countMatch?.[1])).toBe(16);
const documentedViews = extractBacktickedNamesFromBullets(section);
expect(new Set(documentedViews)).toEqual(EXPECTED_DOCUMENTED_VIEWS);
expect(documentedViews).toHaveLength(16);
expect(section).toContain("`ResearchView`");
expect(section).toContain("`TodoView`");
expect((section.match(/`AgentDetailView`/g) ?? []).length).toBe(1);
const appLevelViews = extractAppLazyViews(appSource);
expect(appLevelViews).toEqual(EXPECTED_APP_LEVEL_VIEWS);
for (const view of appLevelViews) {
expect(EXPECTED_DOCUMENTED_VIEWS.has(view)).toBe(true);
}
});
});