forked from baron/baron-sso
332 lines
9.6 KiB
TypeScript
332 lines
9.6 KiB
TypeScript
import { expect, test, type Page, type Route } from '@playwright/test';
|
|
|
|
async function seedTokenLogin(page: Page): Promise<void> {
|
|
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<void> {
|
|
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/verify-complete', async ({ page }) => {
|
|
await page.goto('/ko/verify-complete');
|
|
await expect(page).toHaveURL(/\/ko\/verify-complete$/);
|
|
});
|
|
|
|
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,
|
|
}, testInfo) => {
|
|
await page.goto('/ko/approve?ref=e2e-ref');
|
|
await expect(page).toHaveURL(/\/ko\/dashboard$/, {
|
|
timeout: testInfo.project.name === 'webkit-desktop' ? 15_000 : 5_000,
|
|
});
|
|
});
|
|
|
|
test('route: /ko/ql/:ref -> /ko/dashboard', async ({ page }, testInfo) => {
|
|
await page.goto('/ko/ql/e2e-ref');
|
|
await expect(page).toHaveURL(/\/ko\/dashboard$/, {
|
|
timeout: testInfo.project.name === 'webkit-desktop' ? 15_000 : 5_000,
|
|
});
|
|
});
|
|
});
|