import { expect, test, type Page, type Route } from '@playwright/test'; async function seedTokenLogin(page: Page): Promise { await page.addInitScript(() => { window.localStorage.setItem('baron_auth_token', 'e30.e30.e30'); window.localStorage.setItem('baron_auth_provider', 'ory'); window.localStorage.removeItem('baron_auth_cookie_mode'); window.localStorage.removeItem('baron_auth_pending_provider'); }); } async function mockInventoryApis(page: Page): Promise { await page.route('**/api/v1/**', async (route: Route) => { const requestUrl = new URL(route.request().url()); const path = requestUrl.pathname; const method = route.request().method().toUpperCase(); if (path.endsWith('/api/v1/user/me')) { const authHeader = route.request().headers()['authorization'] ?? ''; if (authHeader.startsWith('Bearer ')) { await route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify({ id: 'e2e-user', email: 'e2e@example.com', name: 'E2E User', phone: '+821012341234', department: 'QA', affiliationType: 'employee', companyCode: 'BARON', tenant: { id: 'tenant-1', name: 'Baron', slug: 'baron', description: 'E2E tenant', }, }), }); return; } await route.fulfill({ status: 401, contentType: 'application/json', body: JSON.stringify({ error: 'unauthorized' }), }); return; } if (path.endsWith('/api/v1/user/rp/linked')) { await route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify({ items: [] }), }); return; } if (path.endsWith('/api/v1/audit/auth/timeline')) { await route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify({ items: [], next_cursor: '' }), }); return; } if (path.endsWith('/api/v1/auth/password/policy')) { await route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify({ minLength: 12, minCharacterTypes: 3, lowercase: true, uppercase: true, number: true, nonAlphanumeric: true, }), }); return; } if (path.endsWith('/api/v1/auth/magic-link/verify')) { await route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify({ status: 'approved' }), }); return; } if (path.endsWith('/api/v1/auth/login/code/verify')) { await route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify({ status: 'approved' }), }); return; } if (path.endsWith('/api/v1/auth/login/code/verify-short')) { await route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify({ status: 'approved' }), }); return; } if (path.endsWith('/api/v1/auth/consent') && method === 'GET') { await route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify({ client: { client_name: 'E2E Client', client_id: 'e2e-client', }, requested_scope: ['openid'], scope_details: { openid: { description: 'OpenID', mandatory: true, }, }, }), }); return; } if (path.endsWith('/api/v1/auth/qr/approve')) { await route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify({ ok: true }), }); return; } if (path.endsWith('/api/v1/client-log')) { await route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify({ ok: true }), }); return; } await route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify({}), }); }); } test.describe('UserFront WASM route inventory (unauth)', () => { test.beforeEach(async ({ page }) => { await mockInventoryApis(page); }); test('route: /', async ({ page }) => { await page.goto('/'); await expect(page).toHaveURL(/\/(ko|en)\/signin(?:\?.*)?$/); }); test('route: /ko', async ({ page }) => { await page.goto('/ko'); await expect(page).toHaveURL(/\/ko\/signin(?:\?.*)?$/); }); test('route: /ko/dashboard', async ({ page }) => { await page.goto('/ko/dashboard'); await expect(page).toHaveURL(/\/ko\/signin$/); }); test('route: /ko/profile', async ({ page }) => { await page.goto('/ko/profile'); await expect(page).toHaveURL(/\/ko\/signin$/); }); test('route: /ko/admin/users', async ({ page }) => { await page.goto('/ko/admin/users'); await expect(page).toHaveURL(/\/ko\/signin$/); }); test('route: /ko/scan', async ({ page }) => { await page.goto('/ko/scan'); await expect(page).toHaveURL(/\/ko\/signin$/); }); test('route: /ko/signin', async ({ page }) => { await page.goto('/ko/signin'); await expect(page).toHaveURL(/\/ko\/signin$/); }); test('route: /ko/login', async ({ page }) => { await page.goto('/ko/login'); await expect(page).toHaveURL(/\/ko\/login$/); }); test('route: /ko/signup', async ({ page }) => { await page.goto('/ko/signup'); await expect(page).toHaveURL(/\/ko\/signup$/); }); test('route: /ko/registration', async ({ page }) => { await page.goto('/ko/registration'); await expect(page).toHaveURL(/\/ko\/registration$/); }); test('route: /ko/verify', async ({ page }) => { await page.goto('/ko/verify'); await expect(page).toHaveURL(/\/ko\/verify$/); }); test('route: /ko/verify/:token', async ({ page }) => { await page.goto('/ko/verify/e2e-token'); await expect(page).toHaveURL(/\/ko\/verify\/e2e-token$/); }); test('route: /ko/verification', async ({ page }) => { await page.goto('/ko/verification'); await expect(page).toHaveURL(/\/ko\/verification$/); }); test('route: /ko/l/:shortCode', async ({ page }) => { await page.goto('/ko/l/AB123456'); await expect(page).toHaveURL(/\/ko\/l\/AB123456$/); }); test('route: /ko/forgot-password', async ({ page }) => { await page.goto('/ko/forgot-password'); await expect(page).toHaveURL(/\/ko\/forgot-password$/); }); test('route: /ko/recovery', async ({ page }) => { await page.goto('/ko/recovery'); await expect(page).toHaveURL(/\/ko\/recovery$/); }); test('route: /ko/reset-password', async ({ page }) => { await page.goto('/ko/reset-password?token=e2e-reset-token'); await expect(page).toHaveURL(/\/ko\/reset-password\?token=e2e-reset-token$/); }); test('route: /ko/error', async ({ page }) => { await page.goto('/ko/error?error=invalid_request'); await expect(page).toHaveURL(/\/ko\/error\?error=invalid_request$/); }); test('route: /ko/settings', async ({ page }) => { await page.goto('/ko/settings'); await expect(page).toHaveURL(/\/ko\/settings$/); }); test('route: /ko/consent (missing challenge)', async ({ page }) => { await page.goto('/ko/consent'); await expect(page).toHaveURL(/\/ko\/consent$/); }); test('route: /ko/consent?consent_challenge=...', async ({ page }) => { await page.goto('/ko/consent?consent_challenge=e2e-consent'); await expect(page).toHaveURL(/\/ko\/consent\?consent_challenge=e2e-consent$/); }); test('route: /ko/approve?ref=...', async ({ page }) => { await page.goto('/ko/approve?ref=e2e-ref'); await expect(page).toHaveURL(/\/ko\/signin\?notice=qr_login_required$/); }); test('route: /ko/ql/:ref', async ({ page }) => { await page.goto('/ko/ql/e2e-ref'); await expect(page).toHaveURL(/\/ko\/signin\?notice=qr_login_required$/); }); }); test.describe('UserFront WASM route inventory (authed)', () => { test.beforeEach(async ({ page }) => { await seedTokenLogin(page); await mockInventoryApis(page); }); test('route: /ko -> /ko/dashboard', async ({ page }) => { await page.goto('/ko'); await expect(page).toHaveURL(/\/ko\/dashboard$/); }); test('route: /ko/dashboard', async ({ page }) => { await page.goto('/ko/dashboard'); await expect(page).toHaveURL(/\/ko\/dashboard$/); }); test('route: /ko/profile', async ({ page }) => { await page.goto('/ko/profile'); await expect(page).toHaveURL(/\/ko\/profile$/); }); test('route: /ko/admin/users', async ({ page }) => { await page.goto('/ko/admin/users'); await expect(page).toHaveURL(/\/ko\/admin\/users$/); }); test('route: /ko/scan', async ({ page }) => { await page.goto('/ko/scan'); await expect(page).toHaveURL(/\/ko\/scan$/); }); test('route: /ko/approve?ref=... -> /ko/dashboard', async ({ page }) => { await page.goto('/ko/approve?ref=e2e-ref'); await expect(page).toHaveURL(/\/ko\/dashboard$/); }); test('route: /ko/ql/:ref -> /ko/dashboard', async ({ page }) => { await page.goto('/ko/ql/e2e-ref'); await expect(page).toHaveURL(/\/ko\/dashboard$/); }); });