test(FN-000): slim dashboard default tests

This commit is contained in:
Aron Prins
2026-05-06 13:18:06 +02:00
parent f85b124125
commit eb1b3b6f5b
6 changed files with 63 additions and 10 deletions

View File

@@ -210,6 +210,7 @@ describe("Scoped @fusion/* packages publishing config", () => {
describe("Workspace bootstrap script contract", () => {
const rootPkg = loadRootPackageJson();
const dashboardPkg = loadPackageJson("dashboard");
it("makes root test changed-only while keeping explicit full-suite and CI-shard commands", () => {
expect(rootPkg.scripts?.test).toBe("node scripts/test-changed.mjs");
@@ -246,6 +247,13 @@ describe("Workspace bootstrap script contract", () => {
"pnpm --filter @fusion/dashboard build && pnpm --filter @fusion/mobile cap sync",
);
});
it("keeps dashboard's default test lane curated with explicit deep coverage", () => {
expect(dashboardPkg.scripts?.test).toContain("--project dashboard-app-quality");
expect(dashboardPkg.scripts?.test).toContain("--project dashboard-api-quality");
expect(dashboardPkg.scripts?.["test:deep"]).toContain("--project dashboard-app");
expect(dashboardPkg.scripts?.["test:deep"]).toContain("--project dashboard-api");
});
});
describe("Workflow YAML validity", () => {

View File

@@ -38,19 +38,22 @@ const fsPromises = requireFromHere("node:fs/promises") as FsPromisesModule;
const childProcess = requireFromHere("node:child_process") as ChildProcessModule;
const { mkdtempSync, mkdirSync, rmSync, realpathSync, existsSync } = fs;
type EmitWarningArgs = Parameters<typeof process.emitWarning>;
type EmitWarningRestArgs = EmitWarningArgs extends [string | Error, ...infer Rest] ? Rest : never;
function installWarningFilter(): void {
const warningState = globalThis as typeof globalThis & { __fusionTestWarningFilterInstalled?: boolean };
if (warningState.__fusionTestWarningFilterInstalled) return;
warningState.__fusionTestWarningFilterInstalled = true;
const originalEmitWarning = process.emitWarning.bind(process);
process.emitWarning = ((warning: string | Error, ...args: unknown[]) => {
process.emitWarning = ((warning: string | Error, ...args: EmitWarningRestArgs) => {
const warningText = warning instanceof Error ? warning.message : warning;
const warningType = typeof args[0] === "string" ? args[0] : undefined;
if (warningType === "ExperimentalWarning" && warningText.includes("SQLite is an experimental feature")) {
return;
}
return originalEmitWarning(warning as string, ...(args as Parameters<typeof process.emitWarning> extends [any, ...infer Rest] ? Rest : never));
return originalEmitWarning(warning, ...args);
}) as typeof process.emitWarning;
}

View File

@@ -36,11 +36,12 @@
"build:client": "vite build",
"dev": "pnpm build && pnpm typecheck && pnpm dev:serve",
"dev:serve": "vite dev",
"test": "vitest run --silent=passed-only --reporter=dot --exclude '**/build-output.test.ts'",
"test": "vitest run --project dashboard-app-quality --project dashboard-api-quality --silent=passed-only --reporter=dot --exclude '**/build-output.test.ts'",
"test:app": "vitest run --project dashboard-app --silent=passed-only --reporter=dot --exclude '**/build-output.test.ts'",
"test:api": "vitest run --project dashboard-api --silent=passed-only --reporter=dot",
"test:deep": "vitest run --project dashboard-app --project dashboard-api --silent=passed-only --reporter=dot --exclude '**/build-output.test.ts'",
"test:browser-smoke": "node scripts/browser-layout-smoke.mjs",
"test:build": "vitest run --silent=passed-only --reporter=dot app/__tests__/build-output.test.ts",
"test:build": "vitest run --project dashboard-app --silent=passed-only --reporter=dot app/__tests__/build-output.test.ts",
"typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.app.json"
},
"dependencies": {

View File

@@ -5,6 +5,26 @@ import { computeMaxWorkers } from "../core/src/__test-utils__/vitest-workers";
const maxWorkers = computeMaxWorkers({ defaultCap: 3 });
const qualityAppTests = [
// Top-level API-client, mobile layout, styling, auth, and shell regressions.
"app/__tests__/*.test.{ts,tsx}",
"app/api/**/*.test.ts",
// Representative workflow/component coverage. Exhaustive modal/view suites
// stay available in the full `dashboard-app` project.
"app/components/__tests__/{ActiveAgentsPanel,AgentMentionPopup,AgentMetricsBar,AgentReflectionsTab,AgentTokenStatsPanel,AuthTokenRecoveryDialog,Board,Column,ConfirmDialog,ConversationHistory,DashboardLoader,DirectoryPicker,ErrorBoundary,ExecutorStatusBar,FileBrowser,FileEditor,InlineCreateCard,LoginInstructions,MessageComposer,MobileNavBar,NewTaskModal,NodeCard,NodeHealthDot,NodeStatusIndicator,ProjectCard,ProjectSelector,ProviderIcon,QuickChatFAB,TaskCard,TaskChangesTab,TaskComments,TaskDocumentsTab,TaskForm,ThemeSelectorSwatchContract,WorkflowResultsTab}.test.tsx",
// Hooks and utilities are fast, user-visible state/formatting behavior.
"app/context/**/*.test.tsx",
"app/hooks/__tests__/{useAgents,useAgentLogs,useAppSettings,useAuthOnboarding,useConfirm,useCurrentProject,useNodes,useNodeSettingsSync,useProjects,useQuickChat,useTasks,useTerminalSessions,useTheme,useToast,useUsageData,useViewState}.test.{ts,tsx}",
"app/utils/**/*.test.{ts,tsx}",
];
const qualityApiTests = [
// Critical HTTP/server behavior: auth, task/project/settings mutation,
// git/GitHub, agents, nodes, chat/files, realtime, and isolation guards.
"src/__tests__/{api-error,auth-middleware,auth-middleware-integration,chat-attachment-routes,chat-routes,file-service,github,github-webhooks,initialize,planning-flow-diagnostics-guardrail,project-routes,project-store-resolver,remote-access-routes,remote-auth,routes-agent-budget,routes-agent-keys,routes-agent-permissions,routes-agent-ratings,routes-agent-runs,routes-agent-soul-memory,routes-agents,routes-automation,routes-git,routes-github,routes-nodes,routes-settings,routes-tasks,server,server-static-assets,server-webhook,server.events,setup-routes,sse,sse-buffer,test-isolation-guard,update-check-route,websocket}.test.ts",
"src/routes/__tests__/{custom-provider-routes,custom-providers,register-docker-node-routes}.test.ts",
];
export default defineConfig({
plugins: [react()],
resolve: {
@@ -54,6 +74,24 @@ export default defineConfig({
testTimeout: 15_000,
hookTimeout: 15_000,
projects: [
{
extends: true,
test: {
name: "dashboard-app-quality",
environment: "jsdom",
include: qualityAppTests,
css: { include: [/app\//] },
},
},
{
extends: true,
test: {
name: "dashboard-api-quality",
environment: "node",
include: qualityApiTests,
css: { include: [] },
},
},
{
extends: true,
test: {