βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β SYNAPSE TESTING STACK β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Layer 3: End-to-End Tests (Playwright) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β’ Full user workflows in real browser β
β β’ Tests: smoke.spec.ts, workspace.spec.ts, demos.spec.ts β
β β’ Coverage: Complete user journeys, multi-page flows β
β β
β User β Browser β Full App β Chrome AI β Validation β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Layer 2: Integration Tests (Vitest + RTL) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β’ Component + Hook interactions β
β β’ Tests: component-integration.test.tsx β
β β’ Coverage: State management, context providers, API calls β
β β
β Component β Context β Hooks β State β Assertions β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Layer 1: Unit Tests (Vitest + RTL + MSW) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β’ Individual functions, components, utilities β
β β’ Tests: 40+ test files across codebase β
β β’ Coverage: Pure logic, rendering, error handling β
β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β Components β β Libraries β β Utilities β β
β β *.test.tsx β β *.test.ts β β *.test.ts β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β SUPPORTING INFRASTRUCTURE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Test Utilities β Fixtures & Mocks β Configuration β
β β’ Custom render() β β’ Test data β β’ vitest.configβ
β β’ MSW handlers β β’ Mock content β β’ playwright β
β β’ Test constants β β’ Sample metadata β β’ tsconfig.testβ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β SYNAPSE APPLICATION β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Chrome AI Integration (Browser API) β β
β β β browserCompatibility.test.ts β β
β β β RewriterError.test.ts, errorGuards.test.ts β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Content Processing Layer β β
β β β content-fetcher.test.ts (URL fetching) β β
β β β readability-parser.test.ts (HTML parsing) β β
β β β index.test.ts (extraction orchestration) β β
β β β fileProcessor.test.ts (file handling) β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β UI Components β β
β β β URLInput.test.tsx (user input) β β
β β β ExtractedContent.test.tsx (content display) β β
β β β ComparisonView.test.tsx (before/after) β β
β β β FormatSection.test.tsx (format selection) β β
β β β 6+ UI primitive components β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Configuration & Constants β β
β β β formats.test.ts (output formats) β β
β β β writingTools.test.ts (AI tools config) β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Legend: β = Comprehensive test coverage
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β npm test (Unit Tests) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββ
β 1. Vitest Setup (vitest.setup.ts)β
β β’ Load @testing-library/jest-domβ
β β’ Configure test environment β
βββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββ
β 2. Test Discovery β
β β’ Find **/*.test.{ts,tsx} β
β β’ Load 42 test files β
βββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββ
β 3. Test Execution β
β β’ Run 1,568 tests β
β β’ MSW mocks API calls β
β β’ Custom render() for React β
βββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββ
β 4. Results & Coverage β
β β’ Pass/Fail summary β
β β’ Coverage report (optional) β
βββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β npm run test:e2e (E2E Tests) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββ
β 1. Playwright Launch β
β β’ Start Chromium browser β
β β’ Navigate to localhost:5173 β
βββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββ
β 2. Run User Scenarios β
β β’ smoke.spec.ts (critical) β
β β’ workspace.spec.ts (AI flow) β
β β’ demos.spec.ts (all tools) β
β β’ preferences.spec.ts (config)β
βββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββ
β 3. Assertions & Validation β
β β’ Check DOM elements β
β β’ Verify user interactions β
β β’ Validate page navigation β
βββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββ
β 4. Test Report β
β β’ Pass/Fail with screenshots β
β β’ Trace files for debugging β
βββββββββββββββββββββββββββββββββββββ
src/test-utils/
βββ render.tsx Custom render with providers
β βββ Usage: render(<Component />)
β βββ Provides: QueryClient, Router context
β
βββ vitest.setup.ts Test environment configuration
β βββ Loads: @testing-library/jest-dom matchers
β βββ Configures: Global test settings
β
βββ msw-handlers.ts API mocking handlers
β βββ Mocks: fetch, Chrome AI APIs
β βββ Usage: server.use(...handlers)
β
βββ test-constants.ts Shared test data
β βββ Exports: URLs, configurations, defaults
β
βββ fixtures/
βββ content.ts Mock content data
βββ metadata.ts Mock metadata
βββ errors.ts Mock error responses
# Unit tests (fast)
npm test # Run all unit tests
npm run test:watch # Watch mode
npm run test:ui # Interactive UI
npm run test:coverage # With coverage report
# E2E tests (slower, requires dev server)
npm run dev # Terminal 1: Start dev server
npm run test:e2e # Terminal 2: Run E2E tests
npm run test:e2e:ui # Interactive E2E UIUnit Test Template:
import { describe, it, expect } from 'vitest'
import { render, screen } from '@/test-utils/render'
describe('ComponentName', () => {
it('should render correctly', () => {
render(<ComponentName />)
expect(screen.getByText('Expected Text')).toBeInTheDocument()
})
})E2E Test Template:
import { test, expect } from '@playwright/test'
test.describe('Feature Name', () => {
test('should complete user flow', async ({ page }) => {
await page.goto('/')
await page.getByRole('button', { name: 'Submit' }).click()
await expect(page.getByText('Success')).toBeVisible()
})
})- Co-location: Tests live next to the code they test
- Naming:
*.test.tsfor unit,*.spec.tsfor E2E - Grouping: Use
describe()blocks for logical grouping - Isolation: Each test should be independent
- AAA Pattern: Arrange, Act, Assert
| Category | Target | Current | Status |
|---|---|---|---|
| Chrome AI APIs | 90% | 95% | β |
| Content Extraction | 85% | 92% | β |
| UI Components | 80% | 88% | β |
| Error Handling | 100% | 100% | β |
| Critical User Flows | 100% | 100% | β |
# Run specific test file
npm test -- src/path/to/file.test.ts
# Run tests matching pattern
npm test -- --grep "pattern"
# Debug with UI
npm run test:ui# Run specific test file
npm run test:e2e -- tests/smoke.spec.ts
# Debug mode (headed browser)
npm run test:e2e -- --debug
# View test traces
npx playwright show-trace trace.zip