92 lines
No EOL
2.5 KiB
TypeScript
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),
|
|
});
|
|
});
|
|
}
|
|
} |