Files
jdescopingtool/TestScripts/playwright/helpers/navigation.helper.ts
T
Joseph Doherty ee044d03e0 feat: add health check endpoint, file upload result handling, and Playwright E2E tests
- Add /health endpoint with anonymous access for monitoring
- Add FileUploadResult<T> model and PostMultipartForFileResultAsync for proper upload response handling
- Add ApiResult.Success() factory method for interface types
- Refactor Login.razor for cleaner code
- Add comprehensive Playwright E2E test suite with fixtures and helpers
2026-01-30 07:12:20 -05:00

109 lines
3.5 KiB
TypeScript

import { Page } from '@playwright/test';
import { login } from './auth.helper';
/**
* Wait for Blazor WASM application to be fully loaded
* @param page - Playwright page object
* @param timeout - Maximum time to wait in milliseconds (default: 120000)
*/
export async function waitForBlazorReady(page: Page, timeout: number = 120000): Promise<void> {
// Wait for network to be idle (all WASM files loaded)
await page.waitForLoadState('networkidle', { timeout: 60000 });
// Wait for Radzen components or main content to be visible
await page.locator('.rz-dropdown').or(page.locator('text=Search Details')).or(page.locator('.rz-data-grid')).first().waitFor({
state: 'visible',
timeout: timeout
});
// Additional wait for Radzen components to fully initialize
await page.waitForTimeout(2000);
}
/**
* Navigate to the search page and wait for it to be ready
* @param page - Playwright page object
*/
export async function navigateToSearchPage(page: Page): Promise<void> {
await page.goto('/search');
await page.waitForLoadState('networkidle', { timeout: 60000 });
await login(page);
await waitForBlazorReady(page);
}
/**
* Navigate to a specific search by ID
* @param page - Playwright page object
* @param searchId - The ID of the search to view
*/
export async function navigateToSearch(page: Page, searchId: number): Promise<void> {
await page.goto(`/search/${searchId}`);
await page.waitForLoadState('networkidle', { timeout: 60000 });
await login(page);
await waitForBlazorReady(page);
}
/**
* Navigate to the searches dashboard (home page)
* @param page - Playwright page object
*/
export async function navigateToSearchesDashboard(page: Page): Promise<void> {
await page.goto('/searches');
await page.waitForLoadState('networkidle', { timeout: 60000 });
await login(page);
await waitForBlazorReady(page);
}
/**
* Navigate to the search queue page
* @param page - Playwright page object
*/
export async function navigateToSearchQueue(page: Page): Promise<void> {
await page.goto('/search/queue');
await page.waitForLoadState('networkidle', { timeout: 60000 });
await login(page);
await waitForBlazorReady(page);
}
/**
* Navigate to the refresh status page
* @param page - Playwright page object
*/
export async function navigateToRefreshStatus(page: Page): Promise<void> {
await page.goto('/refresh-status');
await page.waitForLoadState('networkidle', { timeout: 60000 });
await login(page);
await waitForBlazorReady(page);
}
/**
* Navigate to the data sync requests page
* @param page - Playwright page object
*/
export async function navigateToDataSync(page: Page): Promise<void> {
await page.goto('/data-sync/requests');
await page.waitForLoadState('networkidle', { timeout: 60000 });
await login(page);
await waitForBlazorReady(page);
}
/**
* Navigate to the login page
* @param page - Playwright page object
*/
export async function navigateToLoginPage(page: Page): Promise<void> {
await page.goto('/login');
await page.waitForLoadState('networkidle', { timeout: 60000 });
}
/**
* Click a navigation link in the header
* @param page - Playwright page object
* @param linkText - The text of the navigation link to click
*/
export async function clickNavLink(page: Page, linkText: string): Promise<void> {
await page.locator(`a:has-text("${linkText}")`).click();
await page.waitForLoadState('networkidle', { timeout: 30000 });
await waitForBlazorReady(page);
}