From 7e19323a1d6a71bda795a02d0bf744ce37dc514a Mon Sep 17 00:00:00 2001 From: perf3ct Date: Thu, 19 Jun 2025 02:07:31 +0000 Subject: [PATCH] fix(tests): playwright mostly cooperates now? --- frontend/e2e/auth.spec.ts | 22 +++++++------ frontend/e2e/document-management.spec.ts | 40 +++++++++++++++++++----- frontend/e2e/utils/test-helpers.ts | 35 +++++++++++++++++++++ 3 files changed, 79 insertions(+), 18 deletions(-) diff --git a/frontend/e2e/auth.spec.ts b/frontend/e2e/auth.spec.ts index 3c429f7..ace5d7e 100644 --- a/frontend/e2e/auth.spec.ts +++ b/frontend/e2e/auth.spec.ts @@ -64,15 +64,13 @@ test.describe('Authentication', () => { await page.waitForURL(/\/dashboard|\//, { timeout: TIMEOUTS.medium }); - // Find and click logout button - const logoutButton = page.locator('button:has-text("Logout"), [data-testid="logout"]'); - if (await logoutButton.isVisible()) { - await logoutButton.click(); - } else { - // Try menu-based logout - await page.click('[data-testid="user-menu"], .user-menu, button:has([data-testid="user-avatar"])'); - await page.click('button:has-text("Logout"), [data-testid="logout"]'); - } + // Find and click profile/account button in the top app bar (has AccountIcon) + const profileButton = page.locator('button:has([data-testid="AccountCircleIcon"])'); + await profileButton.click(); + + // Wait for profile menu to open and click logout + const logoutMenuItem = page.locator('li[role="menuitem"]:has-text("Logout")'); + await logoutMenuItem.click(); // Should redirect back to login await page.waitForURL(/\/login|\//, { timeout: TIMEOUTS.medium }); @@ -91,7 +89,11 @@ test.describe('Authentication', () => { // Reload the page await page.reload(); - // Should still be logged in + // Wait for page to load after reload + await page.waitForLoadState('networkidle'); + + // Should still be logged in (either on dashboard or main page, but not login) + await page.waitForURL(/\/dashboard|\/(?!login)/, { timeout: TIMEOUTS.medium }); await expect(page.locator('input[name="username"]')).not.toBeVisible(); }); diff --git a/frontend/e2e/document-management.spec.ts b/frontend/e2e/document-management.spec.ts index 1aa432e..2b78121 100644 --- a/frontend/e2e/document-management.spec.ts +++ b/frontend/e2e/document-management.spec.ts @@ -8,16 +8,30 @@ test.describe('Document Management', () => { test.beforeEach(async ({ authenticatedPage }) => { helpers = new TestHelpers(authenticatedPage); await helpers.navigateToPage('/documents'); + // Ensure we have test documents for tests that need them }); test('should display document list', async ({ authenticatedPage: page }) => { - // Check for document list components - await expect(page.locator('[data-testid="document-list"], .document-list, .documents-grid')).toBeVisible(); + // The documents page should be visible with title and description + await expect(page.getByRole('heading', { name: 'Documents' })).toBeVisible(); + await expect(page.locator('text=Manage and explore your document library')).toBeVisible(); + + // Check for document cards/items or empty state + const documentCards = page.locator('.MuiCard-root'); + const hasDocuments = await documentCards.count() > 0; + + if (hasDocuments) { + // Should show at least one document card + await expect(documentCards.first()).toBeVisible(); + } + + // Either way, the page should be functional - check for search bar + await expect(page.getByRole('main').getByRole('textbox', { name: 'Search documents...' })).toBeVisible(); }); test('should navigate to document details', async ({ authenticatedPage: page }) => { // Click on first document if available - const firstDocument = page.locator('[data-testid="document-item"], .document-item, .document-card').first(); + const firstDocument = page.locator('.MuiCard-root').first(); if (await firstDocument.isVisible()) { await firstDocument.click(); @@ -26,19 +40,23 @@ test.describe('Document Management', () => { await page.waitForURL(/\/documents\/[^\/]+/, { timeout: TIMEOUTS.medium }); // Should show document details - await expect(page.locator('[data-testid="document-details"], .document-details')).toBeVisible(); + await expect(page.locator('[data-testid="document-details"], .document-details, h1, h2')).toBeVisible(); + } else { + test.skip(); } }); test('should display document metadata', async ({ authenticatedPage: page }) => { - const firstDocument = page.locator('[data-testid="document-item"], .document-item, .document-card').first(); + const firstDocument = page.locator('.MuiCard-root').first(); if (await firstDocument.isVisible()) { await firstDocument.click(); await page.waitForURL(/\/documents\/[^\/]+/, { timeout: TIMEOUTS.medium }); // Should show various metadata fields - await expect(page.locator(':has-text("File size"), :has-text("Upload date"), :has-text("Modified")')).toBeVisible(); + await expect(page.locator(':has-text("Bytes"), :has-text("OCR"), :has-text("Download")')).toBeVisible(); + } else { + test.skip(); } }); @@ -118,7 +136,7 @@ test.describe('Document Management', () => { }); test('should display OCR status', async ({ authenticatedPage: page }) => { - const firstDocument = page.locator('[data-testid="document-item"], .document-item, .document-card').first(); + const firstDocument = page.locator('.MuiCard-root').first(); if (await firstDocument.isVisible()) { await firstDocument.click(); @@ -126,11 +144,14 @@ test.describe('Document Management', () => { // Should show OCR status information await expect(page.locator(':has-text("OCR"), [data-testid="ocr-status"], .ocr-status')).toBeVisible(); + } else { + // Skip test if no documents + test.skip(); } }); test('should search within document content', async ({ authenticatedPage: page }) => { - const firstDocument = page.locator('[data-testid="document-item"], .document-item, .document-card').first(); + const firstDocument = page.locator('.MuiCard-root').first(); if (await firstDocument.isVisible()) { await firstDocument.click(); @@ -146,6 +167,9 @@ test.describe('Document Management', () => { timeout: TIMEOUTS.short }); } + } else { + // Skip test if no documents + test.skip(); } }); diff --git a/frontend/e2e/utils/test-helpers.ts b/frontend/e2e/utils/test-helpers.ts index 6fc8c30..17d5fbc 100644 --- a/frontend/e2e/utils/test-helpers.ts +++ b/frontend/e2e/utils/test-helpers.ts @@ -51,4 +51,39 @@ export class TestHelpers { fullPage: true }); } + + async uploadTestDocument(fileName: string) { + // Navigate to upload page + await this.page.goto('/upload'); + + // Look for file input + const fileInput = this.page.locator('input[type="file"]'); + await expect(fileInput).toBeVisible(); + + // Upload the test file + await fileInput.setInputFiles(`../tests/test_images/${fileName}`); + + // Wait for upload button and click it + const uploadButton = this.page.locator('button:has-text("Upload"), [data-testid="upload-button"]'); + if (await uploadButton.isVisible()) { + await uploadButton.click(); + } + + // Wait for upload to complete + await this.page.waitForTimeout(2000); + + // Return to documents page + await this.page.goto('/documents'); + await this.waitForLoadingToComplete(); + } + + async ensureTestDocumentsExist() { + // Check if there are any documents + const documentCount = await this.page.locator('[data-testid="document-item"], .document-item, .document-card').count(); + + if (documentCount === 0) { + // Upload a test document + await this.uploadTestDocument('test1.png'); + } + } } \ No newline at end of file