Skip to content

๐Ÿงช Testing Guide โ€‹

๐Ÿ“‹ Overview โ€‹

MetricValue
Test FrameworkVitest
Environmenthappy-dom
Total Tests140
Test Files9
Coverage91%

๐Ÿš€ 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:

HelperDescription
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 functionsnavigationRegistry.test.ts
Outcome/patrol logicnavigationOutposts.test.ts
Public APInavigationCitadel.test.ts
Timeout behaviortimeout.test.ts
Lazy loadinglazy.test.ts
Full navigation flowsintegration.test.ts
DevTools settingsdevtools-settings.test.ts
DevTools inspectordevtools-inspector.test.ts
Debug handler/loggerdebugHandler.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 home

Testing 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:coverage

Coverage includes all files in src/ except index.ts (re-exports only).

Released under the MIT License.