Files
h2h-prototype/frontend/tests/simple-flow.spec.ts

109 lines
4.8 KiB
TypeScript

import { test, expect } from '@playwright/test';
test('Complete application flow verification', async ({ page }) => {
const errors: string[] = [];
page.on('pageerror', error => errors.push(`PAGE ERROR: ${error.message}`));
console.log('\n====================================');
console.log(' TESTING H2H APPLICATION');
console.log('====================================\n');
// Test 1: Homepage loads
console.log('TEST 1: Loading homepage...');
await page.goto('/');
await page.waitForLoadState('networkidle');
const title = await page.title();
console.log(`✓ Homepage loaded: "${title}"`);
await page.screenshot({ path: 'tests/screenshots/flow-01-homepage.png' });
// Test 2: Can navigate to login (button in header now)
console.log('\nTEST 2: Navigating to login...');
await page.getByRole('link', { name: /log in/i }).first().click();
await page.waitForURL('**/login');
console.log('✓ Login page loaded');
await page.screenshot({ path: 'tests/screenshots/flow-02-login.png' });
// Test 3: Can login as admin
console.log('\nTEST 3: Logging in as admin...');
await page.fill('input[type="email"]', 'admin@h2h.com');
await page.fill('input[type="password"]', 'admin123');
await page.click('button[type="submit"]');
await page.waitForLoadState('networkidle');
await page.waitForTimeout(1000);
const currentUrl = page.url();
console.log(`✓ Logged in successfully, redirected to: ${currentUrl}`);
await page.screenshot({ path: 'tests/screenshots/flow-03-logged-in.png' });
// Test 4: Check navigation links (events are now on home page)
console.log('\nTEST 4: Checking available navigation links...');
const links = await page.locator('nav a').allTextContents();
console.log('Available links:', links);
const hasAdmin = links.some(l => l.toLowerCase().includes('admin'));
const hasMyBets = links.some(l => l.toLowerCase().includes('my bets'));
const hasWallet = links.some(l => l.toLowerCase().includes('wallet'));
console.log(` - Admin link: ${hasAdmin ? '✓ Found' : '✗ Not found'}`);
console.log(` - My Bets link: ${hasMyBets ? '✓ Found' : '✗ Not found'}`);
console.log(` - Wallet link: ${hasWallet ? '✓ Found' : '✗ Not found'}`);
// Test 5: Home page shows events for authenticated users
console.log('\nTEST 5: Checking events on home page...');
await expect(page.getByRole('heading', { name: 'Upcoming Events' })).toBeVisible({ timeout: 5000 });
console.log('✓ Upcoming Events section visible');
// Check for events in the table
const eventRows = page.locator('.divide-y button');
const eventCount = await eventRows.count();
console.log(`✓ Found ${eventCount} sport events`);
await page.screenshot({ path: 'tests/screenshots/flow-04-events-home.png' });
if (eventCount > 0) {
console.log('\nTEST 6: Viewing event spread grid...');
await eventRows.first().click();
await page.waitForLoadState('networkidle');
await page.waitForTimeout(1000);
console.log('✓ Event details loaded');
await page.screenshot({ path: 'tests/screenshots/flow-05-spread-grid.png' });
// Check if spread grid is visible
const bodyText = await page.textContent('body');
const hasEventName = bodyText?.includes('Wake Forest') || bodyText?.includes('Lakers') || bodyText?.includes('Chiefs');
console.log(` - Event details visible: ${hasEventName ? '✓ Yes' : '✗ No'}`);
// Go back to home
await page.click('button:has-text("Back to Events")');
await page.waitForLoadState('networkidle');
}
// Test 7: Can login as regular user
console.log('\nTEST 7: Testing regular user login...');
await page.getByRole('button', { name: /logout/i }).click();
await page.waitForTimeout(1000);
await page.goto('/login');
await page.fill('input[type="email"]', 'alice@example.com');
await page.fill('input[type="password"]', 'password123');
await page.click('button[type="submit"]');
await page.waitForLoadState('networkidle');
await page.waitForTimeout(1000);
console.log('✓ Alice logged in successfully');
await page.screenshot({ path: 'tests/screenshots/flow-06-alice-login.png' });
// Check alice's navigation - should NOT have admin link
const aliceLinks = await page.locator('nav a').allTextContents();
const aliceHasAdmin = aliceLinks.some(l => l.toLowerCase().includes('admin'));
console.log(` - Admin link for Alice: ${aliceHasAdmin ? '✗ SHOULD NOT BE VISIBLE' : '✓ Correctly hidden'}`);
console.log('\n====================================');
console.log(' ERROR SUMMARY');
console.log('====================================');
if (errors.length > 0) {
console.log('\nErrors found:');
errors.forEach(e => console.log(`${e}`));
} else {
console.log('\n✓ NO ERRORS - Application is working correctly!');
}
console.log('\n====================================\n');
// Final assertion
expect(errors.length).toBe(0);
});