# 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/)