68 lines
1.8 KiB
TypeScript
68 lines
1.8 KiB
TypeScript
|
|
/**
|
||
|
|
* Playwright auth helpers: log in via the API once per role, hydrate
|
||
|
|
* localStorage so subsequent page.goto() lands inside the SPA already
|
||
|
|
* authenticated.
|
||
|
|
*
|
||
|
|
* Avoids the per-test cost of driving the LoginPage form just to land on
|
||
|
|
* /engagements. The actual UI login flow IS exercised in us2-login.spec.ts.
|
||
|
|
*/
|
||
|
|
import { type BrowserContext, type Page } from '@playwright/test';
|
||
|
|
import { BASE, login, type Role, type User } from './api';
|
||
|
|
|
||
|
|
export interface Session {
|
||
|
|
token: string;
|
||
|
|
user: User;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Inject token into localStorage so the SPA's bootstrap hook picks it up
|
||
|
|
* as if the user had already logged in. The frontend stores the JWT under
|
||
|
|
* `mimic.token` (see frontend/src/api/client.ts).
|
||
|
|
*/
|
||
|
|
export async function seedTokenInStorage(
|
||
|
|
context: BrowserContext,
|
||
|
|
token: string,
|
||
|
|
): Promise<void> {
|
||
|
|
await context.addInitScript((t) => {
|
||
|
|
try {
|
||
|
|
window.localStorage.setItem('mimic.token', t);
|
||
|
|
} catch {
|
||
|
|
/* storage might not exist on about:blank — harmless */
|
||
|
|
}
|
||
|
|
}, token);
|
||
|
|
}
|
||
|
|
|
||
|
|
export async function clearAuthStorage(context: BrowserContext): Promise<void> {
|
||
|
|
await context.addInitScript(() => {
|
||
|
|
try {
|
||
|
|
window.localStorage.removeItem('mimic.token');
|
||
|
|
} catch {
|
||
|
|
/* noop */
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Log in as the given role and return both the API session and a helper
|
||
|
|
* that prepares a Page with the auth token already seeded.
|
||
|
|
*/
|
||
|
|
export async function loginAs(
|
||
|
|
context: BrowserContext,
|
||
|
|
username: string,
|
||
|
|
password: string,
|
||
|
|
): Promise<Session> {
|
||
|
|
const session = await login(username, password);
|
||
|
|
await seedTokenInStorage(context, session.token);
|
||
|
|
return session;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Convenience: navigate to a path on a page that's already had its
|
||
|
|
* context seeded with a token.
|
||
|
|
*/
|
||
|
|
export async function gotoApp(page: Page, path = '/engagements'): Promise<void> {
|
||
|
|
await page.goto(`${BASE}${path}`);
|
||
|
|
}
|
||
|
|
|
||
|
|
export type { Role };
|