fix(tests): actually make playwright login
This commit is contained in:
parent
64ec2fb69e
commit
db6f5e119f
|
|
@ -11,8 +11,8 @@ test.describe('Authentication', () => {
|
||||||
await page.goto('/');
|
await page.goto('/');
|
||||||
|
|
||||||
// Check for login form elements using Material-UI structure
|
// Check for login form elements using Material-UI structure
|
||||||
await expect(page.locator('input[name="username"]')).toBeVisible();
|
await expect(page.locator('input[type="text"]').first()).toBeVisible();
|
||||||
await expect(page.locator('input[name="password"]')).toBeVisible();
|
await expect(page.locator('input[type="password"]').first()).toBeVisible();
|
||||||
await expect(page.locator('button[type="submit"]')).toBeVisible();
|
await expect(page.locator('button[type="submit"]')).toBeVisible();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -21,18 +21,18 @@ test.describe('Authentication', () => {
|
||||||
|
|
||||||
await authHelper.loginAs(TEST_CREDENTIALS.admin);
|
await authHelper.loginAs(TEST_CREDENTIALS.admin);
|
||||||
|
|
||||||
// Should redirect to dashboard or main page
|
// Should redirect to dashboard
|
||||||
await page.waitForURL(/\/dashboard|\//, { timeout: TIMEOUTS.navigation });
|
await page.waitForURL(/.*\/dashboard.*/, { timeout: TIMEOUTS.navigation });
|
||||||
|
|
||||||
// Verify we're no longer on login page
|
// Verify we're logged in by checking for welcome message
|
||||||
await expect(page.locator('input[name="username"]')).not.toBeVisible();
|
await expect(page.locator('h4:has-text("Welcome back,")')).toBeVisible();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('should show error with invalid credentials', async ({ page }) => {
|
test('should show error with invalid credentials', async ({ page }) => {
|
||||||
await page.goto('/');
|
await page.goto('/');
|
||||||
|
|
||||||
await page.fill('input[name="username"]', 'invaliduser');
|
await page.fill('input[type="text"]', 'invaliduser');
|
||||||
await page.fill('input[name="password"]', 'wrongpassword');
|
await page.fill('input[type="password"]', 'wrongpassword');
|
||||||
|
|
||||||
await page.click('button[type="submit"]');
|
await page.click('button[type="submit"]');
|
||||||
|
|
||||||
|
|
@ -40,7 +40,7 @@ test.describe('Authentication', () => {
|
||||||
await expect(page.locator('.MuiAlert-root, [role="alert"]')).toBeVisible({ timeout: TIMEOUTS.api });
|
await expect(page.locator('.MuiAlert-root, [role="alert"]')).toBeVisible({ timeout: TIMEOUTS.api });
|
||||||
|
|
||||||
// Should remain on login page
|
// Should remain on login page
|
||||||
await expect(page.locator('input[name="username"]')).toBeVisible();
|
await expect(page.locator('input[type="text"]')).toBeVisible();
|
||||||
});
|
});
|
||||||
|
|
||||||
test.skip('should logout successfully', async ({ page }) => {
|
test.skip('should logout successfully', async ({ page }) => {
|
||||||
|
|
@ -90,8 +90,8 @@ test.describe('Authentication', () => {
|
||||||
await page.click('button[type="submit"]');
|
await page.click('button[type="submit"]');
|
||||||
|
|
||||||
// Should show validation errors or prevent submission
|
// Should show validation errors or prevent submission
|
||||||
const usernameInput = page.locator('input[name="username"]');
|
const usernameInput = page.locator('input[type="text"]');
|
||||||
const passwordInput = page.locator('input[name="password"]');
|
const passwordInput = page.locator('input[type="password"]');
|
||||||
|
|
||||||
// Check for HTML5 validation or custom validation messages
|
// Check for HTML5 validation or custom validation messages
|
||||||
await expect(usernameInput).toBeVisible();
|
await expect(usernameInput).toBeVisible();
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,53 @@
|
||||||
|
import { test, expect } from './fixtures/auth';
|
||||||
|
import { TEST_CREDENTIALS } from './fixtures/auth';
|
||||||
|
|
||||||
|
test.describe('Dashboard', () => {
|
||||||
|
test('should display welcome back message after login', async ({ authenticatedPage: page }) => {
|
||||||
|
// Navigate to dashboard
|
||||||
|
await page.goto('/dashboard');
|
||||||
|
await page.waitForLoadState('networkidle');
|
||||||
|
|
||||||
|
// Check for welcome message
|
||||||
|
await expect(page.locator('h4:has-text("Welcome back,")')).toBeVisible();
|
||||||
|
|
||||||
|
// Check for username in welcome message
|
||||||
|
await expect(page.locator(`h4:has-text("Welcome back, ${TEST_CREDENTIALS.admin.username}!")`)).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('should display dashboard stats', async ({ authenticatedPage: page }) => {
|
||||||
|
await page.goto('/dashboard');
|
||||||
|
await page.waitForLoadState('networkidle');
|
||||||
|
|
||||||
|
// Check for stats cards
|
||||||
|
await expect(page.locator('text="Total Documents"')).toBeVisible();
|
||||||
|
await expect(page.locator('text="Storage Used"')).toBeVisible();
|
||||||
|
await expect(page.locator('text="OCR Processed"')).toBeVisible();
|
||||||
|
await expect(page.locator('text="Searchable"')).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('should display quick actions', async ({ authenticatedPage: page }) => {
|
||||||
|
await page.goto('/dashboard');
|
||||||
|
await page.waitForLoadState('networkidle');
|
||||||
|
|
||||||
|
// Check for quick action buttons
|
||||||
|
await expect(page.locator('text="Upload Documents"')).toBeVisible();
|
||||||
|
await expect(page.locator('text="Search Library"')).toBeVisible();
|
||||||
|
await expect(page.locator('text="Browse Documents"')).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('should have working navigation', async ({ authenticatedPage: page }) => {
|
||||||
|
await page.goto('/dashboard');
|
||||||
|
await page.waitForLoadState('networkidle');
|
||||||
|
|
||||||
|
// Test navigation to different pages
|
||||||
|
await page.click('text="Upload Documents"');
|
||||||
|
await page.waitForURL(/.*\/upload.*/, { timeout: 5000 });
|
||||||
|
|
||||||
|
// Go back to dashboard
|
||||||
|
await page.goto('/dashboard');
|
||||||
|
await page.waitForLoadState('networkidle');
|
||||||
|
|
||||||
|
// Verify we're back on dashboard
|
||||||
|
await expect(page.locator('h4:has-text("Welcome back,")')).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
@ -36,17 +36,25 @@ export class AuthHelper {
|
||||||
await this.page.goto('/');
|
await this.page.goto('/');
|
||||||
await this.page.waitForLoadState('networkidle');
|
await this.page.waitForLoadState('networkidle');
|
||||||
|
|
||||||
// Check if already logged in
|
// Check if already logged in by looking for dashboard content
|
||||||
const usernameInput = await this.page.locator('input[name="username"]').isVisible().catch(() => false);
|
const welcomeText = await this.page.locator('h4:has-text("Welcome back,")').isVisible().catch(() => false);
|
||||||
|
|
||||||
if (!usernameInput) {
|
if (welcomeText) {
|
||||||
console.log('Already logged in or no login form found');
|
console.log('Already logged in - found welcome message');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Look for login form - Material-UI TextFields with labels
|
||||||
|
const usernameField = this.page.locator('input[data-testid="username"], input[label="Username"], input[placeholder="Username"], input[type="text"]').first();
|
||||||
|
const passwordField = this.page.locator('input[data-testid="password"], input[label="Password"], input[placeholder="Password"], input[type="password"]').first();
|
||||||
|
|
||||||
|
// Wait for login form to be visible
|
||||||
|
await usernameField.waitFor({ state: 'visible', timeout: TIMEOUTS.login });
|
||||||
|
await passwordField.waitFor({ state: 'visible', timeout: TIMEOUTS.login });
|
||||||
|
|
||||||
// Fill login form
|
// Fill login form
|
||||||
await this.page.fill('input[name="username"]', credentials.username);
|
await usernameField.fill(credentials.username);
|
||||||
await this.page.fill('input[name="password"]', credentials.password);
|
await passwordField.fill(credentials.password);
|
||||||
|
|
||||||
// Wait for login API response
|
// Wait for login API response
|
||||||
const loginPromise = this.page.waitForResponse(response =>
|
const loginPromise = this.page.waitForResponse(response =>
|
||||||
|
|
@ -54,17 +62,18 @@ export class AuthHelper {
|
||||||
{ timeout: TIMEOUTS.login }
|
{ timeout: TIMEOUTS.login }
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Click submit button
|
||||||
await this.page.click('button[type="submit"]');
|
await this.page.click('button[type="submit"]');
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await loginPromise;
|
await loginPromise;
|
||||||
console.log(`Login as ${credentials.username} successful`);
|
console.log(`Login as ${credentials.username} successful`);
|
||||||
|
|
||||||
// Wait for navigation away from login page
|
// Wait for navigation to dashboard
|
||||||
await this.page.waitForFunction(() =>
|
await this.page.waitForURL(/.*\/dashboard.*/, { timeout: TIMEOUTS.navigation });
|
||||||
!window.location.pathname.includes('/login'),
|
|
||||||
{ timeout: TIMEOUTS.navigation }
|
// Verify login by checking for welcome message
|
||||||
);
|
await this.page.waitForSelector('h4:has-text("Welcome back,")', { timeout: TIMEOUTS.navigation });
|
||||||
|
|
||||||
console.log('Navigation completed to:', this.page.url());
|
console.log('Navigation completed to:', this.page.url());
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
@ -93,7 +102,7 @@ export class AuthHelper {
|
||||||
await this.page.waitForLoadState('networkidle');
|
await this.page.waitForLoadState('networkidle');
|
||||||
|
|
||||||
// If we see a login form, we're already logged out
|
// If we see a login form, we're already logged out
|
||||||
const usernameInput = await this.page.locator('input[name="username"]').isVisible().catch(() => false);
|
const usernameInput = await this.page.locator('input[type="text"], input[data-testid="username"]').isVisible().catch(() => false);
|
||||||
if (usernameInput) {
|
if (usernameInput) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -51,11 +51,15 @@ test.describe('Navigation', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
test('should check what elements are on dashboard', async ({ authenticatedPage: page }) => {
|
test('should check what elements are on dashboard', async ({ authenticatedPage: page }) => {
|
||||||
await page.goto('/');
|
await page.goto('/dashboard');
|
||||||
await page.waitForLoadState('networkidle', { timeout: 5000 });
|
await page.waitForLoadState('networkidle', { timeout: 5000 });
|
||||||
|
|
||||||
console.log('Dashboard URL:', page.url());
|
console.log('Dashboard URL:', page.url());
|
||||||
|
|
||||||
|
// Check for welcome message
|
||||||
|
const welcomeMessage = await page.locator('h4:has-text("Welcome back,")').isVisible();
|
||||||
|
console.log('Welcome message present:', welcomeMessage);
|
||||||
|
|
||||||
// Check for common navigation elements
|
// Check for common navigation elements
|
||||||
const navLinks = await page.locator('a, button').allTextContents();
|
const navLinks = await page.locator('a, button').allTextContents();
|
||||||
console.log('Navigation elements:', navLinks);
|
console.log('Navigation elements:', navLinks);
|
||||||
|
|
@ -68,5 +72,8 @@ test.describe('Navigation', () => {
|
||||||
const uploadTexts = await page.locator(':has-text("Upload"), :has-text("File")').allTextContents();
|
const uploadTexts = await page.locator(':has-text("Upload"), :has-text("File")').allTextContents();
|
||||||
console.log('Upload-related text:', uploadTexts);
|
console.log('Upload-related text:', uploadTexts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Verify we're properly logged in
|
||||||
|
await expect(page.locator('h4:has-text("Welcome back,")')).toBeVisible();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
Loading…
Reference in New Issue