๐งช Testing Guide โ
๐ Overview โ
| Metric | Value |
|---|---|
| Test Framework | Vitest |
| Environment | happy-dom |
| Total Tests | 140 |
| Test Files | 9 |
| Coverage | 91% |
๐ Quick Start โ
bash
# Run tests in watch mode
npm run test
# Run tests once
npm run test:run
# Run with coverage
npm run test:coverage๐ Test Structure โ
__tests__/
โโโ helpers/
โ โโโ setup.ts # Mock factories and utilities
โโโ navigationRegistry.test.ts # Registry CRUD (12 tests)
โโโ navigationOutposts.test.ts # Patrol logic (19 tests)
โโโ navigationCitadel.test.ts # Public API (29 tests)
โโโ timeout.test.ts # Timeout handling (5 tests)
โโโ lazy.test.ts # Lazy loading (12 tests)
โโโ integration.test.ts # Full navigation flows (13 tests)
โโโ devtools-settings.test.ts # DevTools settings (19 tests)
โโโ devtools-inspector.test.ts # DevTools inspector (19 tests)
โโโ debugHandler.test.ts # Debug handler (12 tests)๐ง Test Helpers โ
Located in __tests__/helpers/setup.ts:
| Helper | Description |
|---|---|
createMockRouter(routes?) | Creates vue-router with memory history |
createMockLogger() | Logger that captures calls for assertions |
createAllowHandler() | Returns 'allow' verdict |
createBlockHandler() | Returns 'block' verdict |
createRedirectHandler(to) | Returns redirect location |
createDelayedHandler(ms, outcome) | Async handler with delay (for timeout tests) |
createErrorHandler(message) | Throws error with message |
createRegisteredOutpost(options) | Creates RegisteredNavigationOutpost for tests |
Example Usage โ
typescript
import { createMockRouter, createMockLogger, createAllowHandler } from './helpers/setup';
const router = createMockRouter();
const logger = createMockLogger();
// After test, check logger calls
expect(logger.calls.some((c) => c.level === 'warn')).toBe(true);โ๏ธ Writing New Tests โ
Choose the Right File โ
| If testing... | Add to... |
|---|---|
| Registry functions | navigationRegistry.test.ts |
| Outcome/patrol logic | navigationOutposts.test.ts |
| Public API | navigationCitadel.test.ts |
| Timeout behavior | timeout.test.ts |
| Lazy loading | lazy.test.ts |
| Full navigation flows | integration.test.ts |
| DevTools settings | devtools-settings.test.ts |
| DevTools inspector | devtools-inspector.test.ts |
| Debug handler/logger | debugHandler.test.ts |
Use Existing Helpers โ
typescript
import { describe, it, expect, beforeEach } from 'vitest';
import { createMockRouter, createMockLogger } from './helpers/setup';
describe('myFeature', () => {
let router: ReturnType<typeof createMockRouter>;
let logger: ReturnType<typeof createMockLogger>;
beforeEach(async () => {
router = createMockRouter();
logger = createMockLogger();
await router.push('/');
await router.isReady();
});
it('does something', () => {
// test code
});
});Test Patterns โ
Testing navigation blocks:
typescript
await router.push('/dashboard').catch(() => {});
expect(router.currentRoute.value.name).toBe('home'); // stayed on homeTesting redirects (avoid infinite loops):
typescript
handler: ({ to }) => {
if (to.name !== 'login') return { name: 'login' };
return 'allow';
};Testing logger calls:
typescript
expect(logger.calls.some((c) => c.level === 'warn' && c.args[0].includes('timed out'))).toBe(true);๐ Test Cases โ
See the complete Test Cases Reference for a full list of all 140 tests across 9 test files.
๐ Coverage โ
Run coverage report:
bash
npm run test:coverageCoverage includes all files in src/ except index.ts (re-exports only).