video-accessibility/frontend/tests/helpers/auth.ts
2025-08-24 16:28:33 -05:00

92 lines
No EOL
2.5 KiB
TypeScript

import { Page, expect } from '@playwright/test';
import { testUsers } from '../fixtures/test-data';
export class AuthHelper {
constructor(private page: Page) {}
async loginAs(userType: keyof typeof testUsers) {
const user = testUsers[userType];
await this.page.goto('/login');
await this.page.getByLabel('Email').fill(user.email);
await this.page.getByLabel('Password').fill(user.password);
await this.page.getByRole('button', { name: 'Sign In' }).click();
// Wait for redirect to dashboard
await expect(this.page).toHaveURL('/dashboard');
}
async logout() {
// Click user menu and logout
await this.page.getByRole('button', { name: 'User Menu' }).click();
await this.page.getByRole('menuitem', { name: 'Logout' }).click();
// Should redirect to login
await expect(this.page).toHaveURL('/login');
}
async ensureLoggedOut() {
// Clear cookies and local storage
await this.page.context().clearCookies();
await this.page.evaluate(() => {
localStorage.clear();
sessionStorage.clear();
});
}
}
export class MockAPIHelper {
constructor(private page: Page) {}
async mockLoginSuccess(userType: keyof typeof testUsers) {
const user = testUsers[userType];
await this.page.route('**/api/v1/auth/login', async route => {
await route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify({
access_token: 'mock-jwt-token',
token_type: 'bearer',
user_id: `test-${userType}-id`,
role: user.role,
}),
});
});
}
async mockJobList(jobs: any[] = []) {
await this.page.route('**/api/v1/jobs', async route => {
await route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify({
jobs,
total: jobs.length,
page: 1,
size: 20,
}),
});
});
}
async mockJobDetail(jobId: string, job: any) {
await this.page.route(`**/api/v1/jobs/${jobId}`, async route => {
await route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify(job),
});
});
}
async mockVttContent(jobId: string, language: string, content: any) {
await this.page.route(`**/api/v1/jobs/${jobId}/vtt?language=${language}`, async route => {
await route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify(content),
});
});
}
}