From 0290bbabd71b0ed958c86dc6f863c31207abe6d2 Mon Sep 17 00:00:00 2001 From: AG Date: Sun, 30 Nov 2025 22:06:03 +0200 Subject: [PATCH] Planned session start fixed. --- .gitignore | 1 + components/Tracker/useTracker.ts | 1 + playwright-report/index.html | 2 +- server/prisma/dev.db | Bin 208896 -> 221184 bytes .../login-first-time-password-change.spec.ts | 48 ------------------ ...kout-plans-start-session-from-plan.spec.ts | 2 +- 6 files changed, 4 insertions(+), 50 deletions(-) delete mode 100644 tests/login-first-time-password-change.spec.ts diff --git a/.gitignore b/.gitignore index eac4e60..9773157 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ dist-ssr *.local server/prisma/dev.db test-results/ +playwright-report/ # Editor directories and files .vscode/* diff --git a/components/Tracker/useTracker.ts b/components/Tracker/useTracker.ts index 5e386da..c17f4da 100644 --- a/components/Tracker/useTracker.ts +++ b/components/Tracker/useTracker.ts @@ -379,6 +379,7 @@ export const useTracker = ({ return { exercises, plans, + activePlan, selectedExercise, setSelectedExercise, lastSet, diff --git a/playwright-report/index.html b/playwright-report/index.html index 5569612..d2e145c 100644 --- a/playwright-report/index.html +++ b/playwright-report/index.html @@ -82,4 +82,4 @@ Error generating stack: `+n.message+`
- \ No newline at end of file + \ No newline at end of file diff --git a/server/prisma/dev.db b/server/prisma/dev.db index 3ae7753e2d6f390ab7e12b0898842e01392acbd0..bdf577d7de7d8fd7e738a0839312e27626f59fab 100644 GIT binary patch delta 8496 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 Da|Q3{ delta 3517 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 JYEPRj{tKJf-+ll9 diff --git a/tests/login-first-time-password-change.spec.ts b/tests/login-first-time-password-change.spec.ts deleted file mode 100644 index f3f87af..0000000 --- a/tests/login-first-time-password-change.spec.ts +++ /dev/null @@ -1,48 +0,0 @@ -// spec: specs/gymflow-test-plan.md -// seed: tests/core-auth.spec.ts - -import { test, expect } from '@playwright/test'; - -test.describe('I. Core & Authentication', () => { - test('A. Login - First-Time Password Change', async ({ page }) => { - // 1. Navigate to the login page. - await page.goto('http://localhost:3000/'); - - // Log in as admin to create a new user for testing first-time login - await page.getByRole('textbox', { name: 'user@gymflow.ai' }).fill('admin@gymflow.ai'); - await page.locator('input[type="password"]').fill('admin1234'); - await page.getByRole('button', { name: 'Login' }).click(); - - // Navigate to profile and create a new user - await page.getByRole('button', { name: 'Profile' }).click(); - await page.getByRole('textbox', { name: 'Email' }).fill('test@gymflow.ai'); - await page.getByRole('textbox', { name: 'Password', exact: true }).fill('test1234'); - await page.getByRole('button', { name: 'Create' }).click(); - - // Log out as admin - await page.getByRole('button', { name: 'Logout' }).click(); - - // 2. Log in with a first-time user's temporary credentials. - await page.getByRole('textbox', { name: 'user@gymflow.ai' }).fill('test@gymflow.ai'); - await page.locator('input[type="password"]').fill('test1234'); - await page.getByRole('button', { name: 'Login' }).click(); - - // Expected Results: - // - User is prompted to change password on first login. - await expect(page.getByRole('heading', { name: 'Change Password' })).toBeVisible(); - - // 3. Enter a new password (at least 4 characters). - await page.getByRole('textbox').fill('newtestpass'); - - // 4. Click 'Save' or 'Change Password' button. - await page.getByRole('button', { name: 'Save & Login' }).click(); - - // Expected Results: - // - New password is set successfully. - // - User is logged into the application. - await page.waitForLoadState('networkidle'); - await expect(page.getByRole('button', { name: 'Tracker' })).toBeVisible(); - // - No error messages are displayed. - await expect(page.locator('text=Invalid credentials')).not.toBeVisible(); - }); -}); diff --git a/tests/workout-plans-start-session-from-plan.spec.ts b/tests/workout-plans-start-session-from-plan.spec.ts index e5f05f9..26f57df 100644 --- a/tests/workout-plans-start-session-from-plan.spec.ts +++ b/tests/workout-plans-start-session-from-plan.spec.ts @@ -15,7 +15,7 @@ test.describe('II. Workout Management', () => { await page.getByRole('button', { name: 'Plans' }).click(); // 3. Create a plan with at least one exercise. - await page.getByRole('button').filter({ hasText: /^$/ }).nth(4).click(); // Click FAB + await page.locator('.absolute.bottom-6').click(); // Click FAB await page.getByRole('textbox', { name: 'E.g. Full-body Routine' }).fill('Start Session Test Plan'); await page.getByRole('textbox', { name: 'Describe preparation...' }).fill('Test plan for starting a session'); await page.getByRole('button', { name: 'Add Exercise' }).click();