131 lines
4.3 KiB
TypeScript
131 lines
4.3 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
|
|
test.describe('H2H Application', () => {
|
|
test('should load the homepage', async ({ page }) => {
|
|
// Listen for page errors only (ignore 401 for public API)
|
|
const pageErrors: Error[] = [];
|
|
page.on('pageerror', error => {
|
|
pageErrors.push(error);
|
|
});
|
|
|
|
await page.goto('/');
|
|
|
|
// Wait for the page to load
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
if (pageErrors.length > 0) {
|
|
console.log('Page Errors:', pageErrors.map(e => e.message));
|
|
}
|
|
|
|
// Take a screenshot
|
|
await page.screenshot({ path: 'tests/screenshots/homepage.png', fullPage: true });
|
|
|
|
// Basic assertions
|
|
await expect(page).toHaveTitle(/H2H/);
|
|
// Should show the header with H2H logo
|
|
await expect(page.locator('h1:has-text("H2H")')).toBeVisible();
|
|
});
|
|
|
|
test('should navigate to login page', async ({ page }) => {
|
|
await page.goto('/');
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
// Look for login button in header (first one)
|
|
const loginButton = page.getByRole('link', { name: /log in/i }).first();
|
|
await loginButton.click();
|
|
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
await page.screenshot({ path: 'tests/screenshots/login.png', fullPage: true });
|
|
|
|
await expect(page).toHaveURL(/login/);
|
|
});
|
|
|
|
test('should login as admin and see events on home page', async ({ page }) => {
|
|
const pageErrors: Error[] = [];
|
|
page.on('pageerror', error => {
|
|
pageErrors.push(error);
|
|
});
|
|
|
|
// Go to login page
|
|
await page.goto('/login');
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
// Fill in login form
|
|
await page.fill('input[type="email"]', 'admin@h2h.com');
|
|
await page.fill('input[type="password"]', 'admin123');
|
|
|
|
// Submit form
|
|
await page.click('button[type="submit"]');
|
|
|
|
// Wait for navigation after login - now redirects to home page with events
|
|
await page.waitForLoadState('networkidle');
|
|
await page.waitForTimeout(1000);
|
|
|
|
await page.screenshot({ path: 'tests/screenshots/after-login.png', fullPage: true });
|
|
|
|
// Home page should now show events heading
|
|
await expect(page.getByRole('heading', { name: 'Upcoming Events' })).toBeVisible({ timeout: 5000 });
|
|
|
|
if (pageErrors.length > 0) {
|
|
console.log('Page Errors during flow:', pageErrors.map(e => e.message));
|
|
}
|
|
|
|
expect(pageErrors.length).toBe(0);
|
|
});
|
|
|
|
test('should complete full spread betting flow', async ({ page }) => {
|
|
const pageErrors: Error[] = [];
|
|
page.on('pageerror', error => {
|
|
pageErrors.push(error);
|
|
});
|
|
|
|
// Login as alice
|
|
await page.goto('/login');
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
await page.fill('input[type="email"]', 'alice@example.com');
|
|
await page.fill('input[type="password"]', 'password123');
|
|
await page.click('button[type="submit"]');
|
|
|
|
// Wait for home page to load with events
|
|
await page.waitForLoadState('networkidle');
|
|
await page.waitForTimeout(1000);
|
|
|
|
// Events are now shown on the home page
|
|
await expect(page.getByRole('heading', { name: 'Upcoming Events' })).toBeVisible({ timeout: 5000 });
|
|
|
|
await page.screenshot({ path: 'tests/screenshots/events-list.png', fullPage: true });
|
|
|
|
// Click on first event in the table
|
|
const firstEventRow = page.locator('.divide-y button').first();
|
|
if (await firstEventRow.isVisible()) {
|
|
await firstEventRow.click();
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
await page.screenshot({ path: 'tests/screenshots/spread-grid.png', fullPage: true });
|
|
|
|
// Check if spread grid is visible
|
|
const spreadButtons = page.locator('button').filter({ hasText: /^[+-]?\d+\.?\d*$/ });
|
|
const count = await spreadButtons.count();
|
|
console.log(`Found ${count} spread buttons`);
|
|
|
|
// Try to create a bet by clicking an empty spread
|
|
if (count > 0) {
|
|
await spreadButtons.first().click({ timeout: 5000 }).catch(() => {
|
|
console.log('Could not click spread button - might be occupied');
|
|
});
|
|
|
|
await page.waitForTimeout(1000);
|
|
await page.screenshot({ path: 'tests/screenshots/create-bet-modal.png', fullPage: true });
|
|
}
|
|
}
|
|
|
|
if (pageErrors.length > 0) {
|
|
console.log('Page Errors during spread betting flow:', pageErrors.map(e => e.message));
|
|
}
|
|
|
|
expect(pageErrors.length).toBe(0);
|
|
});
|
|
});
|