# Testing Fitness Profile Feature ## Overview This guide provides step-by-step instructions for manually testing the Fitness Profile feature in the FitAI mobile app. ## Prerequisites 1. **Admin API running**: ```bash cd apps/admin npm run dev ``` Server should be running at `http://localhost:3000` 2. **Mobile app running**: ```bash cd apps/mobile npx expo start ``` Choose your platform (iOS/Android/Web) 3. **User account**: Have a Clerk user account created and verified 4. **Database**: Ensure the `fitness_profiles` table exists ```bash cd packages/database npm run db:push ``` ## Test Scenarios ### Test 1: Create New Fitness Profile **Steps:** 1. Open the mobile app 2. Sign in with your Clerk account 3. Navigate to Home screen (should be automatic after sign-in) 4. Locate the "Quick Actions" section 5. Tap the "Fitness Profile" button (pink fitness icon) 6. Verify the screen loads with empty form fields **Expected Result:** - Fitness Profile screen opens - All fields are empty - No errors displayed ### Test 2: Fill Out Basic Information **Steps:** 1. In the "Basic Information" section, fill in: - Height: `175` (cm) - Weight: `70` (kg) - Age: `25` - Gender: Select `Male` from dropdown **Expected Result:** - All fields accept input correctly - Dropdowns open and allow selection - No validation errors ### Test 3: Set Fitness Goals **Steps:** 1. In the "Fitness Goals" section, fill in: - Primary Goal: Select `Muscle Gain` - Activity Level: Select `Moderately Active` **Expected Result:** - Dropdowns work correctly - Selected values are displayed ### Test 4: Add Health Information (Optional) **Steps:** 1. In the "Health Information" section, fill in: - Medical Conditions: `None` - Allergies: `Peanuts` - Injuries: `Previous knee injury in 2023` **Expected Result:** - Multi-line text areas accept input - Text wraps properly ### Test 5: Save Profile **Steps:** 1. Scroll to bottom of form 2. Tap "Save Profile" button 3. Wait for API response **Expected Result:** - Loading indicator appears on button - Success alert: "Fitness profile saved successfully!" - Alert has "OK" button - Tapping "OK" returns to Home screen ### Test 6: Verify Data Persistence **Steps:** 1. From Home screen, tap "Fitness Profile" again 2. Wait for profile to load **Expected Result:** - Loading indicator shows briefly - All previously entered data is displayed correctly: - Height: 175 - Weight: 70 - Age: 25 - Gender: Male - Primary Goal: Muscle Gain - Activity Level: Moderately Active - Medical Conditions: None - Allergies: Peanuts - Injuries: Previous knee injury in 2023 ### Test 7: Update Existing Profile **Steps:** 1. Change some values: - Weight: `72` - Primary Goal: Change to `Weight Loss` 2. Tap "Save Profile" **Expected Result:** - Success alert: "Fitness profile saved successfully!" - Data is updated in database ### Test 8: Verify Update Persistence **Steps:** 1. Navigate back to Home 2. Return to Fitness Profile 3. Verify updated values are shown **Expected Result:** - Weight shows `72` - Primary Goal shows `Weight Loss` - All other fields remain unchanged ### Test 9: Back Button Navigation **Steps:** 1. On Fitness Profile screen 2. Tap the back arrow (←) in top-left corner **Expected Result:** - Returns to Home screen - No data loss (changes not saved unless "Save Profile" was tapped) ### Test 10: Partial Data Entry **Steps:** 1. Create a new user or delete existing profile 2. Fill in only Height: `180` and Gender: `Female` 3. Leave all other fields empty 4. Tap "Save Profile" **Expected Result:** - Profile saves successfully - Only filled fields are stored - Empty fields remain null/empty in database ## Database Verification ### Check Profile in Database ```bash cd apps/admin npm run db:studio ``` Then: 1. Navigate to `fitness_profiles` table 2. Find your user's profile (match `user_id` with Clerk user ID) 3. Verify all fields match what you entered ### SQL Query (Alternative) If you have SQLite CLI access: ```bash cd apps/admin/data sqlite3 fitai.db ``` ```sql -- View all fitness profiles SELECT * FROM fitness_profiles; -- View specific user's profile SELECT * FROM fitness_profiles WHERE user_id = 'user_YOUR_CLERK_ID'; -- Check profile count SELECT COUNT(*) FROM fitness_profiles; ``` ## API Testing ### Test GET Endpoint ```bash # Get your Clerk token first (from Clerk Dashboard or mobile app) export CLERK_TOKEN="your_token_here" curl -X GET http://localhost:3000/api/fitness-profile \ -H "Authorization: Bearer $CLERK_TOKEN" ``` **Expected Response:** ```json { "profile": { "id": "fp_...", "user_id": "user_...", "height": 175, "weight": 70, ... } } ``` ### Test POST Endpoint ```bash curl -X POST http://localhost:3000/api/fitness-profile \ -H "Authorization: Bearer $CLERK_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "height": 175, "weight": 70, "age": 25, "gender": "male", "fitnessGoal": "muscle_gain", "activityLevel": "moderately_active" }' ``` **Expected Response:** ```json { "message": "Fitness profile created successfully", "profileId": "fp_..." } ``` ## Error Scenarios ### Test 1: Unauthorized Access **Steps:** 1. Sign out from mobile app 2. Attempt to access Fitness Profile (should not be possible) **Expected Result:** - User is redirected to sign-in screen - Fitness Profile is not accessible without authentication ### Test 2: Network Error **Steps:** 1. Stop the admin API server 2. Try to save profile in mobile app **Expected Result:** - Error alert: "Failed to save fitness profile" - User can retry after restarting server ### Test 3: Invalid Data Types **Steps:** 1. Enter letters in Height field: `abc` 2. Try to save **Expected Result:** - Numeric keyboard prevents letter entry (on mobile) - Or validation error if somehow entered ## Common Issues & Solutions ### Issue: Profile doesn't load **Solution:** - Check admin API is running - Verify `EXPO_PUBLIC_API_URL` is set correctly - Check browser/app console for errors ### Issue: Save button doesn't work **Solution:** - Check network connection - Verify Clerk authentication token is valid - Check admin API logs for errors ### Issue: Data not persisting **Solution:** - Verify database migration ran successfully - Check `fitness_profiles` table exists - Verify write permissions on SQLite database ### Issue: Picker dropdowns don't open **Solution:** - Ensure `@react-native-picker/picker` is installed - Run `npx expo start -c` to clear cache - Restart app ## Performance Testing ### Test Loading Speed 1. Time from tapping "Fitness Profile" to screen fully loaded - **Target:** < 500ms with existing profile - **Target:** < 200ms for new profile (no data to load) 2. Time from tapping "Save" to success message - **Target:** < 1 second ### Test Responsiveness 1. Scroll performance: Smooth scrolling on all devices 2. Input lag: Immediate feedback when typing 3. Picker responsiveness: Opens/closes without delay ## Sign-off Checklist - [ ] Can create new fitness profile - [ ] Can update existing profile - [ ] Data persists across app restarts - [ ] All dropdowns work correctly - [ ] All text inputs accept data - [ ] Save button works and shows loading state - [ ] Success message displays correctly - [ ] Back button navigation works - [ ] Data visible in database - [ ] API endpoints respond correctly - [ ] Authentication required and working - [ ] Error handling works for network issues - [ ] Optional fields can be left empty - [ ] Profile unique per user (one profile per user) ## Next Steps After completing these tests: 1. Document any bugs found in issue tracker 2. Verify fixes for any issues 3. Request code review 4. Plan automated test implementation 5. Deploy to staging environment for QA testing