diff --git a/playwright-report/index.html b/playwright-report/index.html new file mode 100644 index 0000000..5569612 --- /dev/null +++ b/playwright-report/index.html @@ -0,0 +1,85 @@ + + + + + + + + + Playwright Test Report + + + + +
+ + + \ No newline at end of file diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..2249545 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,21 @@ +import { defineConfig, devices } from '@playwright/test'; + +export default defineConfig({ + testDir: './tests', + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: process.env.CI ? 1 : undefined, + reporter: 'html', + use: { + baseURL: 'http://localhost:3000', + trace: 'on-first-retry', + }, + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], + +}); diff --git a/server/prisma/dev.db b/server/prisma/dev.db index dfaa7db..3ae7753 100644 Binary files a/server/prisma/dev.db and b/server/prisma/dev.db differ diff --git a/test-output.json b/test-output.json new file mode 100644 index 0000000..7c18150 --- /dev/null +++ b/test-output.json @@ -0,0 +1,3500 @@ +{ + "config": { + "configFile": "D:\\Coding\\gymflow\\playwright.config.ts", + "rootDir": "D:/Coding/gymflow/tests", + "forbidOnly": false, + "fullyParallel": true, + "globalSetup": null, + "globalTeardown": null, + "globalTimeout": 0, + "grep": {}, + "grepInvert": null, + "maxFailures": 0, + "metadata": { + "actualWorkers": 8 + }, + "preserveOutput": "always", + "reporter": [ + [ + "json" + ] + ], + "reportSlowTests": { + "max": 5, + "threshold": 300000 + }, + "quiet": false, + "projects": [ + { + "outputDir": "D:/Coding/gymflow/test-results", + "repeatEach": 1, + "retries": 0, + "metadata": { + "actualWorkers": 8 + }, + "id": "chromium", + "name": "chromium", + "testDir": "D:/Coding/gymflow/tests", + "testIgnore": [], + "testMatch": [ + "**/*.@(spec|test).?(c|m)[jt]s?(x)" + ], + "timeout": 30000 + } + ], + "shard": null, + "tags": [], + "updateSnapshots": "missing", + "updateSourceMethod": "patch", + "version": "1.57.0", + "workers": 8, + "webServer": null + }, + "suites": [ + { + "title": "active-session-delete-logged-set.spec.ts", + "file": "active-session-delete-logged-set.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "III. Workout Tracking", + "file": "active-session-delete-logged-set.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "C. Active Session - Delete Logged Set", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "failed", + "duration": 11271, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveCount\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('div').filter({ hasText: /^1Bench Press80kg x 5$/ })\nExpected: \u001b[32m0\u001b[39m\nReceived: \u001b[31m3\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m - Expect \"toHaveCount\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for locator('div').filter({ hasText: /^1Bench Press80kg x 5$/ })\u001b[22m\n\u001b[2m 9 × locator resolved to 3 elements\u001b[22m\n\u001b[2m - unexpected value \"3\"\u001b[22m\n", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveCount\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('div').filter({ hasText: /^1Bench Press80kg x 5$/ })\nExpected: \u001b[32m0\u001b[39m\nReceived: \u001b[31m3\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m - Expect \"toHaveCount\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for locator('div').filter({ hasText: /^1Bench Press80kg x 5$/ })\u001b[22m\n\u001b[2m 9 × locator resolved to 3 elements\u001b[22m\n\u001b[2m - unexpected value \"3\"\u001b[22m\n\n at D:\\Coding\\gymflow\\tests\\active-session-delete-logged-set.spec.ts:32:85", + "location": { + "file": "D:\\Coding\\gymflow\\tests\\active-session-delete-logged-set.spec.ts", + "column": 85, + "line": 32 + }, + "snippet": "\u001b[0m \u001b[90m 30 |\u001b[39m \u001b[90m// Expected Results:\u001b[39m\n \u001b[90m 31 |\u001b[39m \u001b[90m// - The set is removed from the session history.\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 32 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mlocator(\u001b[32m'div'\u001b[39m)\u001b[33m.\u001b[39mfilter({ hasText\u001b[33m:\u001b[39m \u001b[35m/^1Bench Press80kg x 5$/\u001b[39m }))\u001b[33m.\u001b[39mtoHaveCount(\u001b[35m0\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 33 |\u001b[39m \u001b[90m// - No error messages.\u001b[39m\n \u001b[90m 34 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mlocator(\u001b[32m'text=Error'\u001b[39m))\u001b[33m.\u001b[39mnot\u001b[33m.\u001b[39mtoBeVisible()\u001b[33m;\u001b[39m\n \u001b[90m 35 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\active-session-delete-logged-set.spec.ts", + "column": 85, + "line": 32 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveCount\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('div').filter({ hasText: /^1Bench Press80kg x 5$/ })\nExpected: \u001b[32m0\u001b[39m\nReceived: \u001b[31m3\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m - Expect \"toHaveCount\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for locator('div').filter({ hasText: /^1Bench Press80kg x 5$/ })\u001b[22m\n\u001b[2m 9 × locator resolved to 3 elements\u001b[22m\n\u001b[2m - unexpected value \"3\"\u001b[22m\n\n\n 30 | // Expected Results:\n 31 | // - The set is removed from the session history.\n> 32 | await expect(page.locator('div').filter({ hasText: /^1Bench Press80kg x 5$/ })).toHaveCount(0);\n | ^\n 33 | // - No error messages.\n 34 | await expect(page.locator('text=Error')).not.toBeVisible();\n 35 | });\n at D:\\Coding\\gymflow\\tests\\active-session-delete-logged-set.spec.ts:32:85" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:42.230Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\active-session-delete-logg-e5e01-Session---Delete-Logged-Set-chromium\\error-context.md" + } + ], + "errorLocation": { + "file": "D:\\Coding\\gymflow\\tests\\active-session-delete-logged-set.spec.ts", + "column": 85, + "line": 32 + } + } + ], + "status": "unexpected" + } + ], + "id": "c34ebbeb329e78c5485f-96f2e2d916243c8e8b3c", + "file": "active-session-delete-logged-set.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "active-session-finish-session.spec.ts", + "file": "active-session-finish-session.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "III. Workout Tracking", + "file": "active-session-finish-session.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "C. Active Session - Finish Session", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "passed", + "duration": 6606, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:42.233Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c20aad1036334502e0d8-afffcfec8ebc8aecb302", + "file": "active-session-finish-session.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "active-session-log-bodyweight-set.spec.ts", + "file": "active-session-log-bodyweight-set.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "III. Workout Tracking", + "file": "active-session-log-bodyweight-set.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "C. Active Session - Log Bodyweight Set", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "passed", + "duration": 6319, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:42.236Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "3222f0697017ef711303-8ddb33cd02d55dc83fdb", + "file": "active-session-log-bodyweight-set.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "active-session-log-cardio-set.spec.ts", + "file": "active-session-log-cardio-set.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "III. Workout Tracking", + "file": "active-session-log-cardio-set.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "C. Active Session - Log Cardio Set", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "passed", + "duration": 6448, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:42.263Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "69c7e56127bef2caa9b6-800863f800c0c21532c0", + "file": "active-session-log-cardio-set.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "active-session-log-strength-set.spec.ts", + "file": "active-session-log-strength-set.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "III. Workout Tracking", + "file": "active-session-log-strength-set.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "C. Active Session - Log Strength Set", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "passed", + "duration": 6442, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:42.328Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "7023ed05b8fcdef27d19-0cdeca2f383764860967", + "file": "active-session-log-strength-set.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "active-session-plan-progression-and-jump-to-step.spec.ts", + "file": "active-session-plan-progression-and-jump-to-step.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "III. Workout Tracking", + "file": "active-session-plan-progression-and-jump-to-step.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "C. Active Session - Plan Progression and Jump to Step", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 9340, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:42.253Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "9c4561ae521f624932c2-cdf69a9a9f8249951e9b", + "file": "active-session-plan-progression-and-jump-to-step.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "active-session-quit-session-without-saving.spec.ts", + "file": "active-session-quit-session-without-saving.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "III. Workout Tracking", + "file": "active-session-quit-session-without-saving.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "C. Active Session - Quit Session Without Saving", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 6, + "parallelIndex": 6, + "status": "passed", + "duration": 6716, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:42.303Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "5a7ffef6d3b03409c489-2fcf38149b5789bd1f34", + "file": "active-session-quit-session-without-saving.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "admin-panel-block-unblock-user.spec.ts", + "file": "admin-panel-block-unblock-user.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "V. User & System Management", + "file": "admin-panel-block-unblock-user.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "C. Admin Panel - Block/Unblock User", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 7, + "parallelIndex": 7, + "status": "timedOut", + "duration": 30341, + "error": { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m", + "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + "errors": [ + { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\admin-panel-block-unblock-user.spec.ts", + "column": 128, + "line": 23 + }, + "message": "Error: locator.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('div').filter({ hasText: /^user1@gymflow\\.aiUSERBlockDelete$/ }).getByRole('button', { name: 'Block' })\u001b[22m\n\n\n 21 |\n 22 | // 5. Click the 'Block' icon for that user.\n> 23 | await page.locator('div').filter({ hasText: /^user1@gymflow\\.aiUSERBlockDelete$/ }).getByRole('button', { name: 'Block' }).click();\n | ^\n 24 |\n 25 | // 6. Verify the user's status changes to 'Blocked'.\n 26 | await expect(page.locator('div').filter({ hasText: /^user1@gymflow\\.aiUSERBlockedUnblockDelete$/ }).getByRole('button', { name: 'Unblock' })).toBeVisible();\n at D:\\Coding\\gymflow\\tests\\admin-panel-block-unblock-user.spec.ts:23:128" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:42.276Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\admin-panel-block-unblock--5314f--Panel---Block-Unblock-User-chromium\\error-context.md" + } + ] + } + ], + "status": "unexpected" + } + ], + "id": "ce8cd4890844b7ff7b9c-88512db6d2edd5c40cc9", + "file": "admin-panel-block-unblock-user.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "admin-panel-create-new-user.spec.ts", + "file": "admin-panel-create-new-user.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "V. User & System Management", + "file": "admin-panel-create-new-user.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "C. Admin Panel - Create New User", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 2, + "parallelIndex": 2, + "status": "failed", + "duration": 7897, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('User created: adminpanelnewuser@gymflow.ai')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('User created: adminpanelnewuser@gymflow.ai')\u001b[22m\n", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('User created: adminpanelnewuser@gymflow.ai')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('User created: adminpanelnewuser@gymflow.ai')\u001b[22m\n\n at D:\\Coding\\gymflow\\tests\\admin-panel-create-new-user.spec.ts:28:80", + "location": { + "file": "D:\\Coding\\gymflow\\tests\\admin-panel-create-new-user.spec.ts", + "column": 80, + "line": 28 + }, + "snippet": "\u001b[0m \u001b[90m 26 |\u001b[39m \u001b[90m// Expected Results:\u001b[39m\n \u001b[90m 27 |\u001b[39m \u001b[90m// - A new user is created and appears in the user list.\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 28 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mgetByText(\u001b[32m'User created: adminpanelnewuser@gymflow.ai'\u001b[39m))\u001b[33m.\u001b[39mtoBeVisible()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 29 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'button'\u001b[39m\u001b[33m,\u001b[39m { name\u001b[33m:\u001b[39m \u001b[32m'Users List (4)'\u001b[39m })\u001b[33m.\u001b[39mclick()\u001b[33m;\u001b[39m \u001b[90m// Expand users list\u001b[39m\n \u001b[90m 30 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mgetByText(\u001b[32m'adminpanelnewuser@gymflow.ai'\u001b[39m))\u001b[33m.\u001b[39mtoBeVisible()\u001b[33m;\u001b[39m\n \u001b[90m 31 |\u001b[39m \u001b[90m// - A success message is displayed.\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\admin-panel-create-new-user.spec.ts", + "column": 80, + "line": 28 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('User created: adminpanelnewuser@gymflow.ai')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('User created: adminpanelnewuser@gymflow.ai')\u001b[22m\n\n\n 26 | // Expected Results:\n 27 | // - A new user is created and appears in the user list.\n> 28 | await expect(page.getByText('User created: adminpanelnewuser@gymflow.ai')).toBeVisible();\n | ^\n 29 | await page.getByRole('button', { name: 'Users List (4)' }).click(); // Expand users list\n 30 | await expect(page.getByText('adminpanelnewuser@gymflow.ai')).toBeVisible();\n 31 | // - A success message is displayed.\n at D:\\Coding\\gymflow\\tests\\admin-panel-create-new-user.spec.ts:28:80" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:49.357Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\admin-panel-create-new-use-8bfeb-min-Panel---Create-New-User-chromium\\error-context.md" + } + ], + "errorLocation": { + "file": "D:\\Coding\\gymflow\\tests\\admin-panel-create-new-user.spec.ts", + "column": 80, + "line": 28 + } + } + ], + "status": "unexpected" + } + ], + "id": "54f51af6788da48ee01f-2ab7861cace7b9c5f310", + "file": "admin-panel-create-new-user.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "admin-panel-delete-user.spec.ts", + "file": "admin-panel-delete-user.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "V. User & System Management", + "file": "admin-panel-delete-user.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "C. Admin Panel - Delete User", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 3, + "status": "timedOut", + "duration": 30078, + "error": { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m", + "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + "errors": [ + { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\admin-panel-delete-user.spec.ts", + "column": 64, + "line": 18 + }, + "message": "Error: locator.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m - waiting for getByRole('button', { name: 'Users List (1)' })\u001b[22m\n\n\n 16 |\n 17 | // 3. Expand 'Admin Area' and 'Users List'.\n> 18 | await page.getByRole('button', { name: 'Users List (1)' }).click(); // Count will depend on seeded users\n | ^\n 19 |\n 20 | // 4. Locate a non-admin user. (user1@gymflow.ai from seeded data)\n 21 |\n at D:\\Coding\\gymflow\\tests\\admin-panel-delete-user.spec.ts:18:64" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:49.364Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\admin-panel-delete-user-V--35271-C-Admin-Panel---Delete-User-chromium\\error-context.md" + } + ] + } + ], + "status": "unexpected" + } + ], + "id": "dcd7834869baba952206-10244ef4c61796c72db9", + "file": "admin-panel-delete-user.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "admin-panel-view-user-list.spec.ts", + "file": "admin-panel-view-user-list.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "V. User & System Management", + "file": "admin-panel-view-user-list.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "C. Admin Panel - View User List", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 4, + "parallelIndex": 4, + "status": "timedOut", + "duration": 30092, + "error": { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m", + "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + "errors": [ + { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\admin-panel-view-user-list.spec.ts", + "column": 64, + "line": 20 + }, + "message": "Error: locator.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m - waiting for getByRole('button', { name: 'Users List (3)' })\u001b[22m\n\n\n 18 |\n 19 | // 4. Click to expand 'Users List'.\n> 20 | await page.getByRole('button', { name: 'Users List (3)' }).click(); // 3 seeded users\n | ^\n 21 |\n 22 | // Expected Results:\n 23 | // - A list of all users (excluding the current admin) is displayed, showing their email, role, and blocked status.\n at D:\\Coding\\gymflow\\tests\\admin-panel-view-user-list.spec.ts:20:64" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:49.373Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\admin-panel-view-user-list-d0571-dmin-Panel---View-User-List-chromium\\error-context.md" + } + ] + } + ], + "status": "unexpected" + } + ], + "id": "3c5a50777a2f02993a2f-0213e734cd5e95e0e610", + "file": "admin-panel-view-user-list.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "ai-coach-send-a-message.spec.ts", + "file": "ai-coach-send-a-message.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "V. User & System Management", + "file": "ai-coach-send-a-message.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "B. AI Coach - Send a Message", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 1, + "parallelIndex": 1, + "status": "failed", + "duration": 7488, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('Based on your workout history and personal records, a good chest workout could include Bench Press and Dips.')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('Based on your workout history and personal records, a good chest workout could include Bench Press and Dips.')\u001b[22m\n", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('Based on your workout history and personal records, a good chest workout could include Bench Press and Dips.')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('Based on your workout history and personal records, a good chest workout could include Bench Press and Dips.')\u001b[22m\n\n at D:\\Coding\\gymflow\\tests\\ai-coach-send-a-message.spec.ts:27:146", + "location": { + "file": "D:\\Coding\\gymflow\\tests\\ai-coach-send-a-message.spec.ts", + "column": 146, + "line": 27 + }, + "snippet": "\u001b[0m \u001b[90m 25 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mgetByText(\u001b[32m'What\\'s a good workout for chest?'\u001b[39m))\u001b[33m.\u001b[39mtoBeVisible()\u001b[33m;\u001b[39m\n \u001b[90m 26 |\u001b[39m \u001b[90m// - AI Coach responds with relevant advice.\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 27 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mgetByText(\u001b[32m'Based on your workout history and personal records, a good chest workout could include Bench Press and Dips.'\u001b[39m))\u001b[33m.\u001b[39mtoBeVisible()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 28 |\u001b[39m \u001b[90m// - No error messages.\u001b[39m\n \u001b[90m 29 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mlocator(\u001b[32m'text=Error'\u001b[39m))\u001b[33m.\u001b[39mnot\u001b[33m.\u001b[39mtoBeVisible()\u001b[33m;\u001b[39m\n \u001b[90m 30 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\ai-coach-send-a-message.spec.ts", + "column": 146, + "line": 27 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('Based on your workout history and personal records, a good chest workout could include Bench Press and Dips.')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('Based on your workout history and personal records, a good chest workout could include Bench Press and Dips.')\u001b[22m\n\n\n 25 | await expect(page.getByText('What\\'s a good workout for chest?')).toBeVisible();\n 26 | // - AI Coach responds with relevant advice.\n> 27 | await expect(page.getByText('Based on your workout history and personal records, a good chest workout could include Bench Press and Dips.')).toBeVisible();\n | ^\n 28 | // - No error messages.\n 29 | await expect(page.locator('text=Error')).not.toBeVisible();\n 30 | });\n at D:\\Coding\\gymflow\\tests\\ai-coach-send-a-message.spec.ts:27:146" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:49.558Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\ai-coach-send-a-message-V--6abe2-B-AI-Coach---Send-a-Message-chromium\\error-context.md" + } + ], + "errorLocation": { + "file": "D:\\Coding\\gymflow\\tests\\ai-coach-send-a-message.spec.ts", + "column": 146, + "line": 27 + } + } + ], + "status": "unexpected" + } + ], + "id": "ada8e4ce2a1e5a4e4d05-928656e08c3d08baf4cb", + "file": "ai-coach-send-a-message.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "core-auth.spec.ts", + "file": "core-auth.spec.ts", + "column": 0, + "line": 0, + "specs": [ + { + "title": "seed", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 6, + "parallelIndex": 6, + "status": "passed", + "duration": 96, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:49.620Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "bef67075d2189bc8efbd-8b14d48fc424dd4ad792", + "file": "core-auth.spec.ts", + "line": 3, + "column": 1 + } + ] + }, + { + "title": "data-progress.spec.ts", + "file": "data-progress.spec.ts", + "column": 0, + "line": 0, + "specs": [ + { + "title": "seed", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 6, + "parallelIndex": 6, + "status": "passed", + "duration": 100, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:49.760Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "9a47d406e05ab11bdb53-be2ec74307971cae65a2", + "file": "data-progress.spec.ts", + "line": 3, + "column": 1 + } + ] + }, + { + "title": "exercise-library-archive-unarchive-exercise.spec.ts", + "file": "exercise-library-archive-unarchive-exercise.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "II. Workout Management", + "file": "exercise-library-archive-unarchive-exercise.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "B. Exercise Library - Archive/Unarchive Exercise", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 6, + "parallelIndex": 6, + "status": "timedOut", + "duration": 30147, + "error": { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m", + "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + "errors": [ + { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\exercise-library-archive-unarchive-exercise.spec.ts", + "column": 140, + "line": 27 + }, + "message": "Error: locator.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('div').filter({ hasText: /^Exercise to ArchiveFree Weights & Machines$/ }).getByRole('button', { name: 'Archive' })\u001b[22m\n\u001b[2m - locator resolved to \u001b[22m\n\u001b[2m - attempting click action\u001b[22m\n\u001b[2m 2 × waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
…
intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action\u001b[22m\n\u001b[2m - waiting 20ms\u001b[22m\n\u001b[2m 2 × waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
…
intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action\u001b[22m\n\u001b[2m - waiting 100ms\u001b[22m\n\u001b[2m 51 × waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
…
intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\n\n 25 | \n 26 | // 4. Click the 'Archive' icon for an existing exercise.\n> 27 | await page.locator('div').filter({ hasText: /^Exercise to ArchiveFree Weights & Machines$/ }).getByRole('button', { name: 'Archive' }).click();\n | ^\n 28 |\n 29 | // 5. Verify the exercise is marked as archived (or disappears if filtered).\n 30 | await expect(page.getByText('Exercise to Archive')).not.toBeVisible();\n at D:\\Coding\\gymflow\\tests\\exercise-library-archive-unarchive-exercise.spec.ts:27:140" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:49.899Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\exercise-library-archive-u-9d430--Archive-Unarchive-Exercise-chromium\\error-context.md" + } + ] + } + ], + "status": "unexpected" + } + ], + "id": "815096277047911149a9-cb17371ae53066f341bf", + "file": "exercise-library-archive-unarchive-exercise.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "exercise-library-create-custom-exercise-bodyweight-with-percentage.spec.ts", + "file": "exercise-library-create-custom-exercise-bodyweight-with-percentage.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "II. Workout Management", + "file": "exercise-library-create-custom-exercise-bodyweight-with-percentage.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "B. Exercise Library - Create Custom Exercise (Bodyweight with %)", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "passed", + "duration": 2268, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:52.239Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "325c5020f3b3bfcbc3c1-3e775390a5e6b9d15e11", + "file": "exercise-library-create-custom-exercise-bodyweight-with-percentage.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "exercise-library-create-custom-exercise-strength.spec.ts", + "file": "exercise-library-create-custom-exercise-strength.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "II. Workout Management", + "file": "exercise-library-create-custom-exercise-strength.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "B. Exercise Library - Create Custom Exercise (Strength)", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 8, + "parallelIndex": 0, + "status": "passed", + "duration": 2423, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:55.965Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "16f9b3b7fef000a83966-57d2094f42302364b777", + "file": "exercise-library-create-custom-exercise-strength.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "exercise-library-edit-exercise-name.spec.ts", + "file": "exercise-library-edit-exercise-name.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "II. Workout Management", + "file": "exercise-library-edit-exercise-name.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "B. Exercise Library - Edit Exercise Name", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 5, + "status": "failed", + "duration": 2861, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('Edited Exercise Name')\nExpected: visible\nError: strict mode violation: getByText('Edited Exercise Name') resolved to 17 elements:\n 1)
Edited Exercise Name
aka getByText('Edited Exercise Name').first()\n 2)
Edited Exercise Name
aka getByText('Edited Exercise Name').nth(1)\n 3)
Edited Exercise Name
aka getByText('Edited Exercise Name').nth(2)\n 4)
Edited Exercise Name
aka getByText('Edited Exercise Name').nth(3)\n 5)
Edited Exercise Name
aka getByText('Edited Exercise Name').nth(4)\n 6)
Edited Exercise Name
aka getByText('Edited Exercise Name').nth(5)\n 7)
Edited Exercise Name
aka locator('div:nth-child(13) > .overflow-hidden > .font-medium')\n 8)
Edited Exercise Name
aka locator('div:nth-child(14) > .overflow-hidden > .font-medium')\n 9)
Edited Exercise Name
aka locator('div:nth-child(15) > .overflow-hidden > .font-medium')\n 10)
Edited Exercise Name
aka locator('div:nth-child(16) > .overflow-hidden > .font-medium')\n ...\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('Edited Exercise Name')\u001b[22m\n", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('Edited Exercise Name')\nExpected: visible\nError: strict mode violation: getByText('Edited Exercise Name') resolved to 17 elements:\n 1)
Edited Exercise Name
aka getByText('Edited Exercise Name').first()\n 2)
Edited Exercise Name
aka getByText('Edited Exercise Name').nth(1)\n 3)
Edited Exercise Name
aka getByText('Edited Exercise Name').nth(2)\n 4)
Edited Exercise Name
aka getByText('Edited Exercise Name').nth(3)\n 5)
Edited Exercise Name
aka getByText('Edited Exercise Name').nth(4)\n 6)
Edited Exercise Name
aka getByText('Edited Exercise Name').nth(5)\n 7)
Edited Exercise Name
aka locator('div:nth-child(13) > .overflow-hidden > .font-medium')\n 8)
Edited Exercise Name
aka locator('div:nth-child(14) > .overflow-hidden > .font-medium')\n 9)
Edited Exercise Name
aka locator('div:nth-child(15) > .overflow-hidden > .font-medium')\n 10)
Edited Exercise Name
aka locator('div:nth-child(16) > .overflow-hidden > .font-medium')\n ...\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('Edited Exercise Name')\u001b[22m\n\n at D:\\Coding\\gymflow\\tests\\exercise-library-edit-exercise-name.spec.ts:37:58", + "location": { + "file": "D:\\Coding\\gymflow\\tests\\exercise-library-edit-exercise-name.spec.ts", + "column": 58, + "line": 37 + }, + "snippet": "\u001b[0m \u001b[90m 35 |\u001b[39m \u001b[90m// Expected Results:\u001b[39m\n \u001b[90m 36 |\u001b[39m \u001b[90m// - The exercise name is updated in the list.\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 37 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mgetByText(\u001b[32m'Edited Exercise Name'\u001b[39m))\u001b[33m.\u001b[39mtoBeVisible()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 38 |\u001b[39m \u001b[90m// - No error messages.\u001b[39m\n \u001b[90m 39 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mlocator(\u001b[32m'text=Error'\u001b[39m))\u001b[33m.\u001b[39mnot\u001b[33m.\u001b[39mtoBeVisible()\u001b[33m;\u001b[39m\n \u001b[90m 40 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\exercise-library-edit-exercise-name.spec.ts", + "column": 58, + "line": 37 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('Edited Exercise Name')\nExpected: visible\nError: strict mode violation: getByText('Edited Exercise Name') resolved to 17 elements:\n 1)
Edited Exercise Name
aka getByText('Edited Exercise Name').first()\n 2)
Edited Exercise Name
aka getByText('Edited Exercise Name').nth(1)\n 3)
Edited Exercise Name
aka getByText('Edited Exercise Name').nth(2)\n 4)
Edited Exercise Name
aka getByText('Edited Exercise Name').nth(3)\n 5)
Edited Exercise Name
aka getByText('Edited Exercise Name').nth(4)\n 6)
Edited Exercise Name
aka getByText('Edited Exercise Name').nth(5)\n 7)
Edited Exercise Name
aka locator('div:nth-child(13) > .overflow-hidden > .font-medium')\n 8)
Edited Exercise Name
aka locator('div:nth-child(14) > .overflow-hidden > .font-medium')\n 9)
Edited Exercise Name
aka locator('div:nth-child(15) > .overflow-hidden > .font-medium')\n 10)
Edited Exercise Name
aka locator('div:nth-child(16) > .overflow-hidden > .font-medium')\n ...\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('Edited Exercise Name')\u001b[22m\n\n\n 35 | // Expected Results:\n 36 | // - The exercise name is updated in the list.\n> 37 | await expect(page.getByText('Edited Exercise Name')).toBeVisible();\n | ^\n 38 | // - No error messages.\n 39 | await expect(page.locator('text=Error')).not.toBeVisible();\n 40 | });\n at D:\\Coding\\gymflow\\tests\\exercise-library-edit-exercise-name.spec.ts:37:58" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:54.546Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\exercise-library-edit-exer-5a259-ibrary---Edit-Exercise-Name-chromium\\error-context.md" + } + ], + "errorLocation": { + "file": "D:\\Coding\\gymflow\\tests\\exercise-library-edit-exercise-name.spec.ts", + "column": 58, + "line": 37 + } + } + ], + "status": "unexpected" + } + ], + "id": "1083fb449da52da94172-df500cb8ed2f56527585", + "file": "exercise-library-edit-exercise-name.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "exercise-library-filter-exercises-by-name.spec.ts", + "file": "exercise-library-filter-exercises-by-name.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "II. Workout Management", + "file": "exercise-library-filter-exercises-by-name.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "B. Exercise Library - Filter Exercises by Name", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 9, + "parallelIndex": 1, + "status": "timedOut", + "duration": 30154, + "error": { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m", + "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + "errors": [ + { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\exercise-library-filter-exercises-by-name.spec.ts", + "column": 62, + "line": 27 + }, + "message": "Error: locator.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m - waiting for getByRole('button', { name: 'New Exercise' })\u001b[22m\n\u001b[2m - locator resolved to \u001b[22m\n\u001b[2m - attempting click action\u001b[22m\n\u001b[2m 2 × waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
…
intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action\u001b[22m\n\u001b[2m - waiting 20ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m - from
…
subtree intercepts pointer events\u001b[22m\n\u001b[2m 2 × retrying click action\u001b[22m\n\u001b[2m - waiting 100ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
…
intercepts pointer events\u001b[22m\n\u001b[2m 12 × retrying click action\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
…
intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m - from
…
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
…
intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
…
intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
…
intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\n\n 25 |\n 26 | // Create another exercise named \"Tricep Extension\" to ensure filtering works\n> 27 | await page.getByRole('button', { name: 'New Exercise' }).click();\n | ^\n 28 | await page.getByRole('textbox', { name: '0' }).fill('Tricep Extension');\n 29 | await page.getByRole('button', { name: 'Free Weights & Machines' }).click();\n 30 | await page.getByRole('button', { name: 'Create' }).nth(1).click();\n at D:\\Coding\\gymflow\\tests\\exercise-library-filter-exercises-by-name.spec.ts:27:62" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:58.891Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\exercise-library-filter-ex-e2da5----Filter-Exercises-by-Name-chromium\\error-context.md" + } + ] + } + ], + "status": "unexpected" + } + ], + "id": "b581f5989fe4fc594655-5bf93a249265593cfcd4", + "file": "exercise-library-filter-exercises-by-name.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "idle-state-body-weight-defaults-from-profile.spec.ts", + "file": "idle-state-body-weight-defaults-from-profile.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "III. Workout Tracking", + "file": "idle-state-body-weight-defaults-from-profile.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "B. Idle State - Body Weight Defaults from Profile", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 10, + "parallelIndex": 2, + "status": "passed", + "duration": 2347, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:59.051Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "413213e48e8ce3cd4171-0ba98ccdfc508613fa0d", + "file": "idle-state-body-weight-defaults-from-profile.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "idle-state-start-free-workout.spec.ts", + "file": "idle-state-start-free-workout.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "III. Workout Tracking", + "file": "idle-state-start-free-workout.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "B. Idle State - Start Free Workout", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 11, + "parallelIndex": 5, + "status": "failed", + "duration": 7265, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('ΓÇó 75.5kg')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('ΓÇó 75.5kg')\u001b[22m\n", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('ΓÇó 75.5kg')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('ΓÇó 75.5kg')\u001b[22m\n\n at D:\\Coding\\gymflow\\tests\\idle-state-start-free-workout.spec.ts:28:46", + "location": { + "file": "D:\\Coding\\gymflow\\tests\\idle-state-start-free-workout.spec.ts", + "column": 46, + "line": 28 + }, + "snippet": "\u001b[0m \u001b[90m 26 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mgetByText(\u001b[35m/(\\d{2}:){2}\\d{2}/\u001b[39m))\u001b[33m.\u001b[39mtoBeVisible()\u001b[33m;\u001b[39m\n \u001b[90m 27 |\u001b[39m \u001b[90m// - The entered body weight is displayed in the active session header.\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 28 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mgetByText(\u001b[32m'ΓÇó 75.5kg'\u001b[39m))\u001b[33m.\u001b[39mtoBeVisible()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 29 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 30 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 31 |\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\idle-state-start-free-workout.spec.ts", + "column": 46, + "line": 28 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('ΓÇó 75.5kg')\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('ΓÇó 75.5kg')\u001b[22m\n\n\n 26 | await expect(page.getByText(/(\\d{2}:){2}\\d{2}/)).toBeVisible();\n 27 | // - The entered body weight is displayed in the active session header.\n> 28 | await expect(page.getByText('ΓÇó 75.5kg')).toBeVisible();\n | ^\n 29 | });\n 30 | });\n 31 |\n at D:\\Coding\\gymflow\\tests\\idle-state-start-free-workout.spec.ts:28:46" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:59.361Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\idle-state-start-free-work-348a6--State---Start-Free-Workout-chromium\\error-context.md" + } + ], + "errorLocation": { + "file": "D:\\Coding\\gymflow\\tests\\idle-state-start-free-workout.spec.ts", + "column": 46, + "line": 28 + } + } + ], + "status": "unexpected" + } + ], + "id": "3a298c8a08f1a1d43fe8-4a5c9f26480cda840381", + "file": "idle-state-start-free-workout.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "idle-state-start-quick-log.spec.ts", + "file": "idle-state-start-quick-log.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "III. Workout Tracking", + "file": "idle-state-start-quick-log.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "B. Idle State - Start Quick Log", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 8, + "parallelIndex": 0, + "status": "passed", + "duration": 1743, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:19:58.568Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "f9879422aed062a26bdb-2eabcd53e490300a381d", + "file": "idle-state-start-quick-log.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "login-first-time-password-change-short.spec.ts", + "file": "login-first-time-password-change-short.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "I. Core & Authentication", + "file": "login-first-time-password-change-short.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. Login - First-Time Password Change (Password too short)", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 8, + "parallelIndex": 0, + "status": "passed", + "duration": 3188, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:00.352Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "d6ec83a92080d9ed9553-5e2d16d067f34e588deb", + "file": "login-first-time-password-change-short.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "login-first-time-password-change.spec.ts", + "file": "login-first-time-password-change.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "I. Core & Authentication", + "file": "login-first-time-password-change.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. Login - First-Time Password Change", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 10, + "parallelIndex": 2, + "status": "failed", + "duration": 7034, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByRole('heading', { name: 'Change Password' })\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByRole('heading', { name: 'Change Password' })\u001b[22m\n", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByRole('heading', { name: 'Change Password' })\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByRole('heading', { name: 'Change Password' })\u001b[22m\n\n at D:\\Coding\\gymflow\\tests\\login-first-time-password-change.spec.ts:32:74", + "location": { + "file": "D:\\Coding\\gymflow\\tests\\login-first-time-password-change.spec.ts", + "column": 74, + "line": 32 + }, + "snippet": "\u001b[0m \u001b[90m 30 |\u001b[39m \u001b[90m// Expected Results:\u001b[39m\n \u001b[90m 31 |\u001b[39m \u001b[90m// - User is prompted to change password on first login.\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 32 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'heading'\u001b[39m\u001b[33m,\u001b[39m { name\u001b[33m:\u001b[39m \u001b[32m'Change Password'\u001b[39m }))\u001b[33m.\u001b[39mtoBeVisible()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 33 |\u001b[39m\n \u001b[90m 34 |\u001b[39m \u001b[90m// 3. Enter a new password (at least 4 characters).\u001b[39m\n \u001b[90m 35 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'textbox'\u001b[39m)\u001b[33m.\u001b[39mfill(\u001b[32m'newtestpass'\u001b[39m)\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\login-first-time-password-change.spec.ts", + "column": 74, + "line": 32 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByRole('heading', { name: 'Change Password' })\nExpected: visible\nTimeout: 5000ms\nError: element(s) not found\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByRole('heading', { name: 'Change Password' })\u001b[22m\n\n\n 30 | // Expected Results:\n 31 | // - User is prompted to change password on first login.\n> 32 | await expect(page.getByRole('heading', { name: 'Change Password' })).toBeVisible();\n | ^\n 33 |\n 34 | // 3. Enter a new password (at least 4 characters).\n 35 | await page.getByRole('textbox').fill('newtestpass');\n at D:\\Coding\\gymflow\\tests\\login-first-time-password-change.spec.ts:32:74" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:01.660Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\login-first-time-password--08b65--First-Time-Password-Change-chromium\\error-context.md" + } + ], + "errorLocation": { + "file": "D:\\Coding\\gymflow\\tests\\login-first-time-password-change.spec.ts", + "column": 74, + "line": 32 + } + } + ], + "status": "unexpected" + } + ], + "id": "ee7c7620f07e792ddd5e-4f88bd9dc42591bfb0f2", + "file": "login-first-time-password-change.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "login-invalid-credentials.spec.ts", + "file": "login-invalid-credentials.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "I. Core & Authentication", + "file": "login-invalid-credentials.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. Login - Invalid Credentials", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 8, + "parallelIndex": 0, + "status": "passed", + "duration": 1158, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:03.575Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "efc0c905e7bb78ac6cb5-1aba507f5f23b50b3016", + "file": "login-invalid-credentials.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "login-language-selection-english.spec.ts", + "file": "login-language-selection-english.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "I. Core & Authentication", + "file": "login-language-selection-english.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. Login - Language Selection (English)", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 8, + "parallelIndex": 0, + "status": "passed", + "duration": 949, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:04.766Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "b808dd67558ac795209d-caeac76626806ebc6304", + "file": "login-language-selection-english.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "login-language-selection-russian.spec.ts", + "file": "login-language-selection-russian.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "I. Core & Authentication", + "file": "login-language-selection-russian.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. Login - Language Selection (Russian)", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 8, + "parallelIndex": 0, + "status": "passed", + "duration": 955, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:05.745Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "f0302247ef4b90ac0975-520a71510403d8b8c3f8", + "file": "login-language-selection-russian.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "login-successful-authentication.spec.ts", + "file": "login-successful-authentication.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "I. Core & Authentication", + "file": "login-successful-authentication.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. Login - Successful Authentication", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 8, + "parallelIndex": 0, + "status": "passed", + "duration": 2497, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:06.722Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "0e91cbfa43c443fd1835-9813b2b5a79f0d7ee744", + "file": "login-successful-authentication.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "navigation-desktop-navigation-rail.spec.ts", + "file": "navigation-desktop-navigation-rail.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "I. Core & Authentication", + "file": "navigation-desktop-navigation-rail.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "B. Navigation - Desktop Navigation Rail", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 12, + "parallelIndex": 5, + "status": "failed", + "duration": 4989, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('History')\nExpected: visible\nError: strict mode violation: getByText('History') resolved to 3 elements:\n 1) History aka getByText('History').first()\n 2) History aka getByRole('button', { name: 'History' })\n 3)

History

aka getByRole('heading', { name: 'History' })\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('History')\u001b[22m\n", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('History')\nExpected: visible\nError: strict mode violation: getByText('History') resolved to 3 elements:\n 1) History aka getByText('History').first()\n 2) History aka getByRole('button', { name: 'History' })\n 3)

History

aka getByRole('heading', { name: 'History' })\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('History')\u001b[22m\n\n at D:\\Coding\\gymflow\\tests\\navigation-desktop-navigation-rail.spec.ts:28:45", + "location": { + "file": "D:\\Coding\\gymflow\\tests\\navigation-desktop-navigation-rail.spec.ts", + "column": 45, + "line": 28 + }, + "snippet": "\u001b[0m \u001b[90m 26 |\u001b[39m \u001b[90m// Click on 'History'\u001b[39m\n \u001b[90m 27 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'button'\u001b[39m\u001b[33m,\u001b[39m { name\u001b[33m:\u001b[39m \u001b[32m'History'\u001b[39m })\u001b[33m.\u001b[39mclick()\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 28 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mgetByText(\u001b[32m'History'\u001b[39m))\u001b[33m.\u001b[39mtoBeVisible()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 29 |\u001b[39m\n \u001b[90m 30 |\u001b[39m \u001b[90m// Click on 'Stats'\u001b[39m\n \u001b[90m 31 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'button'\u001b[39m\u001b[33m,\u001b[39m { name\u001b[33m:\u001b[39m \u001b[32m'Stats'\u001b[39m })\u001b[33m.\u001b[39mclick()\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\navigation-desktop-navigation-rail.spec.ts", + "column": 45, + "line": 28 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('History')\nExpected: visible\nError: strict mode violation: getByText('History') resolved to 3 elements:\n 1) History aka getByText('History').first()\n 2) History aka getByRole('button', { name: 'History' })\n 3)

History

aka getByRole('heading', { name: 'History' })\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('History')\u001b[22m\n\n\n 26 | // Click on 'History'\n 27 | await page.getByRole('button', { name: 'History' }).click();\n> 28 | await expect(page.getByText('History')).toBeVisible();\n | ^\n 29 |\n 30 | // Click on 'Stats'\n 31 | await page.getByRole('button', { name: 'Stats' }).click();\n at D:\\Coding\\gymflow\\tests\\navigation-desktop-navigation-rail.spec.ts:28:45" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:08.465Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\navigation-desktop-navigat-b0ac4-n---Desktop-Navigation-Rail-chromium\\error-context.md" + } + ], + "errorLocation": { + "file": "D:\\Coding\\gymflow\\tests\\navigation-desktop-navigation-rail.spec.ts", + "column": 45, + "line": 28 + } + } + ], + "status": "unexpected" + } + ], + "id": "b894f7c4c96e0767afff-beccdf3dd23948057cb0", + "file": "navigation-desktop-navigation-rail.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "navigation-mobile-bottom-navigation-bar.spec.ts", + "file": "navigation-mobile-bottom-navigation-bar.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "I. Core & Authentication", + "file": "navigation-mobile-bottom-navigation-bar.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "B. Navigation - Mobile Bottom Navigation Bar", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 13, + "parallelIndex": 2, + "status": "failed", + "duration": 4818, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('History')\nExpected: visible\nError: strict mode violation: getByText('History') resolved to 3 elements:\n 1) History aka getByRole('button', { name: 'History' })\n 2) History aka getByText('History').nth(1)\n 3)

History

aka getByRole('heading', { name: 'History' })\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('History')\u001b[22m\n", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('History')\nExpected: visible\nError: strict mode violation: getByText('History') resolved to 3 elements:\n 1) History aka getByRole('button', { name: 'History' })\n 2) History aka getByText('History').nth(1)\n 3)

History

aka getByRole('heading', { name: 'History' })\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('History')\u001b[22m\n\n at D:\\Coding\\gymflow\\tests\\navigation-mobile-bottom-navigation-bar.spec.ts:28:45", + "location": { + "file": "D:\\Coding\\gymflow\\tests\\navigation-mobile-bottom-navigation-bar.spec.ts", + "column": 45, + "line": 28 + }, + "snippet": "\u001b[0m \u001b[90m 26 |\u001b[39m \u001b[90m// Click on 'History'\u001b[39m\n \u001b[90m 27 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'button'\u001b[39m\u001b[33m,\u001b[39m { name\u001b[33m:\u001b[39m \u001b[32m'History'\u001b[39m })\u001b[33m.\u001b[39mclick()\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 28 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mgetByText(\u001b[32m'History'\u001b[39m))\u001b[33m.\u001b[39mtoBeVisible()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 29 |\u001b[39m\n \u001b[90m 30 |\u001b[39m \u001b[90m// Click on 'Stats'\u001b[39m\n \u001b[90m 31 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'button'\u001b[39m\u001b[33m,\u001b[39m { name\u001b[33m:\u001b[39m \u001b[32m'Stats'\u001b[39m })\u001b[33m.\u001b[39mclick()\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\navigation-mobile-bottom-navigation-bar.spec.ts", + "column": 45, + "line": 28 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('History')\nExpected: visible\nError: strict mode violation: getByText('History') resolved to 3 elements:\n 1) History aka getByRole('button', { name: 'History' })\n 2) History aka getByText('History').nth(1)\n 3)

History

aka getByRole('heading', { name: 'History' })\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('History')\u001b[22m\n\n\n 26 | // Click on 'History'\n 27 | await page.getByRole('button', { name: 'History' }).click();\n> 28 | await expect(page.getByText('History')).toBeVisible();\n | ^\n 29 |\n 30 | // Click on 'Stats'\n 31 | await page.getByRole('button', { name: 'Stats' }).click();\n at D:\\Coding\\gymflow\\tests\\navigation-mobile-bottom-navigation-bar.spec.ts:28:45" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:10.892Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\navigation-mobile-bottom-n-bd4ba-obile-Bottom-Navigation-Bar-chromium\\error-context.md" + } + ], + "errorLocation": { + "file": "D:\\Coding\\gymflow\\tests\\navigation-mobile-bottom-navigation-bar.spec.ts", + "column": 45, + "line": 28 + } + } + ], + "status": "unexpected" + } + ], + "id": "0964b80b040b0a1a1239-7ea6d8ee6f66b0ed5092", + "file": "navigation-mobile-bottom-navigation-bar.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "performance-statistics-view-body-weight-chart.spec.ts", + "file": "performance-statistics-view-body-weight-chart.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "IV. Data & Progress", + "file": "performance-statistics-view-body-weight-chart.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "B. Performance Statistics - View Body Weight Chart", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 8, + "parallelIndex": 0, + "status": "failed", + "duration": 5471, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('81')\nExpected: visible\nError: strict mode violation: getByText('81') resolved to 2 elements:\n 1) 81 aka locator('#recharts-zindex-2000-_r_16_').getByText('81')\n 2) 81 aka locator('#recharts_measurement_span')\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('81')\u001b[22m\n", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('81')\nExpected: visible\nError: strict mode violation: getByText('81') resolved to 2 elements:\n 1) 81 aka locator('#recharts-zindex-2000-_r_16_').getByText('81')\n 2) 81 aka locator('#recharts_measurement_span')\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('81')\u001b[22m\n\n at D:\\Coding\\gymflow\\tests\\performance-statistics-view-body-weight-chart.spec.ts:31:40", + "location": { + "file": "D:\\Coding\\gymflow\\tests\\performance-statistics-view-body-weight-chart.spec.ts", + "column": 40, + "line": 31 + }, + "snippet": "\u001b[0m \u001b[90m 29 |\u001b[39m \u001b[90m// - The chart accurately reflects the user's body weight changes over time.\u001b[39m\n \u001b[90m 30 |\u001b[39m \u001b[90m// NOTE: Verifying chart content visually is hard, will verify presence of relevant text.\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 31 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mgetByText(\u001b[32m'81'\u001b[39m))\u001b[33m.\u001b[39mtoBeVisible()\u001b[33m;\u001b[39m \u001b[90m// Check for some values on the chart axis\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 32 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mgetByText(\u001b[32m'85'\u001b[39m))\u001b[33m.\u001b[39mtoBeVisible()\u001b[33m;\u001b[39m \u001b[90m// Check for some values on the chart axis\u001b[39m\n \u001b[90m 33 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 34 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\performance-statistics-view-body-weight-chart.spec.ts", + "column": 40, + "line": 31 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByText('81')\nExpected: visible\nError: strict mode violation: getByText('81') resolved to 2 elements:\n 1) 81 aka locator('#recharts-zindex-2000-_r_16_').getByText('81')\n 2) 81 aka locator('#recharts_measurement_span')\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByText('81')\u001b[22m\n\n\n 29 | // - The chart accurately reflects the user's body weight changes over time.\n 30 | // NOTE: Verifying chart content visually is hard, will verify presence of relevant text.\n> 31 | await expect(page.getByText('81')).toBeVisible(); // Check for some values on the chart axis\n | ^\n 32 | await expect(page.getByText('85')).toBeVisible(); // Check for some values on the chart axis\n 33 | });\n 34 | });\n at D:\\Coding\\gymflow\\tests\\performance-statistics-view-body-weight-chart.spec.ts:31:40" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:09.245Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\performance-statistics-vie-eb4ff-cs---View-Body-Weight-Chart-chromium\\error-context.md" + } + ], + "errorLocation": { + "file": "D:\\Coding\\gymflow\\tests\\performance-statistics-view-body-weight-chart.spec.ts", + "column": 40, + "line": 31 + } + } + ], + "status": "unexpected" + } + ], + "id": "0c95906ed79492f86d3b-bd4caae75aa374a0fcef", + "file": "performance-statistics-view-body-weight-chart.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "performance-statistics-view-set-count-chart.spec.ts", + "file": "performance-statistics-view-set-count-chart.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "IV. Data & Progress", + "file": "performance-statistics-view-set-count-chart.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "B. Performance Statistics - View Set Count Chart", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 14, + "parallelIndex": 7, + "status": "failed", + "duration": 2607, + "error": { + "message": "Error: locator.fill: Error: strict mode violation: getByRole('spinbutton') resolved to 2 elements:\n 1) aka getByPlaceholder('0').nth(1)\n 2) aka getByPlaceholder('0').nth(2)\n\nCall log:\n\u001b[2m - waiting for getByRole('spinbutton')\u001b[22m\n", + "stack": "Error: locator.fill: Error: strict mode violation: getByRole('spinbutton') resolved to 2 elements:\n 1) aka getByPlaceholder('0').nth(1)\n 2) aka getByPlaceholder('0').nth(2)\n\nCall log:\n\u001b[2m - waiting for getByRole('spinbutton')\u001b[22m\n\n at D:\\Coding\\gymflow\\tests\\performance-statistics-view-set-count-chart.spec.ts:27:40", + "location": { + "file": "D:\\Coding\\gymflow\\tests\\performance-statistics-view-set-count-chart.spec.ts", + "column": 40, + "line": 27 + }, + "snippet": "\u001b[0m \u001b[90m 25 |\u001b[39m\n \u001b[90m 26 |\u001b[39m \u001b[90m// Session 2\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 27 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'spinbutton'\u001b[39m)\u001b[33m.\u001b[39mfill(\u001b[32m'83'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 28 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'button'\u001b[39m\u001b[33m,\u001b[39m { name\u001b[33m:\u001b[39m \u001b[32m'Free Workout'\u001b[39m })\u001b[33m.\u001b[39mclick()\u001b[33m;\u001b[39m\n \u001b[90m 29 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'textbox'\u001b[39m\u001b[33m,\u001b[39m { name\u001b[33m:\u001b[39m \u001b[32m'0'\u001b[39m })\u001b[33m.\u001b[39mfill(\u001b[32m'Bench Press'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 30 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'button'\u001b[39m\u001b[33m,\u001b[39m { name\u001b[33m:\u001b[39m \u001b[32m'Bench Press'\u001b[39m })\u001b[33m.\u001b[39mclick()\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\performance-statistics-view-set-count-chart.spec.ts", + "column": 40, + "line": 27 + }, + "message": "Error: locator.fill: Error: strict mode violation: getByRole('spinbutton') resolved to 2 elements:\n 1) aka getByPlaceholder('0').nth(1)\n 2) aka getByPlaceholder('0').nth(2)\n\nCall log:\n\u001b[2m - waiting for getByRole('spinbutton')\u001b[22m\n\n\n 25 |\n 26 | // Session 2\n> 27 | await page.getByRole('spinbutton').fill('83');\n | ^\n 28 | await page.getByRole('button', { name: 'Free Workout' }).click();\n 29 | await page.getByRole('textbox', { name: '0' }).fill('Bench Press');\n 30 | await page.getByRole('button', { name: 'Bench Press' }).click();\n at D:\\Coding\\gymflow\\tests\\performance-statistics-view-set-count-chart.spec.ts:27:40" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:15.764Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\performance-statistics-vie-534a7-tics---View-Set-Count-Chart-chromium\\error-context.md" + } + ], + "errorLocation": { + "file": "D:\\Coding\\gymflow\\tests\\performance-statistics-view-set-count-chart.spec.ts", + "column": 40, + "line": 27 + } + } + ], + "status": "unexpected" + } + ], + "id": "cb17337051e1c357acc2-32eab82c7ec7dd096d10", + "file": "performance-statistics-view-set-count-chart.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "performance-statistics-view-volume-chart.spec.ts", + "file": "performance-statistics-view-volume-chart.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "IV. Data & Progress", + "file": "performance-statistics-view-volume-chart.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "B. Performance Statistics - View Volume Chart", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 15, + "parallelIndex": 5, + "status": "failed", + "duration": 3042, + "error": { + "message": "Error: locator.fill: Error: strict mode violation: getByRole('spinbutton') resolved to 2 elements:\n 1) aka getByPlaceholder('0').nth(1)\n 2) aka getByPlaceholder('0').nth(2)\n\nCall log:\n\u001b[2m - waiting for getByRole('spinbutton')\u001b[22m\n", + "stack": "Error: locator.fill: Error: strict mode violation: getByRole('spinbutton') resolved to 2 elements:\n 1) aka getByPlaceholder('0').nth(1)\n 2) aka getByPlaceholder('0').nth(2)\n\nCall log:\n\u001b[2m - waiting for getByRole('spinbutton')\u001b[22m\n\n at D:\\Coding\\gymflow\\tests\\performance-statistics-view-volume-chart.spec.ts:27:40", + "location": { + "file": "D:\\Coding\\gymflow\\tests\\performance-statistics-view-volume-chart.spec.ts", + "column": 40, + "line": 27 + }, + "snippet": "\u001b[0m \u001b[90m 25 |\u001b[39m\n \u001b[90m 26 |\u001b[39m \u001b[90m// Session 2\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 27 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'spinbutton'\u001b[39m)\u001b[33m.\u001b[39mfill(\u001b[32m'83'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 28 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'button'\u001b[39m\u001b[33m,\u001b[39m { name\u001b[33m:\u001b[39m \u001b[32m'Free Workout'\u001b[39m })\u001b[33m.\u001b[39mclick()\u001b[33m;\u001b[39m\n \u001b[90m 29 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'textbox'\u001b[39m\u001b[33m,\u001b[39m { name\u001b[33m:\u001b[39m \u001b[32m'0'\u001b[39m })\u001b[33m.\u001b[39mfill(\u001b[32m'Bench Press'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 30 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'button'\u001b[39m\u001b[33m,\u001b[39m { name\u001b[33m:\u001b[39m \u001b[32m'Bench Press'\u001b[39m })\u001b[33m.\u001b[39mclick()\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\performance-statistics-view-volume-chart.spec.ts", + "column": 40, + "line": 27 + }, + "message": "Error: locator.fill: Error: strict mode violation: getByRole('spinbutton') resolved to 2 elements:\n 1) aka getByPlaceholder('0').nth(1)\n 2) aka getByPlaceholder('0').nth(2)\n\nCall log:\n\u001b[2m - waiting for getByRole('spinbutton')\u001b[22m\n\n\n 25 |\n 26 | // Session 2\n> 27 | await page.getByRole('spinbutton').fill('83');\n | ^\n 28 | await page.getByRole('button', { name: 'Free Workout' }).click();\n 29 | await page.getByRole('textbox', { name: '0' }).fill('Bench Press');\n 30 | await page.getByRole('button', { name: 'Bench Press' }).click();\n at D:\\Coding\\gymflow\\tests\\performance-statistics-view-volume-chart.spec.ts:27:40" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:15.840Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\performance-statistics-vie-59696-tistics---View-Volume-Chart-chromium\\error-context.md" + } + ], + "errorLocation": { + "file": "D:\\Coding\\gymflow\\tests\\performance-statistics-view-volume-chart.spec.ts", + "column": 40, + "line": 27 + } + } + ], + "status": "unexpected" + } + ], + "id": "06eae7d5420692957d97-1e8a18b7be20f609a9a0", + "file": "performance-statistics-view-volume-chart.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "session-history-delete-sporadic-set.spec.ts", + "file": "session-history-delete-sporadic-set.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "IV. Data & Progress", + "file": "session-history-delete-sporadic-set.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. Session History - Delete Sporadic Set", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 16, + "parallelIndex": 0, + "status": "passed", + "duration": 7150, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:17.009Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e941aedf22064e3ffd45-0153211d868e42423b28", + "file": "session-history-delete-sporadic-set.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "session-history-edit-past-session-details.spec.ts", + "file": "session-history-edit-past-session-details.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "IV. Data & Progress", + "file": "session-history-edit-past-session-details.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. Session History - Edit Past Session Details", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 17, + "parallelIndex": 2, + "status": "timedOut", + "duration": 30504, + "error": { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m", + "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + "errors": [ + { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\session-history-edit-past-session-details.spec.ts", + "column": 172, + "line": 31 + }, + "message": "Error: locator.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('div').filter({ hasText: /^2025-11-30/ }).filter({ hasText: '1m No plan 83kg' }).filter({ hasText: 'Sets: 1' }).filter({ hasText: '0.4t' }).first()\u001b[22m\n\n\n 29 | // 4. Open the detailed view of a session.\n 30 | // Click on the most recent workout session.\n> 31 | await page.locator('div').filter({ hasText: /^2025-11-30/ }).filter({ hasText: '1m No plan 83kg' }).filter({ hasText: 'Sets: 1' }).filter({ hasText: '0.4t' }).first().click();\n | ^\n 32 |\n 33 | // 5. Modify the 'Start Time', 'End Time', or 'Body Weight'.\n 34 | await page.getByRole('spinbutton').first().fill('85'); // Change body weight\n at D:\\Coding\\gymflow\\tests\\session-history-edit-past-session-details.spec.ts:31:172" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:18.385Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\session-history-edit-past--fa31e---Edit-Past-Session-Details-chromium\\error-context.md" + } + ] + } + ], + "status": "unexpected" + } + ], + "id": "0a8c9caeb92cd1206356-2032531933f1631ff68a", + "file": "session-history-edit-past-session-details.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "session-history-view-detailed-session.spec.ts", + "file": "session-history-view-detailed-session.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "IV. Data & Progress", + "file": "session-history-view-detailed-session.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. Session History - View Detailed Session", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 18, + "parallelIndex": 7, + "status": "timedOut", + "duration": 30373, + "error": { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m", + "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + "errors": [ + { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\session-history-view-detailed-session.spec.ts", + "column": 172, + "line": 31 + }, + "message": "Error: locator.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('div').filter({ hasText: /^2025-11-30/ }).filter({ hasText: '1m No plan 83kg' }).filter({ hasText: 'Sets: 1' }).filter({ hasText: '0.4t' }).first()\u001b[22m\n\n\n 29 | // 4. Click on a workout session entry.\n 30 | // Click on the most recent workout session.\n> 31 | await page.locator('div').filter({ hasText: /^2025-11-30/ }).filter({ hasText: '1m No plan 83kg' }).filter({ hasText: 'Sets: 1' }).filter({ hasText: '0.4t' }).first().click();\n | ^\n 32 |\n 33 | // Expected Results:\n 34 | // - A detailed view of the session opens, showing all individual sets with their metrics.\n at D:\\Coding\\gymflow\\tests\\session-history-view-detailed-session.spec.ts:31:172" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:21.665Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\session-history-view-detai-e4865-ory---View-Detailed-Session-chromium\\error-context.md" + } + ] + } + ], + "status": "unexpected" + } + ], + "id": "6dc06d95cf9af1b59579-1b443a8a2f78400f651e", + "file": "session-history-view-detailed-session.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "session-history-view-past-sessions.spec.ts", + "file": "session-history-view-past-sessions.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "IV. Data & Progress", + "file": "session-history-view-past-sessions.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. Session History - View Past Sessions", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 19, + "parallelIndex": 5, + "status": "failed", + "duration": 8585, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('div').filter({ hasText: 'Bench Press' })\nExpected: visible\nError: strict mode violation: locator('div').filter({ hasText: 'Bench Press' }) resolved to 122 elements:\n 1)
…
aka locator('#root')\n 2)
…
aka getByText('TrackerPlansHistoryStatsAI CoachProfileTrackerPlansHistoryStatsAI')\n 3)
…
aka locator('div').filter({ hasText: 'History2025-11-3008:20 PM<' }).nth(2)\n 4)
…
aka getByText('History2025-11-3008:20 PM<')\n 5)
…
aka getByText('-11-3008:20 PM<1mNo plan85kgSets: 10.4t2025-11-3008:20 PM<1mNo plan85kgSets:')\n 6)
…
aka getByText('Quick Logged Sets2025-11-')\n 7)
…
aka getByText('2025-11-30Bench Press80kg x')\n 8)
…
aka getByText('Bench Press80kg x 508:20 PMBench Press80kg x 508:20 PMBench Press80kg x 508:20')\n 9)
…
aka locator('div').filter({ hasText: /^Bench Press80kg x 508:20 PM$/ }).first()\n 10)
…
aka getByText('Bench Press80kg x 508:20 PM').first()\n ...\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for locator('div').filter({ hasText: 'Bench Press' })\u001b[22m\n", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('div').filter({ hasText: 'Bench Press' })\nExpected: visible\nError: strict mode violation: locator('div').filter({ hasText: 'Bench Press' }) resolved to 122 elements:\n 1)
…
aka locator('#root')\n 2)
…
aka getByText('TrackerPlansHistoryStatsAI CoachProfileTrackerPlansHistoryStatsAI')\n 3)
…
aka locator('div').filter({ hasText: 'History2025-11-3008:20 PM<' }).nth(2)\n 4)
…
aka getByText('History2025-11-3008:20 PM<')\n 5)
…
aka getByText('-11-3008:20 PM<1mNo plan85kgSets: 10.4t2025-11-3008:20 PM<1mNo plan85kgSets:')\n 6)
…
aka getByText('Quick Logged Sets2025-11-')\n 7)
…
aka getByText('2025-11-30Bench Press80kg x')\n 8)
…
aka getByText('Bench Press80kg x 508:20 PMBench Press80kg x 508:20 PMBench Press80kg x 508:20')\n 9)
…
aka locator('div').filter({ hasText: /^Bench Press80kg x 508:20 PM$/ }).first()\n 10)
…
aka getByText('Bench Press80kg x 508:20 PM').first()\n ...\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for locator('div').filter({ hasText: 'Bench Press' })\u001b[22m\n\n at D:\\Coding\\gymflow\\tests\\session-history-view-past-sessions.spec.ts:40:74", + "location": { + "file": "D:\\Coding\\gymflow\\tests\\session-history-view-past-sessions.spec.ts", + "column": 74, + "line": 40 + }, + "snippet": "\u001b[0m \u001b[90m 38 |\u001b[39m \u001b[90m// - All past workout sessions and sporadic sets are displayed, grouped by date.\u001b[39m\n \u001b[90m 39 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'heading'\u001b[39m\u001b[33m,\u001b[39m { name\u001b[33m:\u001b[39m \u001b[32m'History'\u001b[39m }))\u001b[33m.\u001b[39mtoBeVisible()\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 40 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mlocator(\u001b[32m'div'\u001b[39m)\u001b[33m.\u001b[39mfilter({ hasText\u001b[33m:\u001b[39m \u001b[32m'Bench Press'\u001b[39m }))\u001b[33m.\u001b[39mtoBeVisible()\u001b[33m;\u001b[39m \u001b[90m// Check for logged session\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 41 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mlocator(\u001b[32m'div'\u001b[39m)\u001b[33m.\u001b[39mfilter({ hasText\u001b[33m:\u001b[39m \u001b[32m'80kg / 5 reps'\u001b[39m }))\u001b[33m.\u001b[39mtoBeVisible()\u001b[33m;\u001b[39m \u001b[90m// Check for logged sporadic set\u001b[39m\n \u001b[90m 42 |\u001b[39m \u001b[90m// - Each entry shows key summary information (date, duration, plan name, total work, exercise count).\u001b[39m\n \u001b[90m 43 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mlocator(\u001b[32m'div'\u001b[39m)\u001b[33m.\u001b[39mfilter({ hasText\u001b[33m:\u001b[39m \u001b[35m/^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2} [ap]m \\d{1,2}m No plan 83kgSets: \\d{1,2}0.\\d{1,2}t$/\u001b[39m }))\u001b[33m.\u001b[39mtoBeVisible()\u001b[33m;\u001b[39m \u001b[90m// Example check for a workout session summary\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\session-history-view-past-sessions.spec.ts", + "column": 74, + "line": 40 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('div').filter({ hasText: 'Bench Press' })\nExpected: visible\nError: strict mode violation: locator('div').filter({ hasText: 'Bench Press' }) resolved to 122 elements:\n 1)
…
aka locator('#root')\n 2)
…
aka getByText('TrackerPlansHistoryStatsAI CoachProfileTrackerPlansHistoryStatsAI')\n 3)
…
aka locator('div').filter({ hasText: 'History2025-11-3008:20 PM<' }).nth(2)\n 4)
…
aka getByText('History2025-11-3008:20 PM<')\n 5)
…
aka getByText('-11-3008:20 PM<1mNo plan85kgSets: 10.4t2025-11-3008:20 PM<1mNo plan85kgSets:')\n 6)
…
aka getByText('Quick Logged Sets2025-11-')\n 7)
…
aka getByText('2025-11-30Bench Press80kg x')\n 8)
…
aka getByText('Bench Press80kg x 508:20 PMBench Press80kg x 508:20 PMBench Press80kg x 508:20')\n 9)
…
aka locator('div').filter({ hasText: /^Bench Press80kg x 508:20 PM$/ }).first()\n 10)
…
aka getByText('Bench Press80kg x 508:20 PM').first()\n ...\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for locator('div').filter({ hasText: 'Bench Press' })\u001b[22m\n\n\n 38 | // - All past workout sessions and sporadic sets are displayed, grouped by date.\n 39 | await expect(page.getByRole('heading', { name: 'History' })).toBeVisible();\n> 40 | await expect(page.locator('div').filter({ hasText: 'Bench Press' })).toBeVisible(); // Check for logged session\n | ^\n 41 | await expect(page.locator('div').filter({ hasText: '80kg / 5 reps' })).toBeVisible(); // Check for logged sporadic set\n 42 | // - Each entry shows key summary information (date, duration, plan name, total work, exercise count).\n 43 | await expect(page.locator('div').filter({ hasText: /^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2} [ap]m \\d{1,2}m No plan 83kgSets: \\d{1,2}0.\\d{1,2}t$/ })).toBeVisible(); // Example check for a workout session summary\n at D:\\Coding\\gymflow\\tests\\session-history-view-past-sessions.spec.ts:40:74" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:21.944Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\session-history-view-past--98158-istory---View-Past-Sessions-chromium\\error-context.md" + } + ], + "errorLocation": { + "file": "D:\\Coding\\gymflow\\tests\\session-history-view-past-sessions.spec.ts", + "column": 74, + "line": 40 + } + } + ], + "status": "unexpected" + } + ], + "id": "d5c5d0d11b5758182eb1-d160b8e2ad7003706d8e", + "file": "session-history-view-past-sessions.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "sporadic-logging-exercise-search-and-clear.spec.ts", + "file": "sporadic-logging-exercise-search-and-clear.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "III. Workout Tracking", + "file": "sporadic-logging-exercise-search-and-clear.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "D. Sporadic Logging - Exercise Search and Clear", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 20, + "parallelIndex": 3, + "status": "passed", + "duration": 3997, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:22.231Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "bb3574ad1b58859b2d2e-eebedb9c02e1b781d7a6", + "file": "sporadic-logging-exercise-search-and-clear.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "sporadic-logging-log-strength-sporadic-set.spec.ts", + "file": "sporadic-logging-log-strength-sporadic-set.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "III. Workout Tracking", + "file": "sporadic-logging-log-strength-sporadic-set.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "D. Sporadic Logging - Log Strength Sporadic Set", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 21, + "parallelIndex": 4, + "status": "failed", + "duration": 4672, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('div').filter({ hasText: /^Bench Press80 Weight \\(kg\\) \\/ 5 Reps$/ })\nExpected: visible\nError: strict mode violation: locator('div').filter({ hasText: /^Bench Press80 Weight \\(kg\\) \\/ 5 Reps$/ }) resolved to 74 elements:\n 1)
…
aka locator('div').filter({ hasText: /^Bench Press80 Weight \\(kg\\) \\/ 5 Reps$/ }).first()\n 2)
…
aka getByText('Bench Press80 Weight (kg) / 5').first()\n 3)
…
aka locator('div').filter({ hasText: /^Bench Press80 Weight \\(kg\\) \\/ 5 Reps$/ }).nth(2)\n 4)
…
aka getByText('Bench Press80 Weight (kg) / 5').nth(1)\n 5)
…
aka locator('div').filter({ hasText: /^Bench Press80 Weight \\(kg\\) \\/ 5 Reps$/ }).nth(4)\n 6)
…
aka getByText('Bench Press80 Weight (kg) / 5').nth(2)\n 7)
…
aka locator('div:nth-child(4)')\n 8)
…
aka getByText('Bench Press80 Weight (kg) / 5').nth(3)\n 9)
…
aka locator('div:nth-child(5)')\n 10)
…
aka getByText('Bench Press80 Weight (kg) / 5').nth(4)\n ...\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for locator('div').filter({ hasText: /^Bench Press80 Weight \\(kg\\) \\/ 5 Reps$/ })\u001b[22m\n", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('div').filter({ hasText: /^Bench Press80 Weight \\(kg\\) \\/ 5 Reps$/ })\nExpected: visible\nError: strict mode violation: locator('div').filter({ hasText: /^Bench Press80 Weight \\(kg\\) \\/ 5 Reps$/ }) resolved to 74 elements:\n 1)
…
aka locator('div').filter({ hasText: /^Bench Press80 Weight \\(kg\\) \\/ 5 Reps$/ }).first()\n 2)
…
aka getByText('Bench Press80 Weight (kg) / 5').first()\n 3)
…
aka locator('div').filter({ hasText: /^Bench Press80 Weight \\(kg\\) \\/ 5 Reps$/ }).nth(2)\n 4)
…
aka getByText('Bench Press80 Weight (kg) / 5').nth(1)\n 5)
…
aka locator('div').filter({ hasText: /^Bench Press80 Weight \\(kg\\) \\/ 5 Reps$/ }).nth(4)\n 6)
…
aka getByText('Bench Press80 Weight (kg) / 5').nth(2)\n 7)
…
aka locator('div:nth-child(4)')\n 8)
…
aka getByText('Bench Press80 Weight (kg) / 5').nth(3)\n 9)
…
aka locator('div:nth-child(5)')\n 10)
…
aka getByText('Bench Press80 Weight (kg) / 5').nth(4)\n ...\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for locator('div').filter({ hasText: /^Bench Press80 Weight \\(kg\\) \\/ 5 Reps$/ })\u001b[22m\n\n at D:\\Coding\\gymflow\\tests\\sporadic-logging-log-strength-sporadic-set.spec.ts:30:102", + "location": { + "file": "D:\\Coding\\gymflow\\tests\\sporadic-logging-log-strength-sporadic-set.spec.ts", + "column": 102, + "line": 30 + }, + "snippet": "\u001b[0m \u001b[90m 28 |\u001b[39m \u001b[90m// Expected Results:\u001b[39m\n \u001b[90m 29 |\u001b[39m \u001b[90m// - The sporadic set is added to today's history in the Sporadic Logging view.\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 30 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mlocator(\u001b[32m'div'\u001b[39m)\u001b[33m.\u001b[39mfilter({ hasText\u001b[33m:\u001b[39m \u001b[35m/^Bench Press80 Weight \\(kg\\) \\/ 5 Reps$/\u001b[39m }))\u001b[33m.\u001b[39mtoBeVisible()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 31 |\u001b[39m \u001b[90m// - Input fields are cleared.\u001b[39m\n \u001b[90m 32 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mgetByPlaceholder(\u001b[32m'0'\u001b[39m)\u001b[33m.\u001b[39mnth(\u001b[35m1\u001b[39m))\u001b[33m.\u001b[39mtoHaveValue(\u001b[32m''\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 33 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mgetByPlaceholder(\u001b[32m'0'\u001b[39m)\u001b[33m.\u001b[39mnth(\u001b[35m2\u001b[39m))\u001b[33m.\u001b[39mtoHaveValue(\u001b[32m''\u001b[39m)\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\sporadic-logging-log-strength-sporadic-set.spec.ts", + "column": 102, + "line": 30 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('div').filter({ hasText: /^Bench Press80 Weight \\(kg\\) \\/ 5 Reps$/ })\nExpected: visible\nError: strict mode violation: locator('div').filter({ hasText: /^Bench Press80 Weight \\(kg\\) \\/ 5 Reps$/ }) resolved to 74 elements:\n 1)
…
aka locator('div').filter({ hasText: /^Bench Press80 Weight \\(kg\\) \\/ 5 Reps$/ }).first()\n 2)
…
aka getByText('Bench Press80 Weight (kg) / 5').first()\n 3)
…
aka locator('div').filter({ hasText: /^Bench Press80 Weight \\(kg\\) \\/ 5 Reps$/ }).nth(2)\n 4)
…
aka getByText('Bench Press80 Weight (kg) / 5').nth(1)\n 5)
…
aka locator('div').filter({ hasText: /^Bench Press80 Weight \\(kg\\) \\/ 5 Reps$/ }).nth(4)\n 6)
…
aka getByText('Bench Press80 Weight (kg) / 5').nth(2)\n 7)
…
aka locator('div:nth-child(4)')\n 8)
…
aka getByText('Bench Press80 Weight (kg) / 5').nth(3)\n 9)
…
aka locator('div:nth-child(5)')\n 10)
…
aka getByText('Bench Press80 Weight (kg) / 5').nth(4)\n ...\n\nCall log:\n\u001b[2m - Expect \"toBeVisible\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for locator('div').filter({ hasText: /^Bench Press80 Weight \\(kg\\) \\/ 5 Reps$/ })\u001b[22m\n\n\n 28 | // Expected Results:\n 29 | // - The sporadic set is added to today's history in the Sporadic Logging view.\n> 30 | await expect(page.locator('div').filter({ hasText: /^Bench Press80 Weight \\(kg\\) \\/ 5 Reps$/ })).toBeVisible();\n | ^\n 31 | // - Input fields are cleared.\n 32 | await expect(page.getByPlaceholder('0').nth(1)).toHaveValue('');\n 33 | await expect(page.getByPlaceholder('0').nth(2)).toHaveValue('');\n at D:\\Coding\\gymflow\\tests\\sporadic-logging-log-strength-sporadic-set.spec.ts:30:102" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:22.302Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\sporadic-logging-log-stren-da003---Log-Strength-Sporadic-Set-chromium\\error-context.md" + } + ], + "errorLocation": { + "file": "D:\\Coding\\gymflow\\tests\\sporadic-logging-log-strength-sporadic-set.spec.ts", + "column": 102, + "line": 30 + } + } + ], + "status": "unexpected" + } + ], + "id": "e7991d893c7bc86939c6-60b8dac8dc08c920c4d7", + "file": "sporadic-logging-log-strength-sporadic-set.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "ui-ux.spec.ts", + "file": "ui-ux.spec.ts", + "column": 0, + "line": 0, + "specs": [ + { + "title": "seed", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 22, + "parallelIndex": 6, + "status": "passed", + "duration": 521, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:23.151Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "e121d5c986d935446888-4e3aee35455855203239", + "file": "ui-ux.spec.ts", + "line": 3, + "column": 1 + } + ] + }, + { + "title": "user-profile-change-password-too-short.spec.ts", + "file": "user-profile-change-password-too-short.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "V. User & System Management", + "file": "user-profile-change-password-too-short.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. User Profile - Change Password (Too Short)", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 22, + "parallelIndex": 6, + "status": "passed", + "duration": 3960, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:24.268Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "a3cc9d506b5af1b46702-24df7a8b1c30c6f343a1", + "file": "user-profile-change-password-too-short.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "user-profile-change-password.spec.ts", + "file": "user-profile-change-password.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "V. User & System Management", + "file": "user-profile-change-password.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. User Profile - Change Password", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 16, + "parallelIndex": 0, + "status": "passed", + "duration": 6386, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:24.438Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "9b416c5e80affba5daf4-ef4cb20567324e94d700", + "file": "user-profile-change-password.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "user-profile-dedicated-daily-weight-logging.spec.ts", + "file": "user-profile-dedicated-daily-weight-logging.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "V. User & System Management", + "file": "user-profile-dedicated-daily-weight-logging.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. User Profile - Dedicated Daily Weight Logging", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 20, + "parallelIndex": 3, + "status": "timedOut", + "duration": 30030, + "error": { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m", + "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + "errors": [ + { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\user-profile-dedicated-daily-weight-logging.spec.ts", + "column": 57, + "line": 15 + }, + "message": "Error: locator.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m - waiting for getByRole('button', { name: 'Profile' })\u001b[22m\n\n\n 13 |\n 14 | // 2. Navigate to the 'Profile' section.\n> 15 | await page.getByRole('button', { name: 'Profile' }).click();\n | ^\n 16 |\n 17 | // 3. Expand 'Weight Tracker'.\n 18 | await page.getByRole('button', { name: 'Weight Tracker' }).click();\n at D:\\Coding\\gymflow\\tests\\user-profile-dedicated-daily-weight-logging.spec.ts:15:57" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:26.583Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\user-profile-dedicated-dai-c0400-icated-Daily-Weight-Logging-chromium\\error-context.md" + } + ] + } + ], + "status": "unexpected" + } + ], + "id": "462fd088d4f549ceef61-0809e1a954f64272b0bf", + "file": "user-profile-dedicated-daily-weight-logging.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "user-profile-delete-own-account.spec.ts", + "file": "user-profile-delete-own-account.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "V. User & System Management", + "file": "user-profile-delete-own-account.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. User Profile - Delete Own Account", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 23, + "parallelIndex": 4, + "status": "failed", + "duration": 2370, + "error": { + "message": "Error: locator.fill: Error: strict mode violation: getByRole('textbox') resolved to 2 elements:\n 1) aka getByRole('textbox', { name: 'user@gymflow.ai' })\n 2) aka locator('input[type=\"password\"]')\n\nCall log:\n\u001b[2m - waiting for getByRole('textbox')\u001b[22m\n", + "stack": "Error: locator.fill: Error: strict mode violation: getByRole('textbox') resolved to 2 elements:\n 1) aka getByRole('textbox', { name: 'user@gymflow.ai' })\n 2) aka locator('input[type=\"password\"]')\n\nCall log:\n\u001b[2m - waiting for getByRole('textbox')\u001b[22m\n\n at D:\\Coding\\gymflow\\tests\\user-profile-delete-own-account.spec.ts:24:37", + "location": { + "file": "D:\\Coding\\gymflow\\tests\\user-profile-delete-own-account.spec.ts", + "column": 37, + "line": 24 + }, + "snippet": "\u001b[0m \u001b[90m 22 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'button'\u001b[39m\u001b[33m,\u001b[39m { name\u001b[33m:\u001b[39m \u001b[32m'Login'\u001b[39m })\u001b[33m.\u001b[39mclick()\u001b[33m;\u001b[39m\n \u001b[90m 23 |\u001b[39m \u001b[90m// Handle first time login password change\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 24 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'textbox'\u001b[39m)\u001b[33m.\u001b[39mfill(\u001b[32m'newdeletepass'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 25 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'button'\u001b[39m\u001b[33m,\u001b[39m { name\u001b[33m:\u001b[39m \u001b[32m'Save & Login'\u001b[39m })\u001b[33m.\u001b[39mclick()\u001b[33m;\u001b[39m\n \u001b[90m 26 |\u001b[39m\n \u001b[90m 27 |\u001b[39m \u001b[90m// 2. Navigate to the 'Profile' section.\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\user-profile-delete-own-account.spec.ts", + "column": 37, + "line": 24 + }, + "message": "Error: locator.fill: Error: strict mode violation: getByRole('textbox') resolved to 2 elements:\n 1) aka getByRole('textbox', { name: 'user@gymflow.ai' })\n 2) aka locator('input[type=\"password\"]')\n\nCall log:\n\u001b[2m - waiting for getByRole('textbox')\u001b[22m\n\n\n 22 | await page.getByRole('button', { name: 'Login' }).click();\n 23 | // Handle first time login password change\n> 24 | await page.getByRole('textbox').fill('newdeletepass');\n | ^\n 25 | await page.getByRole('button', { name: 'Save & Login' }).click();\n 26 |\n 27 | // 2. Navigate to the 'Profile' section.\n at D:\\Coding\\gymflow\\tests\\user-profile-delete-own-account.spec.ts:24:37" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:30.752Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\user-profile-delete-own-ac-e5360-rofile---Delete-Own-Account-chromium\\error-context.md" + } + ], + "errorLocation": { + "file": "D:\\Coding\\gymflow\\tests\\user-profile-delete-own-account.spec.ts", + "column": 37, + "line": 24 + } + } + ], + "status": "unexpected" + } + ], + "id": "7b849742d8b012010916-98698d08d5b0bf74e18a", + "file": "user-profile-delete-own-account.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "user-profile-language-preference-change.spec.ts", + "file": "user-profile-language-preference-change.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "V. User & System Management", + "file": "user-profile-language-preference-change.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. User Profile - Language Preference Change", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 22, + "parallelIndex": 6, + "status": "timedOut", + "duration": 30058, + "error": { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m", + "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + "errors": [ + { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\user-profile-language-preference-change.spec.ts", + "column": 57, + "line": 15 + }, + "message": "Error: locator.click: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m - waiting for getByRole('button', { name: 'Profile' })\u001b[22m\n\n\n 13 |\n 14 | // 2. Navigate to the 'Profile' section.\n> 15 | await page.getByRole('button', { name: 'Profile' }).click();\n | ^\n 16 |\n 17 | // 3. Select a different language (e.g., '╨á╤â╤ü╤ü╨║╨╕╨╣') from the language dropdown.\n 18 | await page.getByRole('combobox').nth(1).selectOption(['╨á╤â╤ü╤ü╨║╨╕╨╣']);\n at D:\\Coding\\gymflow\\tests\\user-profile-language-preference-change.spec.ts:15:57" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:28.315Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\user-profile-language-pref-e2ecb--Language-Preference-Change-chromium\\error-context.md" + } + ] + } + ], + "status": "unexpected" + } + ], + "id": "1f6df25086ae91f2535d-913fa5172edcb8eaf6f6", + "file": "user-profile-language-preference-change.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "user-profile-update-personal-information.spec.ts", + "file": "user-profile-update-personal-information.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "V. User & System Management", + "file": "user-profile-update-personal-information.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. User Profile - Update Personal Information", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 24, + "parallelIndex": 1, + "status": "failed", + "duration": 7919, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveValue\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: getByRole('combobox').first()\nExpected: \u001b[32m\"F\u001b[7memale\u001b[27m\"\u001b[39m\nReceived: \u001b[31m\"F\u001b[7mEMALE\u001b[27m\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m - Expect \"toHaveValue\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByRole('combobox').first()\u001b[22m\n\u001b[2m 9 ├ù locator resolved to \u001b[22m\n\u001b[2m - unexpected value \"FEMALE\"\u001b[22m\n", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveValue\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: getByRole('combobox').first()\nExpected: \u001b[32m\"F\u001b[7memale\u001b[27m\"\u001b[39m\nReceived: \u001b[31m\"F\u001b[7mEMALE\u001b[27m\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m - Expect \"toHaveValue\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByRole('combobox').first()\u001b[22m\n\u001b[2m 9 ├ù locator resolved to \u001b[22m\n\u001b[2m - unexpected value \"FEMALE\"\u001b[22m\n\n at D:\\Coding\\gymflow\\tests\\user-profile-update-personal-information.spec.ts:37:54", + "location": { + "file": "D:\\Coding\\gymflow\\tests\\user-profile-update-personal-information.spec.ts", + "column": 54, + "line": 37 + }, + "snippet": "\u001b[0m \u001b[90m 35 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'spinbutton'\u001b[39m)\u001b[33m.\u001b[39mnth(\u001b[35m1\u001b[39m))\u001b[33m.\u001b[39mtoHaveValue(\u001b[32m'190'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 36 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mlocator(\u001b[32m'input[type=\"date\"]'\u001b[39m))\u001b[33m.\u001b[39mtoHaveValue(\u001b[32m'1990-01-01'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 37 |\u001b[39m \u001b[36mawait\u001b[39m expect(page\u001b[33m.\u001b[39mgetByRole(\u001b[32m'combobox'\u001b[39m)\u001b[33m.\u001b[39mfirst())\u001b[33m.\u001b[39mtoHaveValue(\u001b[32m'Female'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 38 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 39 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 40 |\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\user-profile-update-personal-information.spec.ts", + "column": 54, + "line": 37 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveValue\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: getByRole('combobox').first()\nExpected: \u001b[32m\"F\u001b[7memale\u001b[27m\"\u001b[39m\nReceived: \u001b[31m\"F\u001b[7mEMALE\u001b[27m\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m - Expect \"toHaveValue\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByRole('combobox').first()\u001b[22m\n\u001b[2m 9 ├ù locator resolved to \u001b[22m\n\u001b[2m - unexpected value \"FEMALE\"\u001b[22m\n\n\n 35 | await expect(page.getByRole('spinbutton').nth(1)).toHaveValue('190');\n 36 | await expect(page.locator('input[type=\"date\"]')).toHaveValue('1990-01-01');\n> 37 | await expect(page.getByRole('combobox').first()).toHaveValue('Female');\n | ^\n 38 | });\n 39 | });\n 40 |\n at D:\\Coding\\gymflow\\tests\\user-profile-update-personal-information.spec.ts:37:54" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:31.942Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\user-profile-update-person-ce75d-Update-Personal-Information-chromium\\error-context.md" + } + ], + "errorLocation": { + "file": "D:\\Coding\\gymflow\\tests\\user-profile-update-personal-information.spec.ts", + "column": 54, + "line": 37 + } + } + ], + "status": "unexpected" + } + ], + "id": "6b2195db2735824a5a2f-a280bc136c83fb0765c3", + "file": "user-profile-update-personal-information.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "user-system-management.spec.ts", + "file": "user-system-management.spec.ts", + "column": 0, + "line": 0, + "specs": [ + { + "title": "seed", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 16, + "parallelIndex": 0, + "status": "passed", + "duration": 193, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:30.879Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "fb639d24def07fb0a9be-88c0c658d3c7d935b643", + "file": "user-system-management.spec.ts", + "line": 3, + "column": 1 + } + ] + }, + { + "title": "workout-management.spec.ts", + "file": "workout-management.spec.ts", + "column": 0, + "line": 0, + "specs": [ + { + "title": "seed", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 25, + "parallelIndex": 5, + "status": "passed", + "duration": 205, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:33.333Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "0657f6e8877d5b69135b-849c91f2f7427ecff212", + "file": "workout-management.spec.ts", + "line": 3, + "column": 1 + } + ] + }, + { + "title": "workout-plans-create-new-plan.spec.ts", + "file": "workout-plans-create-new-plan.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "II. Workout Management", + "file": "workout-plans-create-new-plan.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. Workout Plans - Create New Plan", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 16, + "parallelIndex": 0, + "status": "timedOut", + "duration": 30078, + "error": { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m", + "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + "errors": [ + { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\workout-plans-create-new-plan.spec.ts", + "column": 73, + "line": 21 + }, + "message": "Error: locator.fill: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m - waiting for getByRole('textbox', { name: 'E.g. Full-body Routine' })\u001b[22m\n\n\n 19 |\n 20 | // 4. Enter a 'Plan Name' (e.g., 'My New Strength Plan').\n> 21 | await page.getByRole('textbox', { name: 'E.g. Full-body Routine' }).fill('My New Strength Plan');\n | ^\n 22 |\n 23 | // 5. Enter a 'Description' (e.g., 'Focus on compound lifts').\n 24 | await page.getByRole('textbox', { name: 'Describe preparation...' }).fill('Focus on compound lifts');\n at D:\\Coding\\gymflow\\tests\\workout-plans-create-new-plan.spec.ts:21:73" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:31.126Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\workout-plans-create-new-p-4f68c-out-Plans---Create-New-Plan-chromium\\error-context.md" + } + ] + } + ], + "status": "unexpected" + } + ], + "id": "56aed5698712642f579e-396935ceae733778de1d", + "file": "workout-plans-create-new-plan.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "workout-plans-delete-plan.spec.ts", + "file": "workout-plans-delete-plan.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "II. Workout Management", + "file": "workout-plans-delete-plan.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. Workout Plans - Delete Plan", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 26, + "parallelIndex": 4, + "status": "timedOut", + "duration": 30095, + "error": { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m", + "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + "errors": [ + { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\workout-plans-delete-plan.spec.ts", + "column": 73, + "line": 21 + }, + "message": "Error: locator.fill: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m - waiting for getByRole('textbox', { name: 'E.g. Full-body Routine' })\u001b[22m\n\n\n 19 | // So, we create a new plan here.\n 20 | await page.getByRole('button').filter({ hasText: /^$/ }).nth(2).click(); // Click FAB\n> 21 | await page.getByRole('textbox', { name: 'E.g. Full-body Routine' }).fill('Plan to delete');\n | ^\n 22 | await page.getByRole('textbox', { name: 'Describe preparation...' }).fill('Description for plan to delete');\n 23 | await page.getByRole('button', { name: 'Save' }).click();\n 24 |\n at D:\\Coding\\gymflow\\tests\\workout-plans-delete-plan.spec.ts:21:73" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:35.953Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\workout-plans-delete-plan--4cad3-Workout-Plans---Delete-Plan-chromium\\error-context.md" + } + ] + } + ], + "status": "unexpected" + } + ], + "id": "198bd85ccc95630f26a3-1f0a07bf2bc712f5dadd", + "file": "workout-plans-delete-plan.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "workout-plans-edit-existing-plan.spec.ts", + "file": "workout-plans-edit-existing-plan.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "II. Workout Management", + "file": "workout-plans-edit-existing-plan.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. Workout Plans - Edit Existing Plan", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 25, + "parallelIndex": 5, + "status": "passed", + "duration": 3693, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:33.861Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "cf20c209daf093ee0807-8437d0f25f51bfa1bb94", + "file": "workout-plans-edit-existing-plan.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "workout-plans-reorder-exercises-within-a-plan.spec.ts", + "file": "workout-plans-reorder-exercises-within-a-plan.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "II. Workout Management", + "file": "workout-plans-reorder-exercises-within-a-plan.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. Workout Plans - Reorder Exercises within a Plan", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 25, + "parallelIndex": 5, + "status": "timedOut", + "duration": 30064, + "error": { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m", + "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + "errors": [ + { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\workout-plans-reorder-exercises-within-a-plan.spec.ts", + "column": 73, + "line": 19 + }, + "message": "Error: locator.fill: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m - waiting for getByRole('textbox', { name: 'E.g. Full-body Routine' })\u001b[22m\n\n\n 17 | // 3. Create a plan with at least two exercises.\n 18 | await page.getByRole('button').filter({ hasText: /^$/ }).nth(2).click(); // Click FAB\n> 19 | await page.getByRole('textbox', { name: 'E.g. Full-body Routine' }).fill('Reorder Test Plan');\n | ^\n 20 | await page.getByRole('textbox', { name: 'Describe preparation...' }).fill('Test plan for reordering exercises');\n 21 | await page.getByRole('button', { name: 'Add Exercise' }).click();\n 22 | await page.getByRole('button', { name: 'Squats BODYWEIGHT' }).click();\n at D:\\Coding\\gymflow\\tests\\workout-plans-reorder-exercises-within-a-plan.spec.ts:19:73" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:37.609Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\workout-plans-reorder-exer-420a5-der-Exercises-within-a-Plan-chromium\\error-context.md" + } + ] + } + ], + "status": "unexpected" + } + ], + "id": "dba0b6fbc9a2aa0cf654-c24625881728bac49b3d", + "file": "workout-plans-reorder-exercises-within-a-plan.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "workout-plans-start-session-from-plan.spec.ts", + "file": "workout-plans-start-session-from-plan.spec.ts", + "column": 0, + "line": 0, + "specs": [], + "suites": [ + { + "title": "II. Workout Management", + "file": "workout-plans-start-session-from-plan.spec.ts", + "line": 6, + "column": 6, + "specs": [ + { + "title": "A. Workout Plans - Start Session from Plan", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 27, + "parallelIndex": 1, + "status": "timedOut", + "duration": 30072, + "error": { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m", + "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + "errors": [ + { + "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m" + }, + { + "location": { + "file": "D:\\Coding\\gymflow\\tests\\workout-plans-start-session-from-plan.spec.ts", + "column": 73, + "line": 19 + }, + "message": "Error: locator.fill: Test timeout of 30000ms exceeded.\nCall log:\n\u001b[2m - waiting for getByRole('textbox', { name: 'E.g. Full-body Routine' })\u001b[22m\n\n\n 17 | // 3. Create a plan with at least one exercise.\n 18 | await page.getByRole('button').filter({ hasText: /^$/ }).nth(4).click(); // Click FAB\n> 19 | await page.getByRole('textbox', { name: 'E.g. Full-body Routine' }).fill('Start Session Test Plan');\n | ^\n 20 | await page.getByRole('textbox', { name: 'Describe preparation...' }).fill('Test plan for starting a session');\n 21 | await page.getByRole('button', { name: 'Add Exercise' }).click();\n 22 | await page.getByRole('button', { name: 'Squats BODYWEIGHT' }).click();\n at D:\\Coding\\gymflow\\tests\\workout-plans-start-session-from-plan.spec.ts:19:73" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:41.468Z", + "annotations": [], + "attachments": [ + { + "name": "error-context", + "contentType": "text/markdown", + "path": "D:\\Coding\\gymflow\\test-results\\workout-plans-start-sessio-41745-s---Start-Session-from-Plan-chromium\\error-context.md" + } + ] + } + ], + "status": "unexpected" + } + ], + "id": "6f604cdf8f1f69dfae98-dd73ad9a439d88370a64", + "file": "workout-plans-start-session-from-plan.spec.ts", + "line": 7, + "column": 3 + } + ] + } + ] + }, + { + "title": "workout-tracking.spec.ts", + "file": "workout-tracking.spec.ts", + "column": 0, + "line": 0, + "specs": [ + { + "title": "seed", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 30000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 28, + "parallelIndex": 2, + "status": "passed", + "duration": 150, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2025-11-30T18:20:50.837Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "8da950f07c07d22e116e-20fb5c321088ea5d8e34", + "file": "workout-tracking.spec.ts", + "line": 3, + "column": 1 + } + ] + } + ], + "errors": [], + "stats": { + "startTime": "2025-11-30T18:19:39.424Z", + "duration": 92453.96500000001, + "expected": 26, + "skipped": 0, + "unexpected": 28, + "flaky": 0 + } +} diff --git a/tests/active-session-delete-logged-set.spec.ts b/tests/active-session-delete-logged-set.spec.ts index edaf482..bbc0d99 100644 --- a/tests/active-session-delete-logged-set.spec.ts +++ b/tests/active-session-delete-logged-set.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('III. Workout Tracking', () => { test('C. Active Session - Delete Logged Set', async ({ page }) => { // 1. Start a 'Free Workout' session. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/active-session-finish-session.spec.ts b/tests/active-session-finish-session.spec.ts index 68caec5..4b7f0b1 100644 --- a/tests/active-session-finish-session.spec.ts +++ b/tests/active-session-finish-session.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('III. Workout Tracking', () => { test('C. Active Session - Finish Session', async ({ page }) => { // 1. Start a 'Free Workout' session. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/active-session-log-bodyweight-set.spec.ts b/tests/active-session-log-bodyweight-set.spec.ts index 87f6674..7684047 100644 --- a/tests/active-session-log-bodyweight-set.spec.ts +++ b/tests/active-session-log-bodyweight-set.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('III. Workout Tracking', () => { test('C. Active Session - Log Bodyweight Set', async ({ page }) => { // 1. Start a 'Free Workout' session. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/active-session-log-cardio-set.spec.ts b/tests/active-session-log-cardio-set.spec.ts index 6cd1044..7ba5490 100644 --- a/tests/active-session-log-cardio-set.spec.ts +++ b/tests/active-session-log-cardio-set.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('III. Workout Tracking', () => { test('C. Active Session - Log Cardio Set', async ({ page }) => { // 1. Start a 'Free Workout' session. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/active-session-log-strength-set.spec.ts b/tests/active-session-log-strength-set.spec.ts index f80dcd6..7a8996e 100644 --- a/tests/active-session-log-strength-set.spec.ts +++ b/tests/active-session-log-strength-set.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('III. Workout Tracking', () => { test('C. Active Session - Log Strength Set', async ({ page }) => { // 1. Start a 'Free Workout' session (ensure body weight is set). - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/active-session-plan-progression-and-jump-to-step.spec.ts b/tests/active-session-plan-progression-and-jump-to-step.spec.ts index 25502bf..fe3ce3e 100644 --- a/tests/active-session-plan-progression-and-jump-to-step.spec.ts +++ b/tests/active-session-plan-progression-and-jump-to-step.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('III. Workout Tracking', () => { test('C. Active Session - Plan Progression and Jump to Step', async ({ page }) => { // 1. Start a session from a workout plan with multiple steps. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/active-session-quit-session-without-saving.spec.ts b/tests/active-session-quit-session-without-saving.spec.ts index 6823c2a..99d9f54 100644 --- a/tests/active-session-quit-session-without-saving.spec.ts +++ b/tests/active-session-quit-session-without-saving.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('III. Workout Tracking', () => { test('C. Active Session - Quit Session Without Saving', async ({ page }) => { // 1. Start a 'Free Workout' session. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/admin-panel-block-unblock-user.spec.ts b/tests/admin-panel-block-unblock-user.spec.ts index 13e8342..e105ce1 100644 --- a/tests/admin-panel-block-unblock-user.spec.ts +++ b/tests/admin-panel-block-unblock-user.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('V. User & System Management', () => { test('C. Admin Panel - Block/Unblock User', async ({ page }) => { // 1. Log in as an 'ADMIN' user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/admin-panel-create-new-user.spec.ts b/tests/admin-panel-create-new-user.spec.ts index c2b0748..9a6136e 100644 --- a/tests/admin-panel-create-new-user.spec.ts +++ b/tests/admin-panel-create-new-user.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('V. User & System Management', () => { test('C. Admin Panel - Create New User', async ({ page }) => { // 1. Log in as an 'ADMIN' user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/admin-panel-delete-user.spec.ts b/tests/admin-panel-delete-user.spec.ts index 6de4104..6aaaf91 100644 --- a/tests/admin-panel-delete-user.spec.ts +++ b/tests/admin-panel-delete-user.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('V. User & System Management', () => { test('C. Admin Panel - Delete User', async ({ page }) => { // 1. Log in as an 'ADMIN' user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/admin-panel-view-user-list.spec.ts b/tests/admin-panel-view-user-list.spec.ts index 2aca379..742d8e0 100644 --- a/tests/admin-panel-view-user-list.spec.ts +++ b/tests/admin-panel-view-user-list.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('V. User & System Management', () => { test('C. Admin Panel - View User List', async ({ page }) => { // 1. Log in as an 'ADMIN' user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/ai-coach-send-a-message.spec.ts b/tests/ai-coach-send-a-message.spec.ts index 8c02dbd..5c33756 100644 --- a/tests/ai-coach-send-a-message.spec.ts +++ b/tests/ai-coach-send-a-message.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('V. User & System Management', () => { test('B. AI Coach - Send a Message', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/exercise-library-archive-unarchive-exercise.spec.ts b/tests/exercise-library-archive-unarchive-exercise.spec.ts index 7799896..c50a9f1 100644 --- a/tests/exercise-library-archive-unarchive-exercise.spec.ts +++ b/tests/exercise-library-archive-unarchive-exercise.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('II. Workout Management', () => { test('B. Exercise Library - Archive/Unarchive Exercise', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/exercise-library-create-custom-exercise-bodyweight-with-percentage.spec.ts b/tests/exercise-library-create-custom-exercise-bodyweight-with-percentage.spec.ts index c965627..9a86eb0 100644 --- a/tests/exercise-library-create-custom-exercise-bodyweight-with-percentage.spec.ts +++ b/tests/exercise-library-create-custom-exercise-bodyweight-with-percentage.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('II. Workout Management', () => { test('B. Exercise Library - Create Custom Exercise (Bodyweight with %)', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/exercise-library-create-custom-exercise-strength.spec.ts b/tests/exercise-library-create-custom-exercise-strength.spec.ts index 58d1b16..31ac180 100644 --- a/tests/exercise-library-create-custom-exercise-strength.spec.ts +++ b/tests/exercise-library-create-custom-exercise-strength.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('II. Workout Management', () => { test('B. Exercise Library - Create Custom Exercise (Strength)', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/exercise-library-edit-exercise-name.spec.ts b/tests/exercise-library-edit-exercise-name.spec.ts index a816b5d..e9d8881 100644 --- a/tests/exercise-library-edit-exercise-name.spec.ts +++ b/tests/exercise-library-edit-exercise-name.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('II. Workout Management', () => { test('B. Exercise Library - Edit Exercise Name', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/exercise-library-filter-exercises-by-name.spec.ts b/tests/exercise-library-filter-exercises-by-name.spec.ts index f55d47e..d293b5a 100644 --- a/tests/exercise-library-filter-exercises-by-name.spec.ts +++ b/tests/exercise-library-filter-exercises-by-name.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('II. Workout Management', () => { test('B. Exercise Library - Filter Exercises by Name', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/idle-state-body-weight-defaults-from-profile.spec.ts b/tests/idle-state-body-weight-defaults-from-profile.spec.ts index 8464b5b..e98ef9f 100644 --- a/tests/idle-state-body-weight-defaults-from-profile.spec.ts +++ b/tests/idle-state-body-weight-defaults-from-profile.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('III. Workout Tracking', () => { test('B. Idle State - Body Weight Defaults from Profile', async ({ page }) => { // 1. Log in as a regular user with a weight set in their profile. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/idle-state-start-free-workout.spec.ts b/tests/idle-state-start-free-workout.spec.ts index 2be6704..e1889f5 100644 --- a/tests/idle-state-start-free-workout.spec.ts +++ b/tests/idle-state-start-free-workout.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('III. Workout Tracking', () => { test('B. Idle State - Start Free Workout', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/idle-state-start-quick-log.spec.ts b/tests/idle-state-start-quick-log.spec.ts index 02411ba..a2d9419 100644 --- a/tests/idle-state-start-quick-log.spec.ts +++ b/tests/idle-state-start-quick-log.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('III. Workout Tracking', () => { test('B. Idle State - Start Quick Log', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/login-first-time-password-change-short.spec.ts b/tests/login-first-time-password-change-short.spec.ts index 0b2c6d8..8751ced 100644 --- a/tests/login-first-time-password-change-short.spec.ts +++ b/tests/login-first-time-password-change-short.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('I. Core & Authentication', () => { test('A. Login - First-Time Password Change (Password too short)', async ({ page }) => { // 1. Navigate to the login page. - await page.goto('http://192.168.50.234:3000/'); + 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'); diff --git a/tests/login-first-time-password-change.spec.ts b/tests/login-first-time-password-change.spec.ts index 13549db..f3f87af 100644 --- a/tests/login-first-time-password-change.spec.ts +++ b/tests/login-first-time-password-change.spec.ts @@ -6,7 +6,7 @@ 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://192.168.50.234:3000/'); + 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'); @@ -40,7 +40,8 @@ test.describe('I. Core & Authentication', () => { // Expected Results: // - New password is set successfully. // - User is logged into the application. - await expect(page).toHaveURL('http://192.168.50.234:3000/#/tracker'); + 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/login-invalid-credentials.spec.ts b/tests/login-invalid-credentials.spec.ts index 1509964..4f8a223 100644 --- a/tests/login-invalid-credentials.spec.ts +++ b/tests/login-invalid-credentials.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('I. Core & Authentication', () => { test('A. Login - Invalid Credentials', async ({ page }) => { // 1. Navigate to the login page. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); // 2. Enter an invalid email or password. await page.getByRole('textbox', { name: 'user@gymflow.ai' }).fill('invalid@gymflow.ai'); @@ -19,6 +19,6 @@ test.describe('I. Core & Authentication', () => { // - An error message 'Invalid credentials' or similar is displayed. await expect(page.locator('text=Invalid credentials')).toBeVisible(); // - User remains on the login page. - await expect(page).toHaveURL('http://192.168.50.234:3000/#/login'); + await expect(page).toHaveURL('http://localhost:3000/'); }); }); diff --git a/tests/login-language-selection-english.spec.ts b/tests/login-language-selection-english.spec.ts index 976889f..0e5c179 100644 --- a/tests/login-language-selection-english.spec.ts +++ b/tests/login-language-selection-english.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('I. Core & Authentication', () => { test('A. Login - Language Selection (English)', async ({ page }) => { // 1. Navigate to the login page. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); // 2. Select 'English' from the language dropdown. // The default language is English, so we just need to verify the text elements. diff --git a/tests/login-language-selection-russian.spec.ts b/tests/login-language-selection-russian.spec.ts index 814ce72..7bd0579 100644 --- a/tests/login-language-selection-russian.spec.ts +++ b/tests/login-language-selection-russian.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('I. Core & Authentication', () => { test('A. Login - Language Selection (Russian)', async ({ page }) => { // 1. Navigate to the login page. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); // 2. Select 'Русский' from the language dropdown. await page.getByRole('combobox').selectOption(['Русский']); diff --git a/tests/login-successful-authentication.spec.ts b/tests/login-successful-authentication.spec.ts index 4c09f29..52fdbaf 100644 --- a/tests/login-successful-authentication.spec.ts +++ b/tests/login-successful-authentication.spec.ts @@ -5,8 +5,8 @@ import { test, expect } from '@playwright/test'; test.describe('I. Core & Authentication', () => { test('A. Login - Successful Authentication', async ({ page }) => { - // 1. Navigate to the login page (http://192.168.50.234:3000/). - await page.goto('http://192.168.50.234:3000/'); + // 1. Navigate to the login page (http://localhost:3000/). + await page.goto('http://localhost:3000/'); // 2. Enter a valid email in the email field. await page.getByRole('textbox', { name: 'user@gymflow.ai' }).fill('admin@gymflow.ai'); @@ -17,9 +17,13 @@ test.describe('I. Core & Authentication', () => { // 4. Click the 'Login' button. await page.getByRole('button', { name: 'Login' }).click(); + // Wait for navigation to complete + await page.waitForLoadState('networkidle'); + // Expected Results: // - User is redirected to the main application dashboard (e.g., Tracker view). - await expect(page).toHaveURL('http://192.168.50.234:3000/#/tracker'); + // - We verify this by checking for the presence of the navigation bar with 'Tracker' button. + 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/navigation-desktop-navigation-rail.spec.ts b/tests/navigation-desktop-navigation-rail.spec.ts index a19954d..feae1f8 100644 --- a/tests/navigation-desktop-navigation-rail.spec.ts +++ b/tests/navigation-desktop-navigation-rail.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('I. Core & Authentication', () => { test('B. Navigation - Desktop Navigation Rail', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/navigation-mobile-bottom-navigation-bar.spec.ts b/tests/navigation-mobile-bottom-navigation-bar.spec.ts index 26a7752..613aca6 100644 --- a/tests/navigation-mobile-bottom-navigation-bar.spec.ts +++ b/tests/navigation-mobile-bottom-navigation-bar.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('I. Core & Authentication', () => { test('B. Navigation - Mobile Bottom Navigation Bar', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/performance-statistics-view-body-weight-chart.spec.ts b/tests/performance-statistics-view-body-weight-chart.spec.ts index 15437af..c8dfb6d 100644 --- a/tests/performance-statistics-view-body-weight-chart.spec.ts +++ b/tests/performance-statistics-view-body-weight-chart.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('IV. Data & Progress', () => { test('B. Performance Statistics - View Body Weight Chart', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/performance-statistics-view-set-count-chart.spec.ts b/tests/performance-statistics-view-set-count-chart.spec.ts index 248f1a5..f3ec92f 100644 --- a/tests/performance-statistics-view-set-count-chart.spec.ts +++ b/tests/performance-statistics-view-set-count-chart.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('IV. Data & Progress', () => { test('B. Performance Statistics - View Set Count Chart', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/performance-statistics-view-volume-chart.spec.ts b/tests/performance-statistics-view-volume-chart.spec.ts index 965bb9a..704316b 100644 --- a/tests/performance-statistics-view-volume-chart.spec.ts +++ b/tests/performance-statistics-view-volume-chart.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('IV. Data & Progress', () => { test('B. Performance Statistics - View Volume Chart', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/session-history-delete-sporadic-set.spec.ts b/tests/session-history-delete-sporadic-set.spec.ts index 54d1b59..1a55f19 100644 --- a/tests/session-history-delete-sporadic-set.spec.ts +++ b/tests/session-history-delete-sporadic-set.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('IV. Data & Progress', () => { test('A. Session History - Delete Sporadic Set', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/session-history-edit-past-session-details.spec.ts b/tests/session-history-edit-past-session-details.spec.ts index b5d715d..fbfac11 100644 --- a/tests/session-history-edit-past-session-details.spec.ts +++ b/tests/session-history-edit-past-session-details.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('IV. Data & Progress', () => { test('A. Session History - Edit Past Session Details', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/session-history-view-detailed-session.spec.ts b/tests/session-history-view-detailed-session.spec.ts index 7767671..16e8b7d 100644 --- a/tests/session-history-view-detailed-session.spec.ts +++ b/tests/session-history-view-detailed-session.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('IV. Data & Progress', () => { test('A. Session History - View Detailed Session', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/session-history-view-past-sessions.spec.ts b/tests/session-history-view-past-sessions.spec.ts index 2425736..f0dca22 100644 --- a/tests/session-history-view-past-sessions.spec.ts +++ b/tests/session-history-view-past-sessions.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('IV. Data & Progress', () => { test('A. Session History - View Past Sessions', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/sporadic-logging-exercise-search-and-clear.spec.ts b/tests/sporadic-logging-exercise-search-and-clear.spec.ts index 7964b12..e14dc7f 100644 --- a/tests/sporadic-logging-exercise-search-and-clear.spec.ts +++ b/tests/sporadic-logging-exercise-search-and-clear.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('III. Workout Tracking', () => { test('D. Sporadic Logging - Exercise Search and Clear', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/sporadic-logging-log-strength-sporadic-set.spec.ts b/tests/sporadic-logging-log-strength-sporadic-set.spec.ts index 3ce19a6..b9fac42 100644 --- a/tests/sporadic-logging-log-strength-sporadic-set.spec.ts +++ b/tests/sporadic-logging-log-strength-sporadic-set.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('III. Workout Tracking', () => { test('D. Sporadic Logging - Log Strength Sporadic Set', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/user-profile-change-password-too-short.spec.ts b/tests/user-profile-change-password-too-short.spec.ts index 93bb9ec..365a03d 100644 --- a/tests/user-profile-change-password-too-short.spec.ts +++ b/tests/user-profile-change-password-too-short.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('V. User & System Management', () => { test('A. User Profile - Change Password (Too Short)', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/user-profile-change-password.spec.ts b/tests/user-profile-change-password.spec.ts index 61dc4bc..676b490 100644 --- a/tests/user-profile-change-password.spec.ts +++ b/tests/user-profile-change-password.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('V. User & System Management', () => { test('A. User Profile - Change Password', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/user-profile-dedicated-daily-weight-logging.spec.ts b/tests/user-profile-dedicated-daily-weight-logging.spec.ts index c72085d..87ab6d6 100644 --- a/tests/user-profile-dedicated-daily-weight-logging.spec.ts +++ b/tests/user-profile-dedicated-daily-weight-logging.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('V. User & System Management', () => { test('A. User Profile - Dedicated Daily Weight Logging', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/user-profile-delete-own-account.spec.ts b/tests/user-profile-delete-own-account.spec.ts index 8f09408..37c6210 100644 --- a/tests/user-profile-delete-own-account.spec.ts +++ b/tests/user-profile-delete-own-account.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('V. User & System Management', () => { test('A. User Profile - Delete Own Account', async ({ page }) => { // Prerequisite: Create a regular user for this test. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); @@ -38,6 +38,7 @@ test.describe('V. User & System Management', () => { // Expected Results: // - User account is deleted. // - User is logged out and redirected to the login page. - await expect(page).toHaveURL('http://192.168.50.234:3000/#/login'); + await page.waitForLoadState('networkidle'); + await expect(page.getByRole('button', { name: 'Login' })).toBeVisible(); }); }); diff --git a/tests/user-profile-language-preference-change.spec.ts b/tests/user-profile-language-preference-change.spec.ts index 31d2828..771602b 100644 --- a/tests/user-profile-language-preference-change.spec.ts +++ b/tests/user-profile-language-preference-change.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('V. User & System Management', () => { test('A. User Profile - Language Preference Change', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/user-profile-update-personal-information.spec.ts b/tests/user-profile-update-personal-information.spec.ts index 4e2a1d7..83b6bc3 100644 --- a/tests/user-profile-update-personal-information.spec.ts +++ b/tests/user-profile-update-personal-information.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('V. User & System Management', () => { test('A. User Profile - Update Personal Information', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/workout-plans-create-new-plan.spec.ts b/tests/workout-plans-create-new-plan.spec.ts index a6a964b..0c3da90 100644 --- a/tests/workout-plans-create-new-plan.spec.ts +++ b/tests/workout-plans-create-new-plan.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('II. Workout Management', () => { test('A. Workout Plans - Create New Plan', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/workout-plans-delete-plan.spec.ts b/tests/workout-plans-delete-plan.spec.ts index f2be7d2..8f34295 100644 --- a/tests/workout-plans-delete-plan.spec.ts +++ b/tests/workout-plans-delete-plan.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('II. Workout Management', () => { test('A. Workout Plans - Delete Plan', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/workout-plans-edit-existing-plan.spec.ts b/tests/workout-plans-edit-existing-plan.spec.ts index 8449105..2dc585a 100644 --- a/tests/workout-plans-edit-existing-plan.spec.ts +++ b/tests/workout-plans-edit-existing-plan.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('II. Workout Management', () => { test('A. Workout Plans - Edit Existing Plan', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/workout-plans-reorder-exercises-within-a-plan.spec.ts b/tests/workout-plans-reorder-exercises-within-a-plan.spec.ts index 3f0d071..31de88c 100644 --- a/tests/workout-plans-reorder-exercises-within-a-plan.spec.ts +++ b/tests/workout-plans-reorder-exercises-within-a-plan.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('II. Workout Management', () => { test('A. Workout Plans - Reorder Exercises within a Plan', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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(); diff --git a/tests/workout-plans-start-session-from-plan.spec.ts b/tests/workout-plans-start-session-from-plan.spec.ts index a20bc84..e5f05f9 100644 --- a/tests/workout-plans-start-session-from-plan.spec.ts +++ b/tests/workout-plans-start-session-from-plan.spec.ts @@ -6,7 +6,7 @@ import { test, expect } from '@playwright/test'; test.describe('II. Workout Management', () => { test('A. Workout Plans - Start Session from Plan', async ({ page }) => { // 1. Log in as a regular user. - await page.goto('http://192.168.50.234:3000/'); + await page.goto('http://localhost:3000/'); 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();