fix(tests): playwright mostly cooperates now?

This commit is contained in:
perf3ct 2025-06-19 02:07:31 +00:00
parent eae4044a01
commit 7e19323a1d
No known key found for this signature in database
GPG Key ID: 569C4EEC436F5232
3 changed files with 79 additions and 18 deletions

View File

@ -64,15 +64,13 @@ test.describe('Authentication', () => {
await page.waitForURL(/\/dashboard|\//, { timeout: TIMEOUTS.medium }); await page.waitForURL(/\/dashboard|\//, { timeout: TIMEOUTS.medium });
// Find and click logout button // Find and click profile/account button in the top app bar (has AccountIcon)
const logoutButton = page.locator('button:has-text("Logout"), [data-testid="logout"]'); const profileButton = page.locator('button:has([data-testid="AccountCircleIcon"])');
if (await logoutButton.isVisible()) { await profileButton.click();
await logoutButton.click();
} else { // Wait for profile menu to open and click logout
// Try menu-based logout const logoutMenuItem = page.locator('li[role="menuitem"]:has-text("Logout")');
await page.click('[data-testid="user-menu"], .user-menu, button:has([data-testid="user-avatar"])'); await logoutMenuItem.click();
await page.click('button:has-text("Logout"), [data-testid="logout"]');
}
// Should redirect back to login // Should redirect back to login
await page.waitForURL(/\/login|\//, { timeout: TIMEOUTS.medium }); await page.waitForURL(/\/login|\//, { timeout: TIMEOUTS.medium });
@ -91,7 +89,11 @@ test.describe('Authentication', () => {
// Reload the page // Reload the page
await page.reload(); 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(); await expect(page.locator('input[name="username"]')).not.toBeVisible();
}); });

View File

@ -8,16 +8,30 @@ test.describe('Document Management', () => {
test.beforeEach(async ({ authenticatedPage }) => { test.beforeEach(async ({ authenticatedPage }) => {
helpers = new TestHelpers(authenticatedPage); helpers = new TestHelpers(authenticatedPage);
await helpers.navigateToPage('/documents'); await helpers.navigateToPage('/documents');
// Ensure we have test documents for tests that need them
}); });
test('should display document list', async ({ authenticatedPage: page }) => { test('should display document list', async ({ authenticatedPage: page }) => {
// Check for document list components // The documents page should be visible with title and description
await expect(page.locator('[data-testid="document-list"], .document-list, .documents-grid')).toBeVisible(); 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 }) => { test('should navigate to document details', async ({ authenticatedPage: page }) => {
// Click on first document if available // 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()) { if (await firstDocument.isVisible()) {
await firstDocument.click(); await firstDocument.click();
@ -26,19 +40,23 @@ test.describe('Document Management', () => {
await page.waitForURL(/\/documents\/[^\/]+/, { timeout: TIMEOUTS.medium }); await page.waitForURL(/\/documents\/[^\/]+/, { timeout: TIMEOUTS.medium });
// Should show document details // 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 }) => { 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()) { if (await firstDocument.isVisible()) {
await firstDocument.click(); await firstDocument.click();
await page.waitForURL(/\/documents\/[^\/]+/, { timeout: TIMEOUTS.medium }); await page.waitForURL(/\/documents\/[^\/]+/, { timeout: TIMEOUTS.medium });
// Should show various metadata fields // 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 }) => { 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()) { if (await firstDocument.isVisible()) {
await firstDocument.click(); await firstDocument.click();
@ -126,11 +144,14 @@ test.describe('Document Management', () => {
// Should show OCR status information // Should show OCR status information
await expect(page.locator(':has-text("OCR"), [data-testid="ocr-status"], .ocr-status')).toBeVisible(); 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 }) => { 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()) { if (await firstDocument.isVisible()) {
await firstDocument.click(); await firstDocument.click();
@ -146,6 +167,9 @@ test.describe('Document Management', () => {
timeout: TIMEOUTS.short timeout: TIMEOUTS.short
}); });
} }
} else {
// Skip test if no documents
test.skip();
} }
}); });

View File

@ -51,4 +51,39 @@ export class TestHelpers {
fullPage: true 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');
}
}
} }