import { test, expect } from '@playwright/test' import { loginAsAdmin, loginAsMember } from './helpers/auth.js' test.describe('Authentication flows', () => { test('protected page shows login modal when logged out', async ({ page }) => { // Navigate to a protected member page without being logged in await page.goto('/member/dashboard') // The auth middleware aborts navigation and shows the login modal // Look for the modal title and email input await expect(page.getByText('Sign in to continue')).toBeVisible() await expect(page.locator('input[type="email"]')).toBeVisible() await expect(page.getByRole('button', { name: 'Send magic link' })).toBeVisible() }) test('admin login and redirect', async ({ page }) => { await loginAsAdmin(page) // loginAsAdmin waits for /admin URL await expect(page).toHaveURL(/\/admin/) // Admin layout should show admin sidebar content await expect(page.locator('.sidebar-nav').getByText('Members')).toBeVisible() await expect(page.locator('.admin-tag')).toBeVisible() }) test('member login and redirect', async ({ page }) => { await loginAsMember(page, 'test-admin@ghostguild.dev') // loginAsMember waits for /member/ URL await expect(page).toHaveURL(/\/member\//) }) test('logout clears auth', async ({ page }) => { // Login as admin first await loginAsAdmin(page) await expect(page).toHaveURL(/\/admin/) // Click the "Sign out" link in the sidebar meta area await page.locator('.sidebar-meta a').filter({ hasText: 'Sign out' }).click() // Should redirect to home after logout await page.waitForURL('/') // Verify the auth-token cookie is cleared const cookies = await page.context().cookies() const authCookie = cookies.find((c) => c.name === 'auth-token') expect(!authCookie || authCookie.value === '').toBeTruthy() // Navigating to a protected page should show the login modal await page.goto('/member/dashboard') await expect(page.getByText('Sign in to continue')).toBeVisible() }) })