# FitAI Report Generation System - Testing Guide ## Overview This document provides comprehensive testing procedures for the FitAI Report Generation System, covering: - API endpoints - Access control - PDF generation - Mobile-to-admin data flow - Edge cases ## Prerequisites 1. **Admin App Running** ```bash cd apps/admin npm run dev # Should be running on http://localhost:3000 ``` 2. **Database Populated** - Ensure test users exist with different roles - Ensure attendance, nutrition, and hydration data exists ## 1. API Endpoint Testing ### 1.1 Trainer-Client Assignment API #### Test: Create Assignment ```bash # As Admin curl -X POST http://localhost:3000/api/trainer-client \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "trainerId": "user_trainer_123", "clientId": "user_client_456" }' ``` **Expected Response (201):** ```json { "assignment": { "id": "assignment_...", "trainerId": "user_trainer_123", "clientId": "user_client_456", "assignedAt": "2024-01-15T...", "isActive": true } } ``` #### Test: Get Assignments ```bash # Get all assignments curl http://localhost:3000/api/trainer-client \ -H "Authorization: Bearer " # Filter by trainer curl "http://localhost:3000/api/trainer-client?trainerId=user_trainer_123" \ -H "Authorization: Bearer " ``` #### Test: Delete Assignment ```bash curl -X DELETE http://localhost:3000/api/trainer-client/ \ -H "Authorization: Bearer " ``` **Expected Response (200):** ```json { "success": true, "message": "Assignment deactivated successfully" } ``` ### 1.2 Report Generation API #### Test: Get JSON Report ```bash curl "http://localhost:3000/api/reports/user/?startDate=2024-01-01&endDate=2024-01-31" \ -H "Authorization: Bearer " ``` **Expected Response (200):** ```json { "userId": "...", "user": { ... }, "weeklyCheckIns": [ ... ], "nutrition": { ... }, "hydration": { ... }, "goals": { ... }, "recommendations": { ... }, "generatedAt": "..." } ``` #### Test: Get PDF Report ```bash curl "http://localhost:3000/api/reports/user/?startDate=2024-01-01&endDate=2024-01-31&format=pdf" \ -H "Authorization: Bearer " \ --output report.pdf ``` **Validation:** - File should download as `FitAI_Report__.pdf` - File should be valid PDF (starts with `%PDF`) - File should contain all sections #### Test: Access Control **As Client (own report only):** ```bash # Should succeed - own report curl "http://localhost:3000/api/reports/user/" \ -H "Authorization: Bearer " # Should fail - other's report curl "http://localhost:3000/api/reports/user/" \ -H "Authorization: Bearer " ``` **Expected:** 403 Forbidden **As Trainer (assigned clients only):** ```bash # Should succeed - assigned client curl "http://localhost:3000/api/reports/user/" \ -H "Authorization: Bearer " # Should fail - non-assigned client curl "http://localhost:3000/api/reports/user/" \ -H "Authorization: Bearer " ``` **Expected:** 403 Forbidden **As Admin (gym users only):** ```bash # Should succeed - same gym curl "http://localhost:3000/api/reports/user/" \ -H "Authorization: Bearer " # Should fail - different gym curl "http://localhost:3000/api/reports/user/" \ -H "Authorization: Bearer " ``` **Expected:** 403 Forbidden ### 1.3 Nutrition API #### Test: Save Daily Nutrition ```bash curl -X POST http://localhost:3000/api/nutrition \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "date": "2024-01-15", "totalCalories": 2100, "calorieGoal": 2000, "meals": [ { "type": "breakfast", "name": "Oatmeal", "calories": 300 }, { "type": "lunch", "name": "Salad", "calories": 500 } ] }' ``` **Expected Response (200):** ```json { "id": "nutrition_...", "userId": "...", "date": "2024-01-15", "totalCalories": 2100, "calorieGoal": 2000 } ``` #### Test: Get Nutrition by Date ```bash curl "http://localhost:3000/api/nutrition?date=2024-01-15" \ -H "Authorization: Bearer " ``` #### Test: Get Nutrition Range ```bash curl "http://localhost:3000/api/nutrition?startDate=2024-01-01&endDate=2024-01-31" \ -H "Authorization: Bearer " ``` ### 1.4 Hydration API #### Test: Save Daily Hydration ```bash curl -X POST http://localhost:3000/api/hydration \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "date": "2024-01-15", "totalWater": 2500, "waterGoal": 2000, "entries": [ { "amount": 250, "time": "08:00" }, { "amount": 500, "time": "10:30" } ] }' ``` #### Test: Get Hydration ```bash curl "http://localhost:3000/api/hydration?date=2024-01-15" \ -H "Authorization: Bearer " ``` ## 2. Web UI Testing ### 2.1 Reports Page **URL:** `http://localhost:3000/reports` **Test Scenarios:** 1. **Admin View** - Should see all clients in dropdown - Should be able to select any client - Should see all report sections - Should see "Export PDF" button 2. **Trainer View** - Should only see assigned clients in dropdown - Should see message if no clients assigned - Should be able to generate reports for assigned clients 3. **Client View** - Should only see own name in dropdown - Should be auto-selected - Should be able to view own report ### 2.2 Trainer-Client Assignments Page **URL:** `http://localhost:3000/trainer-clients` **Test Scenarios:** 1. **Create Assignment** - Select trainer from dropdown - Select client from dropdown - Click "Assign" - Should see new assignment in Active list 2. **Remove Assignment** - Click remove button on assignment - Confirm deletion - Assignment should move to Inactive list 3. **Validation** - Cannot assign trainer to non-trainer - Cannot assign client to non-client - Cannot create duplicate active assignments ## 3. ISO Week Calculations ### Test Week Boundaries | Date | Monday | Sunday | | ---------------- | ---------- | ---------- | | 2024-01-01 (Mon) | 2024-01-01 | 2024-01-07 | | 2024-01-02 (Tue) | 2024-01-01 | 2024-01-07 | | 2024-01-07 (Sun) | 2024-01-01 | 2024-01-07 | | 2024-01-08 (Mon) | 2024-01-08 | 2024-01-14 | ### Test Weekly Stats Calculation **Test Data:** - Monday: 2 check-ins, 120 minutes total - Tuesday: 1 check-in, 60 minutes - Wednesday: 0 check-ins - Thursday: 3 check-ins, 180 minutes - Friday: 2 check-ins, 100 minutes - Saturday: 0 check-ins - Sunday: 1 check-in, 45 minutes **Expected Results:** ```typescript { weekStart: "2024-01-01", weekEnd: "2024-01-07", totalCheckIns: 9, totalTimeMinutes: 505, averageDurationMinutes: 63 // 505 / 8 (only completed sessions) } ``` ## 4. PDF Generation Testing ### Test: Generate PDF with All Sections 1. Navigate to Reports page 2. Select user with: - At least 1 week of attendance data - At least 3 days of nutrition data - At least 3 days of hydration data - At least 1 active goal - At least 1 recommendation 3. Set date range to 30 days 4. Click "Export PDF" 5. Validate PDF contains: - [ ] Header with "FitAI User Report" - [ ] User information section - [ ] Report period section - [ ] Weekly check-ins table - [ ] Nutrition summary with daily breakdown - [ ] Hydration summary with daily breakdown - [ ] Active goals with progress - [ ] Completed goals - [ ] Profile changes (if any) - [ ] Recommendations - [ ] Footer with page numbers ### Test: Generate PDF with No Data 1. Select user with no activity 2. Set date range to 30 days 3. Export PDF 4. Validate: - [ ] All sections show "No data available" - [ ] Charts/tables are empty - [ ] PDF still generates successfully ### Test: Generate PDF with Large Date Range 1. Set date range to 90 days 2. Export PDF 3. Validate: - [ ] PDF contains summary data (not all 90 days) - [ ] Charts are readable - [ ] No performance issues ## 5. Mobile-to-Admin Data Flow ### Test: Nutrition Data Flow 1. **Mobile App:** ```typescript // Add nutrition data await saveDailyNutrition({ date: "2024-01-15", totalCalories: 2200, calorieGoal: 2000, meals: [...] }); ``` 2. **Verify in Database:** ```sql SELECT * FROM daily_nutrition WHERE user_id = '' AND date = '2024-01-15'; ``` 3. **Verify in Admin Reports:** - Navigate to Reports page - Select same user - Set date range to include 2024-01-15 - Check Nutrition Summary section - Should show 2200 calories, 2000 goal ### Test: Hydration Data Flow 1. **Mobile App:** ```typescript await saveDailyHydration({ date: "2024-01-15", totalWater: 2500, waterGoal: 2000, entries: [...] }); ``` 2. **Verify in Admin Reports:** - Check Hydration Summary section - Should show 2500ml, 2000ml goal ## 6. Edge Cases ### 6.1 Empty Data - [ ] User with no attendance - [ ] User with no nutrition - [ ] User with no hydration - [ ] User with no goals - [ ] User with no recommendations ### 6.2 Invalid Inputs - [ ] Invalid date format → 400 Bad Request - [ ] Future dates → Should work (no validation) - [ ] Date range > 1 year → Should work - [ ] Missing userId → 400 Bad Request - [ ] Non-existent userId → 404 Not Found ### 6.3 Access Control - [ ] Expired token → 401 Unauthorized - [ ] Invalid token → 401 Unauthorized - [ ] User accessing another user → 403 Forbidden - [ ] Deleted user → 404 Not Found ### 6.4 Performance - [ ] 100 days of data → Should load < 5 seconds - [ ] PDF with 100 days → Should generate < 10 seconds - [ ] Multiple concurrent requests → Should handle gracefully ## 7. Automated Tests Run automated tests: ```bash cd apps/admin # Run all tests npm test # Run specific test file npx jest src/app/api/reports/__tests__/report-generation.test.ts # Run with coverage npm test -- --coverage ``` ## 8. Troubleshooting ### Common Issues 1. **"Unauthorized" Error** - Ensure Clerk authentication is working - Check token is being passed correctly - Verify user exists in database 2. **"Forbidden" Error** - Check user role permissions - For trainers: ensure assignment exists - For admins: ensure same gym 3. **Empty Report Data** - Check data exists in database - Verify date range includes data dates - Check API endpoints return data 4. **PDF Not Downloading** - Check browser console for errors - Ensure PDF generation completes - Try different browser ## 9. Test Users Create test users for manual testing: ```typescript const testUsers = { superAdmin: { id: "user_test_superadmin", email: "superadmin@test.com", role: "superAdmin", }, admin: { id: "user_test_admin", email: "admin@test.com", role: "admin", gymId: "gym_test", }, trainer: { id: "user_test_trainer", email: "trainer@test.com", role: "trainer", gymId: "gym_test", }, client: { id: "user_test_client", email: "client@test.com", role: "client", gymId: "gym_test", }, }; ``` ## 10. Success Criteria All tests should pass: - [ ] Trainer-client CRUD operations work - [ ] Role-based access control enforced - [ ] Reports generate with all sections - [ ] PDF export works correctly - [ ] Mobile data syncs to admin - [ ] ISO week calculations correct - [ ] Edge cases handled gracefully - [ ] Performance acceptable