diff --git a/.gemini/commands/playwright.generator.toml b/.gemini/commands/playwright.generator.toml index 9200675..87bb5d8 100644 --- a/.gemini/commands/playwright.generator.toml +++ b/.gemini/commands/playwright.generator.toml @@ -35,16 +35,7 @@ tools: - playwright-test/generator_read_log - playwright-test/generator_setup_page - playwright-test/generator_write_test -model: Claude Sonnet 4 -mcp-servers: - playwright-test: - type: stdio - command: npx - args: - - playwright - - run-test-mcp-server - tools: - - "*" + --- ## User Input diff --git a/.gemini/commands/playwright.healer.toml b/.gemini/commands/playwright.healer.toml index 954ef64..89c8c6a 100644 --- a/.gemini/commands/playwright.healer.toml +++ b/.gemini/commands/playwright.healer.toml @@ -15,16 +15,7 @@ tools: - playwright-test/test_debug - playwright-test/test_list - playwright-test/test_run -model: Claude Sonnet 4 -mcp-servers: - playwright-test: - type: stdio - command: npx - args: - - playwright - - run-test-mcp-server - tools: - - "*" + --- ## User Input diff --git a/.gemini/commands/playwright.planner.toml b/.gemini/commands/playwright.planner.toml index ea17b15..dbcc555 100644 --- a/.gemini/commands/playwright.planner.toml +++ b/.gemini/commands/playwright.planner.toml @@ -25,16 +25,7 @@ tools: - playwright-test/browser_wait_for - playwright-test/planner_setup_page - playwright-test/planner_save_plan -model: Claude Sonnet 4 -mcp-servers: - playwright-test: - type: stdio - command: npx - args: - - playwright - - run-test-mcp-server - tools: - - "*" + --- ## User Input diff --git a/TRACKER_QUICK_LOG_IMPLEMENTATION.txt b/TRACKER_QUICK_LOG_IMPLEMENTATION.txt deleted file mode 100644 index cc23290..0000000 --- a/TRACKER_QUICK_LOG_IMPLEMENTATION.txt +++ /dev/null @@ -1,220 +0,0 @@ -// Add this to Tracker.tsx imports (line 9, after api import): -import { logSporadicSet } from '../services/sporadicSets'; - -// Add this to TrackerProps interface (after onUpdateSet, around line 21): -onSporadicSetAdded?: () => void; - -// Update component function signature (line 28): -const Tracker: React.FC = ({ userId, userWeight, activeSession, activePlan, onSessionStart, onSessionEnd, onSessionQuit, onSetAdded, onRemoveSet, onUpdateSet, onSporadicSetAdded, lang }) => { - -// Add these state variables (after editHeight state, around line 69): -const [isSporadicMode, setIsSporadicMode] = useState(false); -const [sporadicSuccess, setSporadicSuccess] = useState(false); - -// Add this handler function (after handleCancelEdit, around line 289): -const handleLogSporadicSet = async () => { - if (!selectedExercise) return; - - const setData: any = { exerciseId: selectedExercise.id }; - - switch (selectedExercise.type) { - case ExerciseType.STRENGTH: - if (weight) setData.weight = parseFloat(weight); - if (reps) setData.reps = parseInt(reps); - break; - case ExerciseType.BODYWEIGHT: - if (weight) setData.weight = parseFloat(weight); - if (reps) setData.reps = parseInt(reps); - setData.bodyWeightPercentage = parseFloat(bwPercentage) || 100; - break; - case ExerciseType.CARDIO: - if (duration) setData.durationSeconds = parseInt(duration); - if (distance) setData.distanceMeters = parseFloat(distance); - break; - case ExerciseType.STATIC: - if (duration) setData.durationSeconds = parseInt(duration); - setData.bodyWeightPercentage = parseFloat(bwPercentage) || 100; - break; - case ExerciseType.HIGH_JUMP: - if (height) setData.height = parseFloat(height); - break; - case ExerciseType.LONG_JUMP: - if (distance) setData.distanceMeters = parseFloat(distance); - break; - case ExerciseType.PLYOMETRIC: - if (reps) setData.reps = parseInt(reps); - break; - } - - const result = await logSporadicSet(setData); - if (result) { - setSporadicSuccess(true); - setTimeout(() => setSporadicSuccess(false), 2000); - - // Reset form - setWeight(''); setReps(''); setDuration(''); - setDistance(''); setHeight(''); - setSelectedExercise(null); - setSearchQuery(''); - - if (onSporadicSetAdded) onSporadicSetAdded(); - } -}; - -// Replace the single "Free Workout" button section (around line 347-355) with: -
- - -
- -// Add this new section after the "no active session" return statement (after line 396, before the main return): -if (!activeSession && isSporadicMode) { - return ( -
- {/* Header */} -
- -

{t('quick_log', lang)}

-
- - {/* Success Message */} - {sporadicSuccess && ( -
- {t('log_sporadic_success', lang)} -
- )} - - {/* Exercise Selection and Form - reuse existing components */} -
-
- ) => { - setSearchQuery(e.target.value); - setShowSuggestions(true); - }} - onFocus={() => setShowSuggestions(true)} - onBlur={() => setTimeout(() => setShowSuggestions(false), 100)} - icon={} - autoComplete="off" - type="text" - /> - - {showSuggestions && ( -
- {filteredExercises.length > 0 ? ( - filteredExercises.map(ex => ( - - )) - ) : ( -
{t('no_exercises_found', lang)}
- )} -
- )} -
- - {selectedExercise && ( -
-
- {(selectedExercise.type === ExerciseType.STRENGTH || selectedExercise.type === ExerciseType.BODYWEIGHT) && ( - setWeight(e.target.value)} - icon={} - autoFocus - /> - )} - {(selectedExercise.type === ExerciseType.STRENGTH || selectedExercise.type === ExerciseType.BODYWEIGHT || selectedExercise.type === ExerciseType.PLYOMETRIC) && ( - setReps(e.target.value)} - icon={} - /> - )} - {(selectedExercise.type === ExerciseType.CARDIO || selectedExercise.type === ExerciseType.STATIC) && ( - setDuration(e.target.value)} - icon={} - /> - )} - {(selectedExercise.type === ExerciseType.CARDIO || selectedExercise.type === ExerciseType.LONG_JUMP) && ( - setDistance(e.target.value)} - icon={} - /> - )} - {selectedExercise.type === ExerciseType.HIGH_JUMP && ( - setHeight(e.target.value)} - icon={} - /> - )} -
- - -
- )} -
- - {/* Exercise Modal */} - {isCreating && ( - setIsCreating(false)} - onCreate={handleCreateExercise} - lang={lang} - /> - )} -
- ); -} diff --git a/specs/README.md b/specs/README.md deleted file mode 100644 index 48a788b..0000000 --- a/specs/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Specs - -This is a directory for test plans. diff --git a/specs/gymflow-test-plan.md b/specs/gymflow-test-plan.md new file mode 100644 index 0000000..309049c --- /dev/null +++ b/specs/gymflow-test-plan.md @@ -0,0 +1,905 @@ +# GymFlow Application Test Plan + +## Application Overview + +Comprehensive test plan for the GymFlow web application, covering authentication, workout management, tracking, data visualization, user/admin management, and adaptive GUI responsiveness. This plan is based on the provided requirements.md. + +## Test Scenarios + +### 1. I. Core & Authentication + +**Seed:** `tests/core-auth.spec.ts` + +#### 1.1. A. Login - Successful Authentication + +**File:** `tests/core-auth.spec.ts` + +**Steps:** + 1. Navigate to the login page (http://192.168.50.234:3000/). + 2. Enter a valid email in the email field. + 3. Enter a valid password in the password field. + 4. Click the 'Login' button. + +**Expected Results:** + - User is redirected to the main application dashboard (e.g., Tracker view). + - No error messages are displayed. + +#### 1.2. A. Login - Invalid Credentials + +**File:** `tests/core-auth.spec.ts` + +**Steps:** + 1. Navigate to the login page. + 2. Enter an invalid email or password. + 3. Click the 'Login' button. + +**Expected Results:** + - An error message 'Invalid credentials' or similar is displayed. + - User remains on the login page. + +#### 1.3. A. Login - First-Time Password Change + +**File:** `tests/core-auth.spec.ts` + +**Steps:** + 1. Navigate to the login page. + 2. Log in with a first-time user's temporary credentials. + 3. Enter a new password (at least 4 characters). + 4. Click 'Save' or 'Change Password' button. + +**Expected Results:** + - User is prompted to change password on first login. + - New password is set successfully. + - User is logged into the application. + - No error messages are displayed. + +#### 1.4. A. Login - First-Time Password Change (Password too short) + +**File:** `tests/core-auth.spec.ts` + +**Steps:** + 1. Navigate to the login page. + 2. Log in with a first-time user's temporary credentials. + 3. Enter a new password less than 4 characters. + 4. Click 'Save' or 'Change Password' button. + +**Expected Results:** + - An error message 'Password too short' is displayed. + - User remains on the password change screen. + +#### 1.5. A. Login - Language Selection (English) + +**File:** `tests/core-auth.spec.ts` + +**Steps:** + 1. Navigate to the login page. + 2. Select 'English' from the language dropdown. + +**Expected Results:** + - All UI text elements on the login page are displayed in English. + +#### 1.6. A. Login - Language Selection (Russian) + +**File:** `tests/core-auth.spec.ts` + +**Steps:** + 1. Navigate to the login page. + 2. Select 'Русский' from the language dropdown. + +**Expected Results:** + - All UI text elements on the login page are displayed in Russian. + +#### 1.7. B. Navigation - Desktop Navigation Rail + +**File:** `tests/core-auth.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Ensure the browser window is wide enough to trigger desktop layout (e.g., >768px width). + 3. Verify the vertical navigation rail is present on the left side. + 4. Click on each navigation item (Tracker, Plans, History, Stats, AI Coach, Profile). + +**Expected Results:** + - The corresponding section of the application is displayed for each click. + - The navigation rail remains visible and functional. + +#### 1.8. B. Navigation - Mobile Bottom Navigation Bar + +**File:** `tests/core-auth.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Ensure the browser window is narrow enough to trigger mobile layout (e.g., <768px width). + 3. Verify the bottom navigation bar is present. + 4. Click on each navigation item (Tracker, Plans, History, Stats, AI Coach, Profile). + +**Expected Results:** + - The corresponding section of the application is displayed for each click. + - The bottom navigation bar remains visible and functional. + +### 2. II. Workout Management + +**Seed:** `tests/workout-management.spec.ts` + +#### 2.1. A. Workout Plans - Create New Plan + +**File:** `tests/workout-management.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to the 'Plans' section. + 3. Click the 'Add New Plan' or '+' FAB button. + 4. Enter a 'Plan Name' (e.g., 'My New Strength Plan'). + 5. Enter a 'Description' (e.g., 'Focus on compound lifts'). + 6. Add an exercise to the plan. + 7. Click 'Save'. + +**Expected Results:** + - A new plan with the specified name and description appears in the plans list. + - The plan contains the added exercise. + - No error messages are displayed. + +#### 2.2. A. Workout Plans - Edit Existing Plan + +**File:** `tests/workout-management.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to the 'Plans' section. + 3. Create a new plan (if none exist). + 4. Click the 'Edit' icon for an existing plan. + 5. Modify the 'Plan Name' and 'Description'. + 6. Add/remove exercises, or reorder them. + 7. Click 'Save'. + +**Expected Results:** + - The plan is updated with the new name, description, and exercise list. + - No error messages are displayed. + +#### 2.3. A. Workout Plans - Delete Plan + +**File:** `tests/workout-management.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to the 'Plans' section. + 3. Create a new plan (if none exist). + 4. Click the 'Delete' icon for an existing plan. + 5. Confirm deletion when prompted. + +**Expected Results:** + - The plan is removed from the list. + - No error messages are displayed. + +#### 2.4. A. Workout Plans - Reorder Exercises within a Plan + +**File:** `tests/workout-management.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to the 'Plans' section. + 3. Create a plan with at least two exercises. + 4. Enter the plan editor. + 5. Drag an exercise to a new position. + 6. Verify the order changes. + 7. Click 'Save'. + +**Expected Results:** + - Exercises are reordered correctly within the plan editor. + - The reordered plan is saved and reflected in the view. + +#### 2.5. A. Workout Plans - Start Session from Plan + +**File:** `tests/workout-management.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to the 'Plans' section. + 3. Create a plan with at least one exercise. + 4. Click 'Start' button for the created plan. + 5. If a plan description is present, confirm the plan start. + +**Expected Results:** + - The application transitions to the 'Active Session' view. + - The session starts with the selected plan's exercises. + - The timer starts running. + +#### 2.6. B. Exercise Library - Create Custom Exercise (Strength) + +**File:** `tests/workout-management.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to the 'Profile' section. + 3. Expand 'Exercise Manager'. + 4. Click 'Create Exercise'. + 5. Enter an exercise name (e.g., 'Custom Bicep Curl'). + 6. Select 'Strength' as the type. + 7. Click 'Create'. + +**Expected Results:** + - The new exercise appears in the exercise list. + - The exercise type is correctly displayed as Strength. + - No error messages. + +#### 2.7. B. Exercise Library - Create Custom Exercise (Bodyweight with %) + +**File:** `tests/workout-management.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to the 'Profile' section. + 3. Expand 'Exercise Manager'. + 4. Click 'Create Exercise'. + 5. Enter an exercise name (e.g., 'Advanced Push-up'). + 6. Select 'Bodyweight' as the type. + 7. Enter '50' for 'Body Weight Percentage'. + 8. Click 'Create'. + +**Expected Results:** + - The new exercise appears in the exercise list. + - The exercise type is correctly displayed as Bodyweight with 50% body weight percentage. + - No error messages. + +#### 2.8. B. Exercise Library - Edit Exercise Name + +**File:** `tests/workout-management.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to the 'Profile' section. + 3. Expand 'Exercise Manager'. + 4. Click the 'Edit' icon for an existing exercise. + 5. Change the exercise name. + 6. Click 'Save'. + +**Expected Results:** + - The exercise name is updated in the list. + - No error messages. + +#### 2.9. B. Exercise Library - Archive/Unarchive Exercise + +**File:** `tests/workout-management.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to the 'Profile' section. + 3. Expand 'Exercise Manager'. + 4. Click the 'Archive' icon for an existing exercise. + 5. Verify the exercise is marked as archived (or disappears if filtered). + 6. Toggle 'Show Archived' checkbox. + 7. Click the 'Unarchive' icon for the same exercise. + +**Expected Results:** + - Exercise is archived and unarchived successfully. + - Visibility changes correctly based on 'Show Archived' filter. + +#### 2.10. B. Exercise Library - Filter Exercises by Name + +**File:** `tests/workout-management.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to the 'Profile' section. + 3. Expand 'Exercise Manager'. + 4. Enter a partial exercise name into the filter field. + 5. Verify only matching exercises are displayed. + +**Expected Results:** + - The exercise list is dynamically filtered to show only exercises whose names contain the typed text. + +#### 2.11. B. Exercise Library - New Exercise Name field capitalization (mobile) + +**File:** `tests/workout-management.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to the 'Plans' section. + 3. Click the 'Add New Plan' or '+' FAB button. + 4. Click 'Add Exercise', then 'Create Exercise'. + 5. Verify the virtual keyboard for the 'Exercise Name' field suggests capitalizing each word (e.g., `text-transform: capitalize` or `inputmode="text" autocapitalize="words"`). + +**Expected Results:** + - The 'Name' input field for new exercises correctly prompts for capitalization on mobile keyboards, enhancing user experience. + +### 3. III. Workout Tracking + +**Seed:** `tests/workout-tracking.spec.ts` + +#### 3.1. B. Idle State - Start Free Workout + +**File:** `tests/workout-tracking.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Ensure the tracker is in the idle state. + 3. Enter a body weight in the input field (e.g., '75.5'). + 4. Click 'Free Workout' button. + +**Expected Results:** + - The application transitions to 'Active Session' view. + - The timer starts. + - The entered body weight is displayed in the active session header. + +#### 3.2. B. Idle State - Start Quick Log + +**File:** `tests/workout-tracking.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Ensure the tracker is in the idle state. + 3. Click 'Quick Log' button. + +**Expected Results:** + - The application transitions to 'Sporadic Logging' view. + +#### 3.3. B. Idle State - Body Weight Defaults from Profile + +**File:** `tests/workout-tracking.spec.ts` + +**Steps:** + 1. Log in as a regular user with a weight set in their profile. + 2. Navigate to the 'Tracker' section (Idle View). + +**Expected Results:** + - The 'My Weight' field in the Idle View defaults to the weight specified in the user's profile. + +#### 3.4. C. Active Session - Log Strength Set + +**File:** `tests/workout-tracking.spec.ts` + +**Steps:** + 1. Start a 'Free Workout' session (ensure body weight is set). + 2. Select a Strength exercise (e.g., 'Bench Press'). + 3. Enter 'Weight' (e.g., '80') and 'Reps' (e.g., '5'). + 4. Click 'Log Set'. + +**Expected Results:** + - The set is added to the session history. + - Input fields are cleared. + - No error messages are displayed. + +#### 3.5. C. Active Session - Log Bodyweight Set + +**File:** `tests/workout-tracking.spec.ts` + +**Steps:** + 1. Start a 'Free Workout' session. + 2. Select a Bodyweight exercise (e.g., 'Pull-up'). + 3. Enter 'Weight' (e.g., '10') and 'Reps' (e.g., '8'). + 4. Verify 'Body Weight Percentage' defaults to '100'. + 5. Click 'Log Set'. + +**Expected Results:** + - The set is added to the session history. + - Input fields are cleared. + - Body weight percentage is used in calculations. + - No error messages are displayed. + +#### 3.6. C. Active Session - Log Cardio Set + +**File:** `tests/workout-tracking.spec.ts` + +**Steps:** + 1. Start a 'Free Workout' session. + 2. Select a Cardio exercise (e.g., 'Running'). + 3. Enter 'Time (sec)' (e.g., '300') and 'Distance (m)' (e.g., '1000'). + 4. Click 'Log Set'. + +**Expected Results:** + - The set is added to the session history. + - Input fields are cleared. + - No error messages are displayed. + +#### 3.7. C. Active Session - Edit Logged Set + +**File:** `tests/workout-tracking.spec.ts` + +**Steps:** + 1. Start a 'Free Workout' session. + 2. Log at least one set. + 3. Click the 'Edit' icon for a logged set. + 4. Modify 'Weight' or 'Reps'. + 5. Click 'Save'. + +**Expected Results:** + - The set's details are updated in the session history. + - No error messages. + +#### 3.8. C. Active Session - Delete Logged Set + +**File:** `tests/workout-tracking.spec.ts` + +**Steps:** + 1. Start a 'Free Workout' session. + 2. Log at least one set. + 3. Click the 'Delete' icon for a logged set. + 4. Confirm deletion. + +**Expected Results:** + - The set is removed from the session history. + - No error messages. + +#### 3.9. C. Active Session - Finish Session + +**File:** `tests/workout-tracking.spec.ts` + +**Steps:** + 1. Start a 'Free Workout' session. + 2. Log at least one set. + 3. Click 'Finish' button. + 4. Confirm finishing the session. + +**Expected Results:** + - Session data is saved. + - User is returned to the 'Idle State' of the Tracker. + - No error messages. + +#### 3.10. C. Active Session - Quit Session Without Saving + +**File:** `tests/workout-tracking.spec.ts` + +**Steps:** + 1. Start a 'Free Workout' session. + 2. Log at least one set. + 3. Click 'More' (three dots) menu. + 4. Select 'Quit Without Saving'. + 5. Confirm quitting. + +**Expected Results:** + - Session data is discarded. + - User is returned to the 'Idle State' of the Tracker. + - No error messages. + +#### 3.11. C. Active Session - Plan Progression and Jump to Step + +**File:** `tests/workout-tracking.spec.ts` + +**Steps:** + 1. Start a session from a workout plan with multiple steps. + 2. Log sets for the first exercise in the plan until it's considered complete. + 3. Observe the plan progression to the next step. + 4. Click on the plan progression bar to expand the plan list. + 5. Click on a different (e.g., third) step in the expanded plan list. + +**Expected Results:** + - The current exercise automatically advances to the next planned exercise. + - Clicking a step in the plan list navigates the active session to that exercise. + +#### 3.12. D. Sporadic Logging - Log Strength Sporadic Set + +**File:** `tests/workout-tracking.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to 'Quick Log' mode. + 3. Select a Strength exercise. + 4. Enter 'Weight' and 'Reps'. + 5. Click 'Log Set'. + +**Expected Results:** + - The sporadic set is added to today's history in the Sporadic Logging view. + - Input fields are cleared. + - A success message is briefly displayed. + +#### 3.13. D. Sporadic Logging - Exercise Search and Clear + +**File:** `tests/workout-tracking.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to 'Quick Log' mode. + 3. Type a partial exercise name into the 'Select Exercise' field (e.g., 'ben'). + 4. Verify the list of exercises is filtered. + 5. Click on the 'Select Exercise' field again (or focus it). + +**Expected Results:** + - The exercise list filters dynamically as the user types. + - The search field content is cleared on focus. + +### 4. IV. Data & Progress + +**Seed:** `tests/data-progress.spec.ts` + +#### 4.1. A. Session History - View Past Sessions + +**File:** `tests/data-progress.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Complete at least one workout session and log at least one sporadic set. + 3. Navigate to the 'History' section. + +**Expected Results:** + - All past workout sessions and sporadic sets are displayed, grouped by date. + - Each entry shows key summary information (date, duration, plan name, total work, exercise count). + +#### 4.2. A. Session History - View Detailed Session + +**File:** `tests/data-progress.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Complete at least one workout session. + 3. Navigate to the 'History' section. + 4. Click on a workout session entry. + +**Expected Results:** + - A detailed view of the session opens, showing all individual sets with their metrics. + - Session start/end times and body weight are displayed. + +#### 4.3. A. Session History - Edit Past Session Details + +**File:** `tests/data-progress.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Complete a workout session. + 3. Navigate to the 'History' section. + 4. Open the detailed view of a session. + 5. Modify the 'Start Time', 'End Time', or 'Body Weight'. + 6. Click 'Save'. + +**Expected Results:** + - Session details are updated successfully. + - The changes are reflected in the history view. + +#### 4.4. A. Session History - Edit Individual Set in Past Session + +**File:** `tests/data-progress.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Complete a workout session with multiple sets. + 3. Navigate to the 'History' section. + 4. Open the detailed view of a session. + 5. Click the 'Edit' icon for an individual set. + 6. Modify a metric (e.g., weight, reps). + 7. Click 'Save'. + +**Expected Results:** + - The individual set's metrics are updated. + - The changes are reflected in the detailed session view. + +#### 4.5. A. Session History - Delete Past Session + +**File:** `tests/data-progress.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Complete a workout session. + 3. Navigate to the 'History' section. + 4. Click the 'Delete' icon for a session. + 5. Confirm deletion. + +**Expected Results:** + - The session is permanently removed from the history. + - No error messages. + +#### 4.6. A. Session History - Edit Sporadic Set + +**File:** `tests/data-progress.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Log at least one sporadic set. + 3. Navigate to the 'History' section. + 4. Locate and click the 'Edit' icon for a sporadic set. + 5. Modify a metric (e.g., weight, reps, duration). + 6. Click 'Save'. + +**Expected Results:** + - The sporadic set's metrics are updated. + - The changes are reflected in the history view. + +#### 4.7. A. Session History - Delete Sporadic Set + +**File:** `tests/data-progress.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Log at least one sporadic set. + 3. Navigate to the 'History' section. + 4. Locate and click the 'Delete' icon for a sporadic set. + 5. Confirm deletion. + +**Expected Results:** + - The sporadic set is permanently removed from the history. + - No error messages. + +#### 4.8. B. Performance Statistics - View Volume Chart + +**File:** `tests/data-progress.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Complete at least two workout sessions with logged sets. + 3. Navigate to the 'Stats' section. + +**Expected Results:** + - The 'Total Volume' line chart is displayed. + - The chart accurately reflects the total weight lifted per session over time. + +#### 4.9. B. Performance Statistics - View Set Count Chart + +**File:** `tests/data-progress.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Complete at least two workout sessions with logged sets. + 3. Navigate to the 'Stats' section. + +**Expected Results:** + - The 'Set Count' bar chart is displayed. + - The chart accurately reflects the number of sets performed per session over time. + +#### 4.10. B. Performance Statistics - View Body Weight Chart + +**File:** `tests/data-progress.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Log body weight at least twice (e.g., via profile or session start). + 3. Navigate to the 'Stats' section. + +**Expected Results:** + - The 'Body Weight' line chart is displayed. + - The chart accurately reflects the user's body weight changes over time. + +### 5. V. User & System Management + +**Seed:** `tests/user-system-management.spec.ts` + +#### 5.1. A. User Profile - Update Personal Information + +**File:** `tests/user-system-management.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to the 'Profile' section. + 3. Modify 'Weight', 'Height', 'Birth Date', and 'Gender'. + 4. Click 'Save Profile'. + +**Expected Results:** + - Profile information is updated successfully. + - A success snackbar message is displayed. + - The updated information is reflected upon refreshing the profile or re-logging in. + +#### 5.2. A. User Profile - Change Password + +**File:** `tests/user-system-management.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to the 'Profile' section. + 3. Enter a new password (min 4 characters) in the 'Change Password' field. + 4. Click 'OK'. + +**Expected Results:** + - Password change is successful. + - A success message is displayed. + - The user can log in with the new password. + +#### 5.3. A. User Profile - Change Password (Too Short) + +**File:** `tests/user-system-management.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to the 'Profile' section. + 3. Enter a password less than 4 characters in the 'Change Password' field. + 4. Click 'OK'. + +**Expected Results:** + - An error message 'Password too short' is displayed. + - Password is not changed. + +#### 5.4. A. User Profile - Dedicated Daily Weight Logging + +**File:** `tests/user-system-management.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to the 'Profile' section. + 3. Expand 'Weight Tracker'. + 4. Enter today's weight (e.g., '72.3'). + 5. Click 'Log' button. + +**Expected Results:** + - The weight is logged for the current day. + - The new record appears in the weight history list. + - A success snackbar message is displayed. + +#### 5.5. A. User Profile - Language Preference Change + +**File:** `tests/user-system-management.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to the 'Profile' section. + 3. Select a different language (e.g., 'Русский') from the language dropdown. + 4. Click 'Save Profile'. + +**Expected Results:** + - The UI language immediately switches to the selected language. + - The preference persists across sessions. + +#### 5.6. A. User Profile - Delete Own Account + +**File:** `tests/user-system-management.spec.ts` + +**Steps:** + 1. Log in as a regular user (not admin). + 2. Navigate to the 'Profile' section. + 3. Locate 'Delete Account' section. + 4. Click 'Delete' button. + 5. Confirm deletion when prompted. + +**Expected Results:** + - User account is deleted. + - User is logged out and redirected to the login page. + +#### 5.7. B. AI Coach - Send a Message + +**File:** `tests/user-system-management.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to the 'AI Coach' section. + 3. Type a message into the input field (e.g., 'What's a good workout for chest?'). + 4. Click 'Send' button. + +**Expected Results:** + - User's message appears in the chat. + - AI Coach responds with relevant advice. + - No error messages. + +#### 5.8. C. Admin Panel - Create New User + +**File:** `tests/user-system-management.spec.ts` + +**Steps:** + 1. Log in as an 'ADMIN' user. + 2. Navigate to the 'Profile' section. + 3. Expand 'Admin Area'. + 4. Enter a new 'Email' and 'Password' for a new user. + 5. Click 'Create User'. + +**Expected Results:** + - A new user is created and appears in the user list. + - A success message is displayed. + - The new user can log in with the created credentials. + +#### 5.9. C. Admin Panel - View User List + +**File:** `tests/user-system-management.spec.ts` + +**Steps:** + 1. Log in as an 'ADMIN' user. + 2. Navigate to the 'Profile' section. + 3. Expand 'Admin Area'. + 4. Click to expand 'Users List'. + +**Expected Results:** + - A list of all users (excluding the current admin) is displayed, showing their email, role, and blocked status. + +#### 5.10. C. Admin Panel - Block/Unblock User + +**File:** `tests/user-system-management.spec.ts` + +**Steps:** + 1. Log in as an 'ADMIN' user. + 2. Navigate to the 'Profile' section. + 3. Expand 'Admin Area' and 'Users List'. + 4. Locate a non-admin user. + 5. Click the 'Block' icon for that user. + 6. Verify the user's status changes to 'Blocked'. + 7. Click the 'Unblock' icon for the same user. + +**Expected Results:** + - User is blocked and unblocked successfully. + - Status updates are reflected in the user list. + +#### 5.11. C. Admin Panel - Reset User Password + +**File:** `tests/user-system-management.spec.ts` + +**Steps:** + 1. Log in as an 'ADMIN' user. + 2. Navigate to the 'Profile' section. + 3. Expand 'Admin Area' and 'Users List'. + 4. Locate a non-admin user. + 5. Enter a new password (min 4 characters) in the 'Reset Password' field for that user. + 6. Click 'Reset Pass' button. + +**Expected Results:** + - User's password is reset. + - A success alert is displayed. + - The user can log in with the new password. + +#### 5.12. C. Admin Panel - Delete User + +**File:** `tests/user-system-management.spec.ts` + +**Steps:** + 1. Log in as an 'ADMIN' user. + 2. Navigate to the 'Profile' section. + 3. Expand 'Admin Area' and 'Users List'. + 4. Locate a non-admin user. + 5. Click the 'Delete' icon for that user. + 6. Confirm deletion. + +**Expected Results:** + - The user is permanently removed from the system. + - The user no longer appears in the user list. + +#### 5.13. B. Exercise Library - New Exercise Name field capitalization (mobile) + +**File:** `tests/user-system-management.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to the 'Plans' section. + 3. Click the 'Add New Plan' or '+' FAB button. + 4. Click 'Add Exercise', then 'Create Exercise'. + 5. Verify the virtual keyboard for the 'Exercise Name' field suggests capitalizing each word (e.g., `text-transform: capitalize` or `inputmode="text" autocapitalize="words"`). + +**Expected Results:** + - The 'Name' input field for new exercises correctly prompts for capitalization on mobile keyboards, enhancing user experience. + +### 6. VI. User Interface & Experience + +**Seed:** `tests/ui-ux.spec.ts` + +#### 6.1. A. Adaptive GUI - Mobile Navigation (Width < 768px) + +**File:** `tests/ui-ux.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Resize the browser window to a mobile width (e.g., 375px). + 3. Verify the bottom navigation bar is visible and functional. + 4. Verify the desktop navigation rail is hidden. + +**Expected Results:** + - Bottom navigation bar is present with correct icons and labels. + - Desktop navigation rail is not visible. + +#### 6.2. A. Adaptive GUI - Desktop Navigation (Width >= 768px) + +**File:** `tests/ui-ux.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Resize the browser window to a desktop width (e.g., 1280px). + 3. Verify the vertical navigation rail is visible and functional. + 4. Verify the mobile bottom navigation bar is hidden. + +**Expected Results:** + - Vertical navigation rail is present with correct icons and labels. + - Mobile bottom navigation bar is not visible. + +#### 6.3. A. Adaptive GUI - Fluid Layout Responsiveness + +**File:** `tests/ui-ux.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate through various sections (e.g., Plans, Profile, History). + 3. Gradually resize the browser window from desktop to mobile widths and vice-versa. + +**Expected Results:** + - Content layouts adapt smoothly to different screen sizes without horizontal scrolling or overlapping elements. + - All interactive elements remain accessible and usable. + +#### 6.4. A. Adaptive GUI - Responsive Charts in Stats + +**File:** `tests/ui-ux.spec.ts` + +**Steps:** + 1. Log in as a regular user. + 2. Navigate to the 'Stats' section. + 3. Gradually resize the browser window from desktop to mobile widths and vice-versa. + +**Expected Results:** + - The volume, set count, and body weight charts resize and re-render correctly, maintaining readability and data integrity across different screen sizes. diff --git a/tests/requirements.md b/specs/requirements.md similarity index 100% rename from tests/requirements.md rename to specs/requirements.md