Files
gridpilot.gg/tests/shared/auth-fixture.ts
Marc Mintel 9894c4a841
Some checks failed
CI / lint-typecheck (pull_request) Failing after 13s
CI / tests (pull_request) Has been skipped
CI / contract-tests (pull_request) Has been skipped
CI / e2e-tests (pull_request) Has been skipped
CI / comment-pr (pull_request) Has been skipped
CI / commit-types (pull_request) Has been skipped
code quality
2026-01-27 16:30:03 +01:00

106 lines
3.4 KiB
TypeScript

import { test as baseTest, Page } from '@playwright/test';
/**
* Shared Playwright fixture for authentication
* Provides authenticated browsers for different user roles
*/
interface AuthFixture {
authenticatedDriver: Page;
unonboardedDriver: Page;
authenticatedAdmin: Page;
unauthenticatedPage: Page;
}
const DEMO_PASSWORD = 'Demo1234!';
export const testWithAuth = baseTest.extend<AuthFixture>({
authenticatedDriver: async ({ browser }, use) => {
const context = await browser.newContext();
const page = await context.newPage();
// Navigate to login page
await page.goto('/auth/login');
// Wait for the form to be ready
await page.waitForSelector('[data-testid="email-input"]', { state: 'visible', timeout: 10000 });
// Fill and submit login form
await page.getByTestId('email-input').fill('demo.driver@example.com');
await page.getByTestId('password-input').fill(DEMO_PASSWORD);
await page.getByTestId('login-submit').click();
// Wait for redirect to dashboard or another authenticated page
await page.waitForURL('**/dashboard**', { timeout: 15000 });
await use(page);
await context.close();
},
unonboardedDriver: async ({ browser }, use) => {
const context = await browser.newContext();
const page = await context.newPage();
// Navigate to login page
await page.goto('/auth/login');
// Wait for the form to be ready
await page.waitForSelector('[data-testid="email-input"]', { state: 'visible', timeout: 10000 });
// Fill and submit login form
await page.getByTestId('email-input').fill('demo.driver@example.com');
await page.getByTestId('password-input').fill(DEMO_PASSWORD);
await page.getByTestId('login-submit').click();
// Wait for redirect to onboarding or dashboard
// Note: If the user is already onboarded in the current environment, they will land on /dashboard
try {
await Promise.race([
page.waitForURL('**/onboarding**', { timeout: 15000 }),
page.waitForURL('**/dashboard**', { timeout: 15000 })
]);
} catch (e) {
console.log('Navigation timeout: User did not redirect to onboarding or dashboard');
}
// If we are on dashboard but need to be on onboarding for tests,
// we navigate to /onboarding?force=true to bypass the redirect
if (page.url().includes('/dashboard')) {
await page.goto('/onboarding?force=true');
}
await use(page);
await context.close();
},
authenticatedAdmin: async ({ browser }, use) => {
const context = await browser.newContext();
const page = await context.newPage();
// Navigate to login page
await page.goto('/auth/login');
// Wait for the form to be ready
await page.waitForSelector('[data-testid="email-input"]', { state: 'visible', timeout: 10000 });
// Fill and submit login form
await page.getByTestId('email-input').fill('demo.admin@example.com');
await page.getByTestId('password-input').fill(DEMO_PASSWORD);
await page.getByTestId('login-submit').click();
// Wait for redirect to dashboard or another authenticated page
await page.waitForURL('**/dashboard**', { timeout: 15000 });
await use(page);
await context.close();
},
unauthenticatedPage: async ({ browser }, use) => {
const page = await browser.newPage();
await use(page);
await page.close();
},
});
export { expect } from '@playwright/test';