# Testing Documentation
## Overview
The Infrastructure Dashboard has comprehensive test coverage including unit tests, integration tests, and end-to-end (E2E) tests.
## Test Structure
```
src/
├── components/
│ └── infrastructure/
│ └── __tests__/ # Component tests
├── lib/
│ ├── hooks/
│ │ └── __tests__/ # Hook tests
│ ├── services/
│ │ └── __tests__/ # Service tests
│ └── validation/
│ └── __tests__/ # Validation tests
└── test-utils.tsx # Test utilities
e2e/ # E2E tests
├── infrastructure-dashboard.spec.ts
└── ...
```
## Running Tests
### Unit and Integration Tests
```bash
# Run all tests
npm run test
# Run with UI
npm run test:ui
# Run with coverage
npm run test:coverage
# Watch mode
npm run test -- --watch
```
### E2E Tests
```bash
# Run E2E tests
npm run test:e2e
# Run with UI
npm run test:e2e:ui
# Run specific browser
npx playwright test --project=chromium
```
### All Tests
```bash
# Run all tests (unit + E2E)
npm run test:all
```
## Test Coverage
### Current Coverage Targets
- **Lines**: 90%
- **Functions**: 90%
- **Branches**: 85%
- **Statements**: 90%
### Viewing Coverage
After running `npm run test:coverage`, open `coverage/index.html` in your browser to view detailed coverage reports.
## Test Types
### Unit Tests
Test individual components, hooks, and services in isolation.
**Example:**
```typescript
import { describe, it, expect } from 'vitest'
import { render, screen } from '@testing-library/react'
import { EmptyState } from '../EmptyState'
describe('EmptyState', () => {
it('should render with title', () => {
render()
expect(screen.getByText('Test')).toBeInTheDocument()
})
})
```
### Integration Tests
Test component interactions and data flow.
**Example:**
```typescript
import { renderWithProviders } from '@/lib/test-utils'
import { ComplianceMapping } from '../ComplianceMapping'
it('should render and display data', async () => {
renderWithProviders()
await waitFor(() => {
expect(screen.getByText('Italy')).toBeInTheDocument()
})
})
```
### E2E Tests
Test complete user workflows in a real browser.
**Example:**
```typescript
import { test, expect } from '@playwright/test'
test('should navigate to topology page', async ({ page }) => {
await page.goto('/infrastructure/docs')
await page.getByRole('link', { name: /network topology/i }).click()
await expect(page).toHaveURL(/.*\/topology/)
})
```
## Test Utilities
### renderWithProviders
Custom render function that includes all necessary providers:
```typescript
import { renderWithProviders } from '@/lib/test-utils'
renderWithProviders()
```
### Mocking
#### Mock API Calls
```typescript
global.fetch = vi.fn().mockResolvedValue({
ok: true,
json: async () => mockData,
})
```
#### Mock Next.js Router
Already set up in `vitest.setup.ts`:
```typescript
vi.mock('next/navigation', () => ({
useRouter: () => ({
push: vi.fn(),
replace: vi.fn(),
}),
}))
```
## Writing Tests
### Component Tests
1. Test rendering
2. Test user interactions
3. Test state changes
4. Test edge cases
### Hook Tests
1. Test return values
2. Test side effects
3. Test error handling
4. Test loading states
### Service Tests
1. Test core functionality
2. Test edge cases
3. Test error handling
4. Test data transformations
### E2E Tests
1. Test critical user flows
2. Test navigation
3. Test form submissions
4. Test error scenarios
## Best Practices
1. **Arrange-Act-Assert**: Structure tests clearly
2. **Test Behavior**: Test what users see/do, not implementation
3. **Isolation**: Each test should be independent
4. **Descriptive Names**: Test names should describe what they test
5. **Coverage**: Aim for high coverage but focus on critical paths
6. **Maintainability**: Keep tests simple and readable
## Continuous Integration
Tests run automatically on:
- Pull requests
- Commits to main branch
- Scheduled runs
## Debugging Tests
### Unit Tests
```bash
# Run specific test file
npm run test -- src/components/infrastructure/__tests__/EmptyState.test.tsx
# Run with debug output
npm run test -- --reporter=verbose
```
### E2E Tests
```bash
# Run in headed mode
npx playwright test --headed
# Debug mode
npx playwright test --debug
# Show browser
npx playwright test --ui
```
## Troubleshooting
### Common Issues
1. **Tests timing out**: Increase timeout or check async operations
2. **Mock not working**: Ensure mocks are set up before imports
3. **Coverage not updating**: Clear cache and rerun
4. **E2E tests failing**: Check if dev server is running
## Resources
- [Vitest Documentation](https://vitest.dev/)
- [React Testing Library](https://testing-library.com/react)
- [Playwright Documentation](https://playwright.dev/)