40 lines
1.4 KiB
TypeScript
40 lines
1.4 KiB
TypeScript
import { Page, expect } from '@playwright/test';
|
|
|
|
export const DEMO = {
|
|
tenant: 'demo-isp',
|
|
email: 'admin@demo-isp.com',
|
|
password: 'Admin123!',
|
|
};
|
|
|
|
export async function login(page: Page, creds = DEMO) {
|
|
await page.goto('/login');
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
// Fill form — support both old (shadcn Label-based) and new (native) login pages
|
|
const tenantInput = page.locator('input[placeholder*="demo-isp"], input#tenantSlug').first();
|
|
await tenantInput.fill(creds.tenant);
|
|
|
|
const emailInput = page.locator('input[type="email"]').first();
|
|
await emailInput.fill(creds.email);
|
|
|
|
const passwordInput = page.locator('input[type="password"]').first();
|
|
await passwordInput.fill(creds.password);
|
|
|
|
// Click submit
|
|
await page.click('button[type="submit"]');
|
|
|
|
// Wait for either dashboard URL or navigation away from login
|
|
// Increase timeout to 15s to account for API latency
|
|
try {
|
|
await page.waitForURL(/\/(dashboard|clients|settings)/, { timeout: 15000 });
|
|
} catch {
|
|
// If URL hasn't changed, check if we're still on login with an error
|
|
const currentUrl = page.url();
|
|
if (currentUrl.includes('/login')) {
|
|
// Try clicking submit again (sometimes zustand hydration delays)
|
|
await page.click('button[type="submit"]');
|
|
await page.waitForURL(/\/(dashboard|clients|settings)/, { timeout: 15000 });
|
|
}
|
|
}
|
|
}
|