Files
AetherForge/server/web/src/App.test.tsx
AetherForge ea6f54ad03 Expand test coverage across server, agent, and web; fix bugs found during audit.
Adds hundreds of unit/integration/e2e tests, fixes WS bcrypt auth, config merge, fleet analytics, agent schedule/log tail, and documents stale PROBLEMS items. Updates PROBLEMS.md, README, and test scripts; ignores local spread-kits and coverage dirs.
2026-05-31 01:13:58 -07:00

72 lines
2.7 KiB
TypeScript

/**
* @vitest-environment happy-dom
*/
import type { ReactNode } from 'react';
import { describe, expect, it, vi } from 'vitest';
import { render, screen } from '@testing-library/react';
import { MemoryRouter, Routes, Route, Navigate } from 'react-router-dom';
import App, { PageFallback } from './App';
vi.mock('./context/WebSocketProvider', () => ({
WebSocketProvider: ({ children }: { children: ReactNode }) => <>{children}</>,
}));
vi.mock('./context/ForgeContext', () => ({
ForgeProvider: ({ children }: { children: ReactNode }) => <>{children}</>,
}));
vi.mock('./components/SessionGate', () => ({
default: ({ children }: { children: ReactNode }) => <>{children}</>,
}));
vi.mock('./components/Layout/Layout', () => ({
default: ({ children }: { children: ReactNode }) => <div data-testid="layout">{children}</div>,
}));
vi.mock('./pages/DashboardPage', () => ({ default: () => <div>Dashboard Page</div> }));
vi.mock('./pages/AgentsPage', () => ({ default: () => <div>Agents Page</div> }));
vi.mock('./pages/BuilderPage', () => ({ default: () => <div>Forge Page</div> }));
vi.mock('./pages/BuildManagerPage', () => ({ default: () => <div>Builds Page</div> }));
vi.mock('./pages/SettingsPage', () => ({ default: () => <div>Settings Page</div> }));
vi.mock('./pages/GuidePage', () => ({ default: () => <div>Guide Page</div> }));
vi.mock('./pages/CruciblePage', () => ({ default: () => <div>Crucible Page</div> }));
describe('PageFallback', () => {
it('shows loading copy', () => {
render(<PageFallback />);
expect(screen.getByText('Loading…')).toBeTruthy();
});
});
describe('App route config', () => {
it('redirects / to dashboard and /builder to forge', () => {
function RedirectProbe({ path }: { path: string }) {
return (
<MemoryRouter initialEntries={[path]}>
<Routes>
<Route path="/" element={<Navigate to="/dashboard" replace />} />
<Route path="/dashboard" element={<div>Dashboard Page</div>} />
<Route path="/builder" element={<Navigate to="/forge" replace />} />
<Route path="/forge" element={<div>Forge Page</div>} />
</Routes>
</MemoryRouter>
);
}
const { unmount: u1 } = render(<RedirectProbe path="/" />);
expect(screen.getByText('Dashboard Page')).toBeTruthy();
u1();
render(<RedirectProbe path="/builder" />);
expect(screen.getByText('Forge Page')).toBeTruthy();
});
it('renders crucible route via App shell', async () => {
render(
<MemoryRouter initialEntries={['/crucible']}>
<App />
</MemoryRouter>
);
expect(await screen.findByText('Crucible Page')).toBeTruthy();
expect(screen.getByTestId('layout')).toBeTruthy();
});
});