mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-01-31 20:03:37 +00:00
feat: improve test setup and authentication handling
- Added `dev:test` script to package.json for streamlined testing without file watching. - Introduced `kill-test-servers` script to ensure no existing servers are running on test ports before executing tests. - Enhanced Playwright configuration to use mock agent for tests, ensuring consistent API responses and disabling rate limiting. - Updated various test files to include authentication steps and handle login screens, improving reliability and reducing flakiness in tests. - Added `global-setup` for e2e tests to ensure proper initialization before test execution.
This commit is contained in:
@@ -1,16 +1,37 @@
|
||||
import { Page } from '@playwright/test';
|
||||
import { clickElement } from '../core/interactions';
|
||||
import { waitForElement } from '../core/waiting';
|
||||
import { authenticateForTests } from '../api/client';
|
||||
|
||||
/**
|
||||
* Navigate to the board/kanban view
|
||||
* Note: Navigates directly to /board since index route shows WelcomeView
|
||||
*/
|
||||
export async function navigateToBoard(page: Page): Promise<void> {
|
||||
// Authenticate before navigating
|
||||
await authenticateForTests(page);
|
||||
|
||||
// Navigate directly to /board route
|
||||
await page.goto('/board');
|
||||
await page.waitForLoadState('load');
|
||||
|
||||
// Check if we're on the login screen and handle it
|
||||
const loginInput = page
|
||||
.locator('[data-testid="login-api-key-input"], input[type="password"][placeholder*="API key"]')
|
||||
.first();
|
||||
const isLoginScreen = await loginInput.isVisible({ timeout: 2000 }).catch(() => false);
|
||||
if (isLoginScreen) {
|
||||
const apiKey = process.env.AUTOMAKER_API_KEY || 'test-api-key-for-e2e-tests';
|
||||
await loginInput.fill(apiKey);
|
||||
await page.waitForTimeout(100);
|
||||
await page
|
||||
.locator('[data-testid="login-submit-button"], button:has-text("Login")')
|
||||
.first()
|
||||
.click();
|
||||
await page.waitForURL('**/board', { timeout: 5000 });
|
||||
await page.waitForLoadState('load');
|
||||
}
|
||||
|
||||
// Wait for the board view to be visible
|
||||
await waitForElement(page, 'board-view', { timeout: 10000 });
|
||||
}
|
||||
@@ -20,10 +41,30 @@ export async function navigateToBoard(page: Page): Promise<void> {
|
||||
* Note: Navigates directly to /context since index route shows WelcomeView
|
||||
*/
|
||||
export async function navigateToContext(page: Page): Promise<void> {
|
||||
// Authenticate before navigating
|
||||
await authenticateForTests(page);
|
||||
|
||||
// Navigate directly to /context route
|
||||
await page.goto('/context');
|
||||
await page.waitForLoadState('load');
|
||||
|
||||
// Check if we're on the login screen and handle it
|
||||
const loginInputCtx = page
|
||||
.locator('[data-testid="login-api-key-input"], input[type="password"][placeholder*="API key"]')
|
||||
.first();
|
||||
const isLoginScreenCtx = await loginInputCtx.isVisible({ timeout: 2000 }).catch(() => false);
|
||||
if (isLoginScreenCtx) {
|
||||
const apiKey = process.env.AUTOMAKER_API_KEY || 'test-api-key-for-e2e-tests';
|
||||
await loginInputCtx.fill(apiKey);
|
||||
await page.waitForTimeout(100);
|
||||
await page
|
||||
.locator('[data-testid="login-submit-button"], button:has-text("Login")')
|
||||
.first()
|
||||
.click();
|
||||
await page.waitForURL('**/context', { timeout: 5000 });
|
||||
await page.waitForLoadState('load');
|
||||
}
|
||||
|
||||
// Wait for loading to complete (if present)
|
||||
const loadingElement = page.locator('[data-testid="context-view-loading"]');
|
||||
try {
|
||||
@@ -46,6 +87,9 @@ export async function navigateToContext(page: Page): Promise<void> {
|
||||
* Note: Navigates directly to /spec since index route shows WelcomeView
|
||||
*/
|
||||
export async function navigateToSpec(page: Page): Promise<void> {
|
||||
// Authenticate before navigating
|
||||
await authenticateForTests(page);
|
||||
|
||||
// Navigate directly to /spec route
|
||||
await page.goto('/spec');
|
||||
await page.waitForLoadState('load');
|
||||
@@ -76,10 +120,30 @@ export async function navigateToSpec(page: Page): Promise<void> {
|
||||
* Note: Navigates directly to /agent since index route shows WelcomeView
|
||||
*/
|
||||
export async function navigateToAgent(page: Page): Promise<void> {
|
||||
// Authenticate before navigating
|
||||
await authenticateForTests(page);
|
||||
|
||||
// Navigate directly to /agent route
|
||||
await page.goto('/agent');
|
||||
await page.waitForLoadState('load');
|
||||
|
||||
// Check if we're on the login screen and handle it
|
||||
const loginInputAgent = page
|
||||
.locator('[data-testid="login-api-key-input"], input[type="password"][placeholder*="API key"]')
|
||||
.first();
|
||||
const isLoginScreenAgent = await loginInputAgent.isVisible({ timeout: 2000 }).catch(() => false);
|
||||
if (isLoginScreenAgent) {
|
||||
const apiKey = process.env.AUTOMAKER_API_KEY || 'test-api-key-for-e2e-tests';
|
||||
await loginInputAgent.fill(apiKey);
|
||||
await page.waitForTimeout(100);
|
||||
await page
|
||||
.locator('[data-testid="login-submit-button"], button:has-text("Login")')
|
||||
.first()
|
||||
.click();
|
||||
await page.waitForURL('**/agent', { timeout: 5000 });
|
||||
await page.waitForLoadState('load');
|
||||
}
|
||||
|
||||
// Wait for the agent view to be visible
|
||||
await waitForElement(page, 'agent-view', { timeout: 10000 });
|
||||
}
|
||||
@@ -89,6 +153,9 @@ export async function navigateToAgent(page: Page): Promise<void> {
|
||||
* Note: Navigates directly to /settings since index route shows WelcomeView
|
||||
*/
|
||||
export async function navigateToSettings(page: Page): Promise<void> {
|
||||
// Authenticate before navigating
|
||||
await authenticateForTests(page);
|
||||
|
||||
// Navigate directly to /settings route
|
||||
await page.goto('/settings');
|
||||
await page.waitForLoadState('load');
|
||||
@@ -114,8 +181,31 @@ export async function navigateToSetup(page: Page): Promise<void> {
|
||||
* Navigate to the welcome view (clear project selection)
|
||||
*/
|
||||
export async function navigateToWelcome(page: Page): Promise<void> {
|
||||
// Authenticate before navigating
|
||||
await authenticateForTests(page);
|
||||
|
||||
await page.goto('/');
|
||||
await page.waitForLoadState('load');
|
||||
|
||||
// Check if we're on the login screen and handle it
|
||||
const loginInputWelcome = page
|
||||
.locator('[data-testid="login-api-key-input"], input[type="password"][placeholder*="API key"]')
|
||||
.first();
|
||||
const isLoginScreenWelcome = await loginInputWelcome
|
||||
.isVisible({ timeout: 2000 })
|
||||
.catch(() => false);
|
||||
if (isLoginScreenWelcome) {
|
||||
const apiKey = process.env.AUTOMAKER_API_KEY || 'test-api-key-for-e2e-tests';
|
||||
await loginInputWelcome.fill(apiKey);
|
||||
await page.waitForTimeout(100);
|
||||
await page
|
||||
.locator('[data-testid="login-submit-button"], button:has-text("Login")')
|
||||
.first()
|
||||
.click();
|
||||
await page.waitForURL('**/', { timeout: 5000 });
|
||||
await page.waitForLoadState('load');
|
||||
}
|
||||
|
||||
await waitForElement(page, 'welcome-view', { timeout: 10000 });
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user