109 lines
4.8 KiB
TypeScript
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);
|
|
});
|