Production-ready test infrastructure with Page Object Model pattern, reusable fixtures for auth/DB/test-data, and example tests covering login flow, dashboard, accounts CRUD API, and visual regression. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
77 lines
2.5 KiB
TypeScript
77 lines
2.5 KiB
TypeScript
/**
|
|
* E2E tests for the Dashboard page.
|
|
*
|
|
* Uses pre-authenticated state from auth.setup.ts.
|
|
* Verifies dashboard loads, displays data, and navigation works.
|
|
*/
|
|
|
|
import { test, expect } from '../fixtures/base.fixture';
|
|
import { DashboardPage } from '../page-objects';
|
|
|
|
test.describe('Dashboard', () => {
|
|
let dashboard: DashboardPage;
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
dashboard = new DashboardPage(page);
|
|
await dashboard.goto();
|
|
});
|
|
|
|
test('should load the dashboard page', async ({ page }) => {
|
|
await dashboard.assertLoaded();
|
|
await expect(page).toHaveURL(/\/dashboard/);
|
|
});
|
|
|
|
test('should display main content area', async ({ page }) => {
|
|
// Dashboard should have a visible main content area
|
|
await expect(page.locator('main')).toBeVisible();
|
|
});
|
|
|
|
test('should have sidebar navigation', async ({ page }) => {
|
|
// Verify key navigation links are present
|
|
const nav = page.locator('nav').first();
|
|
if (await nav.isVisible({ timeout: 5_000 }).catch(() => false)) {
|
|
await expect(nav).toBeVisible();
|
|
|
|
// Check for common navigation items
|
|
const links = ['Accounts', 'Transactions', 'Budgets'];
|
|
for (const linkName of links) {
|
|
const link = nav.getByRole('link', { name: new RegExp(linkName, 'i') });
|
|
if (await link.isVisible({ timeout: 2_000 }).catch(() => false)) {
|
|
await expect(link).toBeVisible();
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
test('should navigate to accounts page', async ({ page }) => {
|
|
const accountsLink = page.getByRole('link', { name: /accounts/i }).first();
|
|
if (await accountsLink.isVisible({ timeout: 5_000 }).catch(() => false)) {
|
|
await accountsLink.click();
|
|
await page.waitForLoadState('networkidle');
|
|
await expect(page).toHaveURL(/\/accounts/);
|
|
}
|
|
});
|
|
});
|
|
|
|
test.describe('Dashboard with DB verification', () => {
|
|
test('should reflect database state', async ({ page, db }) => {
|
|
// Query the database to get expected account count
|
|
const result = await db.query(
|
|
`SELECT COUNT(*) as count FROM e2e_test_hoa.accounts`,
|
|
).catch(() => ({ rows: [{ count: '0' }] }));
|
|
|
|
const expectedCount = parseInt(result.rows[0].count, 10);
|
|
|
|
// Navigate to dashboard
|
|
const dashboard = new DashboardPage(page);
|
|
await dashboard.goto();
|
|
await dashboard.assertLoaded();
|
|
|
|
// If accounts exist, the dashboard should show some financial data
|
|
if (expectedCount > 0) {
|
|
// Dashboard should contain some numeric content indicating balances
|
|
await expect(page.locator('main')).not.toBeEmpty();
|
|
}
|
|
});
|
|
});
|