From 59a6a23f9b242e05e68a4e836c04a86d0adb7674 Mon Sep 17 00:00:00 2001 From: Test User Date: Mon, 29 Dec 2025 22:01:03 -0500 Subject: [PATCH] feat: enhance test authentication and context navigation - Added `authenticateForTests` utility to streamline API key authentication in tests, using a fallback for local testing. - Updated context image test to include authentication step before navigation, ensuring proper session handling. - Increased timeout for context view visibility to accommodate slower server responses. - Introduced a test API key in the Playwright configuration for consistent testing environments. --- apps/ui/playwright.config.ts | 2 ++ .../tests/context/add-context-image.spec.ts | 19 ++++++++++- apps/ui/tests/utils/api/client.ts | 32 ++++++++++++++++++- apps/ui/tests/utils/navigation/views.ts | 3 +- 4 files changed, 53 insertions(+), 3 deletions(-) diff --git a/apps/ui/playwright.config.ts b/apps/ui/playwright.config.ts index d9d7f1d5..66b0adfe 100644 --- a/apps/ui/playwright.config.ts +++ b/apps/ui/playwright.config.ts @@ -39,6 +39,8 @@ export default defineConfig({ PORT: String(serverPort), // Enable mock agent in CI to avoid real API calls AUTOMAKER_MOCK_AGENT: mockAgent ? 'true' : 'false', + // Set a test API key for web mode authentication + AUTOMAKER_API_KEY: process.env.AUTOMAKER_API_KEY || 'test-api-key-for-e2e-tests', // No ALLOWED_ROOT_DIRECTORY restriction - allow all paths for testing }, }, diff --git a/apps/ui/tests/context/add-context-image.spec.ts b/apps/ui/tests/context/add-context-image.spec.ts index ce07ce65..45268443 100644 --- a/apps/ui/tests/context/add-context-image.spec.ts +++ b/apps/ui/tests/context/add-context-image.spec.ts @@ -14,6 +14,7 @@ import { navigateToContext, waitForContextFile, waitForNetworkIdle, + authenticateForTests, } from '../utils'; test.describe('Add Context Image', () => { @@ -117,13 +118,29 @@ test.describe('Add Context Image', () => { test('should import an image file to context', async ({ page }) => { await setupProjectWithFixture(page, getFixturePath()); + + // Authenticate with the server before navigating + await authenticateForTests(page); + await page.goto('/'); await waitForNetworkIdle(page); + // Check if we're on the login screen and authenticate if needed + const loginInput = page.locator('input[type="password"][placeholder*="API key"]'); + 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.locator('button:has-text("Login")').click(); + await page.waitForURL('**/', { timeout: 5000 }); + await waitForNetworkIdle(page); + } + await navigateToContext(page); - // Get the file input element and set the file + // Wait for the file input to be attached to the DOM before setting files const fileInput = page.locator('[data-testid="file-import-input"]'); + await expect(fileInput).toBeAttached({ timeout: 10000 }); // Use setInputFiles to upload the image await fileInput.setInputFiles(testImagePath); diff --git a/apps/ui/tests/utils/api/client.ts b/apps/ui/tests/utils/api/client.ts index d5b3f7f7..dfe46b9f 100644 --- a/apps/ui/tests/utils/api/client.ts +++ b/apps/ui/tests/utils/api/client.ts @@ -4,7 +4,7 @@ */ import { Page, APIResponse } from '@playwright/test'; -import { API_ENDPOINTS } from '../core/constants'; +import { API_BASE_URL, API_ENDPOINTS } from '../core/constants'; // ============================================================================ // Types @@ -270,3 +270,33 @@ export async function apiListBranches( ): Promise<{ response: APIResponse; data: ListBranchesResponse }> { return new WorktreeApiClient(page).listBranches(worktreePath); } + +// ============================================================================ +// Authentication Utilities +// ============================================================================ + +/** + * Authenticate with the server using an API key + * This sets a session cookie that will be used for subsequent requests + */ +export async function authenticateWithApiKey(page: Page, apiKey: string): Promise { + try { + const response = await page.request.post(`${API_BASE_URL}/api/auth/login`, { + data: { apiKey }, + }); + const data = await response.json(); + return data.success === true; + } catch { + return false; + } +} + +/** + * Authenticate using the API key from environment variable + * Falls back to a test default if AUTOMAKER_API_KEY is not set + */ +export async function authenticateForTests(page: Page): Promise { + // Use the API key from environment, or a test default + const apiKey = process.env.AUTOMAKER_API_KEY || 'test-api-key-for-e2e-tests'; + return authenticateWithApiKey(page, apiKey); +} diff --git a/apps/ui/tests/utils/navigation/views.ts b/apps/ui/tests/utils/navigation/views.ts index 1abe0bb6..f42c7902 100644 --- a/apps/ui/tests/utils/navigation/views.ts +++ b/apps/ui/tests/utils/navigation/views.ts @@ -37,7 +37,8 @@ export async function navigateToContext(page: Page): Promise { } // Wait for the context view to be visible - await waitForElement(page, 'context-view', { timeout: 10000 }); + // Increase timeout to handle slower server startup + await waitForElement(page, 'context-view', { timeout: 15000 }); } /**