import { test, expect, type Page } from '@playwright/test'; import { TEST_USERS } from './setup/test-users.js'; const LOGIN_URL = '/trips/login'; const DASHBOARD_URL = '/trips/dashboard'; const ADMIN_USERS_URL = '/trips/admin/users'; async function loginAsLocalUser(page: Page, username: string, password: string): Promise { await page.goto(LOGIN_URL); await page.fill('input[name="identifier"]', username); await page.fill('input[name="password"]', password); await page.click('button[type="submit"]:has-text("Sign in locally")'); await page.waitForURL(`**${DASHBOARD_URL}`, { timeout: 15_000 }); } test.beforeEach(async ({ context }) => { await context.clearCookies(); }); test.describe('regular user', () => { test('can log in and lands on dashboard', async ({ page }) => { await loginAsLocalUser(page, TEST_USERS.regular.username, TEST_USERS.regular.password); await expect(page).toHaveURL(/\/trips\/dashboard/); }); test('cannot access admin — redirected to dashboard', async ({ page }) => { await loginAsLocalUser(page, TEST_USERS.regular.username, TEST_USERS.regular.password); await page.goto(ADMIN_USERS_URL); await expect(page).toHaveURL(/\/trips\/dashboard/); }); }); test.describe('admin user', () => { test('can log in and lands on dashboard', async ({ page }) => { await loginAsLocalUser(page, TEST_USERS.admin.username, TEST_USERS.admin.password); await expect(page).toHaveURL(/\/trips\/dashboard/); }); test('can access /admin/users', async ({ page }) => { await loginAsLocalUser(page, TEST_USERS.admin.username, TEST_USERS.admin.password); await page.goto(ADMIN_USERS_URL); await expect(page).toHaveURL(/\/trips\/admin\/users/); await expect(page.locator('h1')).toContainText('Users'); }); }); test.describe('error handling', () => { test('bad password shows error on login page', async ({ page }) => { await page.goto(LOGIN_URL); await page.fill('input[name="identifier"]', TEST_USERS.regular.username); await page.fill('input[name="password"]', 'wrong-password-long-enough'); await page.click('button[type="submit"]:has-text("Sign in locally")'); await page.waitForURL(/error=CredentialsSignin/, { timeout: 10_000 }); await expect(page.locator('.text-rose-700')).toContainText('Invalid credentials'); }); });