Planned session start fixed.

This commit is contained in:
AG
2025-11-30 22:06:03 +02:00
parent 5363cc1e03
commit 0290bbabd7
6 changed files with 4 additions and 50 deletions

1
.gitignore vendored
View File

@@ -13,6 +13,7 @@ dist-ssr
*.local *.local
server/prisma/dev.db server/prisma/dev.db
test-results/ test-results/
playwright-report/
# Editor directories and files # Editor directories and files
.vscode/* .vscode/*

View File

@@ -379,6 +379,7 @@ export const useTracker = ({
return { return {
exercises, exercises,
plans, plans,
activePlan,
selectedExercise, selectedExercise,
setSelectedExercise, setSelectedExercise,
lastSet, lastSet,

View File

@@ -82,4 +82,4 @@ Error generating stack: `+n.message+`
<div id='root'></div> <div id='root'></div>
</body> </body>
</html> </html>
<script id="playwrightReportBase64" type="application/zip">data:application/zip;base64,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</script> <script id="playwrightReportBase64" type="application/zip">data:application/zip;base64,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</script>

Binary file not shown.

View File

@@ -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();
});
});

View File

@@ -15,7 +15,7 @@ test.describe('II. Workout Management', () => {
await page.getByRole('button', { name: 'Plans' }).click(); await page.getByRole('button', { name: 'Plans' }).click();
// 3. Create a plan with at least one exercise. // 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: '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('textbox', { name: 'Describe preparation...' }).fill('Test plan for starting a session');
await page.getByRole('button', { name: 'Add Exercise' }).click(); await page.getByRole('button', { name: 'Add Exercise' }).click();