## 1. Backend Unit Tests ### 1.1 Create Backend Test Project - [ ] 1.1.1 Create new .NET test project `backend.Tests/` with `dotnet new xunit` - [ ] 1.1.2 Add project reference from `backend.Tests` to main `backend` project - [ ] 1.1.3 Add test dependencies: `Moq` or `NSubstitute` for mocking, `FluentAssertions` for assertions - [ ] 1.1.4 Configure test project settings in `backend.Tests.csproj` - [ ] 1.1.5 Add `.gitignore` entries for test artifacts (bin, obj, coverage reports) ### 1.2 Create Test Utilities - [ ] 1.2.1 Create `TestDataFactory` class for generating mock entities - [ ] 1.2.2 Create `MockHttpContext` utility for simulating HTTP requests - [ ] 1.2.3 Create `TestUserClaims` utility for mocking authenticated users - [ ] 1.2.4 Add shared test fixtures in `SharedTestCollection` or base test class ### 1.3 Add Sample Controller Tests - [ ] 1.3.1 Identify existing controllers in `backend/Controllers/` - [ ] 1.3.2 Create first controller test file (e.g., `AuthControllerTests.cs`) - [ ] 1.3.3 Write tests for controller action with mocked service - [ ] 1.3.4 Write tests for controller input validation - [ ] 1.3.5 Verify all tests pass with `dotnet test` ### 1.4 Add Sample Service Tests - [ ] 1.4.1 Identify existing services in `backend/Services/` - [ ] 1.4.2 Create first service test file (e.g., `UserServiceTests.cs`) - [ ] 1.4.3 Write tests for service method with mocked repository - [ ] 1.4.4 Write tests for service business logic scenarios - [ ] 1.4.5 Verify all tests pass with `dotnet test` ## 2. Frontend Unit Tests ### 2.1 Configure Jest for Next.js - [ ] 2.1.1 Install Jest and related dependencies: `jest`, `@testing-library/jest-dom`, `ts-jest`, `@types/jest` - [ ] 2.1.2 Create `jest.config.ts` with Next.js and TypeScript configuration - [ ] 2.1.3 Add `jest.setup.ts` for test environment setup - [ ] 2.1.4 Update `package.json` with test scripts - [ ] 2.1.5 Configure TypeScript paths if needed in `tsconfig.json` ### 2.2 Configure React Testing Library - [ ] 2.2.1 Install RTL dependencies: `@testing-library/react`, `@testing-library/user-event`, `@testing-library/dom` - [ ] 2.2.2 Create `test-utils.tsx` with custom render function and providers - [ ] 2.2.3 Add Next.js router mock in test utilities - [ ] 2.2.4 Configure automatic cleanup in `jest.setup.ts` ### 2.3 Add Sample Component Tests - [ ] 2.3.1 Create first component test file (e.g., `Button.test.tsx`) - [ ] 2.3.2 Write test for component rendering - [ ] 2.3.3 Write test for user interactions (click, input, etc.) - [ ] 2.3.4 Write test for component props and state - [ ] 2.3.5 Verify all tests pass with `npm test` ### 2.4 Add Sample Hook Tests - [ ] 2.4.1 Create first hook test file (e.g., `useAuth.test.ts`) - [ ] 2.4.2 Write test using `renderHook` from `@testing-library/react` - [ ] 2.4.3 Write test for async hook operations with `waitFor` - [ ] 2.4.4 Write test for hook state changes - [ ] 2.4.5 Verify all tests pass with `npm test` ### 2.5 Configure API Mocking - [ ] 2.5.1 Install MSW (Mock Service Worker): `msw`, `@mswjs/data` (optional) - [ ] 2.5.2 Create MSW server setup in `src/mocks/server.ts` - [ ] 2.5.3 Create API handlers for common endpoints - [ ] 2.5.4 Integrate MSW with Jest setup - [ ] 2.5.5 Write test verifying API mocking works correctly ## 3. Integration Tests ### 3.1 Create Integration Test Directory Structure - [ ] 3.1.1 Create `/tests` directory at project root - [ ] 3.1.2 Create `/tests/integration` subdirectory - [ ] 3.1.3 Create `/tests/integration/backend` for backend API tests - [ ] 3.1.4 Create `/tests/integration/e2e` for frontend-backend tests - [ ] 3.1.5 Add `.gitignore` entries for integration test artifacts ### 3.2 Backend Integration Test Setup - [ ] 3.2.1 Install Supertest: `npm install --save-dev supertest @types/supertest` - [ ] 3.2.2 Create `TestWebApplicationFactory` for ASP.NET Core integration tests - [ ] 3.2.3 Configure test database connection (SQLite in-memory or test Postgres) - [ ] 3.2.4 Create database seeding utilities for test data - [ ] 3.2.5 Add first integration test file (e.g., `AuthApiTests.cs`) ### 3.3 Write Backend Integration Tests - [ ] 3.3.1 Write test for GET endpoint returning expected data - [ ] 3.3.2 Write test for POST endpoint persisting data - [ ] 3.3.3 Write test for PUT endpoint updating data - [ ] 3.3.4 Write test for DELETE endpoint removing data - [ ] 3.3.5 Write test for authentication/authorization on protected endpoints - [ ] 3.3.6 Verify backend integration tests pass ### 3.4 Frontend-Backend Integration Test Setup - [ ] 3.4.1 Install Playwright: `npm install --save-dev @playwright/test` - [ ] 3.4.2 Initialize Playwright: `npx playwright install` - [ ] 3.4.3 Create `playwright.config.ts` with test configuration - [ ] 3.4.4 Create `global-setup.ts` for starting backend before tests - [ ] 3.4.5 Create `global-teardown.ts` for cleanup after tests ### 3.5 Write Frontend-Backend Integration Tests - [ ] 3.5.1 Create first E2E test file (e.g., `auth.spec.ts`) - [ ] 3.5.2 Write test for frontend fetching data from backend - [ ] 3.5.3 Write test for frontend submitting form to backend - [ ] 3.5.4 Write test for error handling between frontend and backend - [ ] 3.5.5 Verify E2E tests pass with `npx playwright test` ## 4. Feature-Based Test Cases (From Archived Specs) Based on the archived RacePlanner specifications, implement comprehensive test coverage: ### 4.0.1 User Authentication Tests **From specs/user-auth/spec.md:** - [ ] 4.0.1.1 **Registration - Positive**: Test successful registration with valid email and password - [ ] 4.0.1.2 **Registration - Negative**: Test registration with duplicate email returns error - [ ] 4.0.1.3 **Registration - Negative**: Test registration with invalid email format returns validation error - [ ] 4.0.1.4 **Registration - Negative**: Test registration with weak password returns validation error - [ ] 4.0.1.5 **Registration - Negative**: Test registration with mismatched password confirmation returns error - [ ] 4.0.1.6 **Login - Positive**: Test successful login with correct credentials - [ ] 4.0.1.7 **Login - Negative**: Test login with incorrect password returns error - [ ] 4.0.1.8 **Login - Negative**: Test login with non-existent email returns error - [ ] 4.0.1.9 **Login - Negative**: Test login with empty credentials returns validation error - [ ] 4.0.1.10 **Role Access - Positive**: Test organizer role can access full event CRUD operations - [ ] 4.0.1.11 **Role Access - Negative**: Test participant role cannot modify events (read-only) - [ ] 4.0.1.12 **Role Access - Negative**: Test unauthenticated user cannot access protected routes ### 4.0.2 Event Management Tests **From specs/event-management/spec.md:** - [ ] 4.0.2.1 **Create Event - Positive**: Test creating event with all required fields - [ ] 4.0.2.2 **Create Event - Negative**: Test creating event without name returns validation error - [ ] 4.0.2.3 **Create Event - Negative**: Test creating event with invalid date format returns error - [ ] 4.0.2.4 **Create Event - Negative**: Test creating event with past date returns validation error - [ ] 4.0.2.5 **Edit Event - Positive**: Test updating event date notifies registered participants - [ ] 4.0.2.6 **Edit Event - Negative**: Test editing non-existent event returns 404 - [ ] 4.0.2.7 **Edit Event - Negative**: Test editing event without permission returns 403 - [ ] 4.0.2.8 **Publish Event - Positive**: Test publishing draft event changes status to "published" - [ ] 4.0.2.9 **Publish Event - Negative**: Test publishing already published event returns appropriate response - [ ] 4.0.2.10 **List Events - Positive**: Test retrieving upcoming events sorted by date - [ ] 4.0.2.11 **List Events - Positive**: Test filtering events by specific organizer - [ ] 4.0.2.12 **List Events - Negative**: Test filtering with invalid organizer ID returns empty list ### 4.0.3 Event Categorization Tests **From specs/event-categorization/spec.md:** - [ ] 4.0.3.1 **Assign Category - Positive**: Test assigning category on event creation - [ ] 4.0.3.2 **Assign Category - Positive**: Test assigning category to existing event - [ ] 4.0.3.3 **Assign Category - Negative**: Test assigning invalid category returns validation error - [ ] 4.0.3.4 **Clear Category - Positive**: Test removing category from event - [ ] 4.0.3.5 **Tags - Positive**: Test adding multiple tags on event creation - [ ] 4.0.3.6 **Tags - Positive**: Test modifying tags on existing event - [ ] 4.0.3.7 **Tags - Negative**: Test adding duplicate tags (should handle gracefully) - [ ] 4.0.3.8 **Filter by Category - Positive**: Test filtering events by single category - [ ] 4.0.3.9 **Filter by Category - Negative**: Test filtering by non-existent category returns empty list - [ ] 4.0.3.10 **Filter by Tag - Positive**: Test filtering events by single tag - [ ] 4.0.3.11 **Filter by Tag - Positive**: Test filtering events by multiple tags (ANY match) - [ ] 4.0.3.12 **Category Management - Positive**: Test retrieving predefined category list ### 4.0.4 Registration System Tests **From specs/registration-system/spec.md:** - [ ] 4.0.4.1 **Registration - Positive**: Test successful registration for published event - [ ] 4.0.4.2 **Registration - Negative**: Test registration for full event returns error - [ ] 4.0.4.3 **Registration - Negative**: Test duplicate registration returns "Already registered" error - [ ] 4.0.4.4 **Registration - Negative**: Test registration for unpublished event returns error - [ ] 4.0.4.5 **Registration - Negative**: Test registration without authentication returns 401 - [ ] 4.0.4.6 **Registration Form - Positive**: Test collecting participant details (name, email, emergency contact, category) - [ ] 4.0.4.7 **Registration Form - Negative**: Test submitting incomplete form returns validation errors - [ ] 4.0.4.8 **Registration Form - Negative**: Test invalid email format in registration returns error - [ ] 4.0.4.9 **Registration Status - Positive**: Test viewing registration status (pending, confirmed, cancelled, completed) - [ ] 4.0.4.10 **Cancel Registration - Positive**: Test cancelling registration updates status and releases spot - [ ] 4.0.4.11 **Cancel Registration - Negative**: Test cancelling non-existent registration returns 404 ### 4.0.5 Payment Tracking Tests **From specs/payment-tracking/spec.md:** - [ ] 4.0.5.1 **Record Cash Payment - Positive**: Test recording cash payment updates registration status - [ ] 4.0.5.2 **Record Online Payment - Positive**: Test recording payment with transaction ID - [ ] 4.0.5.3 **Payment Status - Positive**: Test "unpaid" status when no payment recorded - [ ] 4.0.5.4 **Payment Status - Positive**: Test "partial" status with remaining balance shown - [ ] 4.0.5.5 **Payment Status - Positive**: Test "paid" status when payment equals/exceeds amount - [ ] 4.0.5.6 **Payment Status - Negative**: Test recording negative payment amount returns error - [ ] 4.0.5.7 **Payment Status - Negative**: Test recording payment for non-existent registration returns 404 - [ ] 4.0.5.8 **Payment Reporting - Positive**: Test generating event payment summary - [ ] 4.0.5.9 **Payment Reporting - Negative**: Test accessing payment report without organizer role returns 403 ### 4.0.6 Dashboard Tests **From specs/dashboard/spec.md:** - [ ] 4.0.6.1 **Organizer Dashboard - Positive**: Test displaying event statistics (total events, registrations, revenue) - [ ] 4.0.6.2 **Organizer Dashboard - Positive**: Test displaying upcoming events list - [ ] 4.0.6.3 **Organizer Dashboard - Positive**: Test displaying registration trends - [ ] 4.0.6.4 **Organizer Dashboard - Positive**: Test highlighting events nearing capacity - [ ] 4.0.6.5 **Participant Dashboard - Positive**: Test displaying user's registrations - [ ] 4.0.6.6 **Participant Dashboard - Positive**: Test sorting upcoming events by date - [ ] 4.0.6.7 **Quick Actions - Positive**: Test organizer quick action links (create event, view reports, send announcements) - [ ] 4.0.6.8 **Quick Actions - Positive**: Test participant quick action links (browse events, view history) - [ ] 4.0.6.9 **Dashboard - Negative**: Test accessing dashboard without authentication redirects to login ### 4.0.7 Announcements Tests **From specs/announcements/spec.md:** - [ ] 4.0.7.1 **Create Announcement - Positive**: Test creating announcement with title and content - [ ] 4.0.7.2 **Create Announcement - Negative**: Test creating announcement without title returns validation error - [ ] 4.0.7.3 **Create Announcement - Negative**: Test creating announcement without content returns validation error - [ ] 4.0.7.4 **Create Announcement - Negative**: Test creating announcement without permission returns 403 - [ ] 4.0.7.5 **Announcement Visibility - Positive**: Test displaying announcements on event page sorted by newest first - [ ] 4.0.7.6 **Notification - Positive**: Test sending notification to registered participants on new announcement - [ ] 4.0.7.7 **Mark as Read - Positive**: Test marking notification as read when participant views announcement - [ ] 4.0.7.8 **Edit Announcement - Positive**: Test editing existing announcement updates content and shows timestamp - [ ] 4.0.7.9 **Edit Announcement - Negative**: Test editing non-existent announcement returns 404 - [ ] 4.0.7.10 **Delete Announcement - Positive**: Test deleting announcement removes it from event - [ ] 4.0.7.11 **Delete Announcement - Negative**: Test deleting announcement without permission returns 403 ### 4.0.8 Additional Positive Test Cases - [ ] 4.0.8.1 **Concurrent Registration**: Test multiple users registering simultaneously for same event - [ ] 4.0.8.2 **Pagination**: Test event listing pagination with large dataset - [ ] 4.0.8.3 **Search**: Test searching events by name or description - [ ] 4.0.8.4 **Sorting**: Test sorting events by date, name, and category - [ ] 4.0.8.5 **Session Persistence**: Test user session persists across page reloads - [ ] 4.0.8.6 **Rate Limiting**: Test API rate limiting allows reasonable usage ### 4.0.9 Additional Negative/Edge Test Cases - [ ] 4.0.9.1 **SQL Injection**: Test input fields protect against SQL injection attacks - [ ] 4.0.9.2 **XSS Protection**: Test output is properly escaped to prevent XSS - [ ] 4.0.9.3 **CSRF Protection**: Test form submissions require valid CSRF tokens - [ ] 4.0.9.4 **Long Input**: Test handling of extremely long input values - [ ] 4.0.9.5 **Special Characters**: Test handling of special characters in input - [ ] 4.0.9.6 **Unicode**: Test handling of Unicode characters in text fields - [ ] 4.0.9.7 **Empty String**: Test handling of empty strings vs null values - [ ] 4.0.9.8 **Boundary Values**: Test boundary values for numeric fields (capacity, price) - [ ] 4.0.9.9 **Invalid IDs**: Test API endpoints with malformed UUIDs or IDs - [ ] 4.0.9.10 **Unauthorized Access**: Test accessing resources without proper authorization - [ ] 4.0.9.11 **Expired Session**: Test behavior with expired authentication tokens - [ ] 4.0.9.12 **Large Payload**: Test handling of request payloads exceeding size limits ## 4. Test Automation ### 4.1 Add NPM Scripts - [ ] 4.1.1 Add `test` script to run all tests - [ ] 4.1.2 Add `test:backend` script to run backend unit tests (`dotnet test`) - [ ] 4.1.3 Add `test:frontend` script to run frontend unit tests (`jest`) - [ ] 4.1.4 Add `test:integration` script to run integration tests - [ ] 4.1.5 Add `test:watch` script for watch mode - [ ] 4.1.6 Add `test:coverage` script to generate coverage reports ### 4.2 Configure Test Watch Mode - [ ] 4.2.1 Configure Jest watch mode in `jest.config.ts` - [ ] 4.2.2 Add pattern matching support to watch mode - [ ] 4.2.3 Verify watch mode works with `npm run test:watch` ### 4.3 Create Gitea Actions Workflow - [ ] 4.3.1 Create `.gitea/workflows/` directory - [ ] 4.3.2 Create `test.yml` workflow file - [ ] 4.3.3 Configure workflow trigger on pull request events - [ ] 4.3.4 Add job to checkout code - [ ] 4.3.5 Add job to setup .NET SDK - [ ] 4.3.6 Add job to setup Node.js - [ ] 4.3.7 Add job to install backend dependencies and run backend tests - [ ] 4.3.8 Add job to install frontend dependencies and run frontend tests - [ ] 4.3.9 Add job to run integration tests with test infrastructure - [ ] 4.3.10 Configure workflow to block PR merge on test failure ### 4.4 Configure Test Database for CI - [ ] 4.4.1 Update `docker-compose.yml` to include test database service (if using Docker) - [ ] 4.4.2 Create `appsettings.Test.json` for test configuration - [ ] 4.4.3 Configure Gitea Actions to use test database connection string - [ ] 4.4.4 Add database setup/teardown scripts for CI ### 4.5 Documentation and Final Verification - [ ] 4.5.1 Update root `README.md` with testing instructions - [ ] 4.5.2 Add `TESTING.md` with detailed test documentation - [ ] 4.5.3 Update `AGENTS.md` with testing commands for AI agents - [ ] 4.5.4 Run full test suite locally: `npm test` - [ ] 4.5.5 Verify Gitea Actions workflow runs successfully (may need to push and create PR)