Major fixes and improvements: - Fixed edit event button functionality with proper event handlers and DOM ready state checking - Added status column to tickets table via Supabase migration to resolve 500 API errors - Updated stats API to correctly calculate revenue from decimal price values - Resolved authentication redirect loops by fixing cookie configuration for Docker environment - Fixed Permissions-Policy header syntax errors - Added comprehensive debugging and error handling for event management - Implemented modal-based event editing with form validation and API integration - Enhanced event data loading with proper error handling and user feedback 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
180 lines
7.3 KiB
JavaScript
180 lines
7.3 KiB
JavaScript
const puppeteer = require('puppeteer');
|
||
const path = require('path');
|
||
|
||
async function runFinalVerification() {
|
||
const browser = await puppeteer.launch({
|
||
headless: false,
|
||
defaultViewport: { width: 1200, height: 800 },
|
||
args: ['--no-sandbox', '--disable-setuid-sandbox']
|
||
});
|
||
|
||
const page = await browser.newPage();
|
||
|
||
// Enable console logging
|
||
page.on('console', msg => {
|
||
const type = msg.type();
|
||
if (['error', 'warn'].includes(type)) {
|
||
console.log(`[${type.toUpperCase()}] ${msg.text()}`);
|
||
}
|
||
});
|
||
|
||
const results = {
|
||
login: { status: '❌', errors: [] },
|
||
scanner: { status: '❌', errors: [] },
|
||
templates: { status: '❌', errors: [] },
|
||
calendar: { status: '❌', errors: [] },
|
||
eventManagement: { status: '❌', errors: [] }
|
||
};
|
||
|
||
try {
|
||
console.log('🚀 Starting Final Verification Test...\n');
|
||
|
||
// Test 1: Login
|
||
console.log('1️⃣ Testing Login...');
|
||
await page.goto('http://localhost:3000/login');
|
||
await page.waitForSelector('form');
|
||
|
||
await page.type('input[type="email"]', 'tmartinez@gmail.com');
|
||
await page.type('input[type="password"]', 'Skittles@420');
|
||
|
||
await page.screenshot({ path: 'verification-login-form.png' });
|
||
|
||
await page.click('button[type="submit"]');
|
||
await page.waitForNavigation({ waitUntil: 'networkidle0' });
|
||
|
||
const currentUrl = page.url();
|
||
if (currentUrl.includes('/dashboard')) {
|
||
results.login.status = '✅';
|
||
console.log(' ✅ Login successful - redirected to dashboard');
|
||
} else {
|
||
results.login.status = '❌';
|
||
console.log(` ❌ Login failed - ended up at: ${currentUrl}`);
|
||
}
|
||
|
||
await page.screenshot({ path: 'verification-dashboard.png' });
|
||
|
||
// Test 2: QR Scanner
|
||
console.log('\n2️⃣ Testing QR Scanner...');
|
||
await page.goto('http://localhost:3000/scan');
|
||
await page.waitForSelector('body', { timeout: 5000 });
|
||
|
||
const scannerContent = await page.content();
|
||
if (scannerContent.includes('scanner') || scannerContent.includes('QR') || scannerContent.includes('camera')) {
|
||
results.scanner.status = '✅';
|
||
console.log(' ✅ Scanner page loads scanner interface');
|
||
} else if (scannerContent.includes('Welcome to Black Canyon Tickets')) {
|
||
results.scanner.status = '❌';
|
||
console.log(' ❌ Scanner redirects to homepage');
|
||
} else {
|
||
results.scanner.status = '⚠️';
|
||
console.log(' ⚠️ Scanner page unclear content');
|
||
}
|
||
|
||
await page.screenshot({ path: 'verification-scanner.png' });
|
||
|
||
// Test 3: Templates
|
||
console.log('\n3️⃣ Testing Templates...');
|
||
await page.goto('http://localhost:3000/templates');
|
||
await page.waitForSelector('body', { timeout: 5000 });
|
||
|
||
const templatesUrl = page.url();
|
||
const templatesContent = await page.content();
|
||
|
||
if (templatesUrl.includes('/login')) {
|
||
results.templates.status = '❌';
|
||
console.log(' ❌ Templates redirects to login');
|
||
} else if (templatesContent.includes('template') || templatesContent.includes('Templates')) {
|
||
results.templates.status = '✅';
|
||
console.log(' ✅ Templates page loads properly');
|
||
} else {
|
||
results.templates.status = '⚠️';
|
||
console.log(' ⚠️ Templates page unclear content');
|
||
}
|
||
|
||
await page.screenshot({ path: 'verification-templates.png' });
|
||
|
||
// Test 4: Calendar
|
||
console.log('\n4️⃣ Testing Calendar...');
|
||
await page.goto('http://localhost:3000/calendar');
|
||
await page.waitForSelector('body', { timeout: 5000 });
|
||
|
||
const calendarContent = await page.content();
|
||
const hasCalendarGrid = await page.$('.calendar-grid, .calendar, [class*="calendar"]');
|
||
|
||
if (hasCalendarGrid || calendarContent.includes('calendar') || calendarContent.includes('Calendar')) {
|
||
results.calendar.status = '✅';
|
||
console.log(' ✅ Calendar page shows calendar interface');
|
||
} else {
|
||
results.calendar.status = '❌';
|
||
console.log(' ❌ Calendar page shows blank or incorrect content');
|
||
}
|
||
|
||
await page.screenshot({ path: 'verification-calendar.png' });
|
||
|
||
// Test 5: Event Management
|
||
console.log('\n5️⃣ Testing Event Management...');
|
||
|
||
// First, get an event ID from dashboard
|
||
await page.goto('http://localhost:3000/dashboard');
|
||
await page.waitForSelector('body', { timeout: 5000 });
|
||
|
||
const eventLink = await page.$('a[href*="/events/"][href*="/manage"]');
|
||
if (eventLink) {
|
||
const href = await page.evaluate(el => el.href, eventLink);
|
||
console.log(` Found event link: ${href}`);
|
||
|
||
await page.goto(href);
|
||
await page.waitForSelector('body', { timeout: 5000 });
|
||
|
||
const manageContent = await page.content();
|
||
const hasStats = manageContent.includes('stats') || manageContent.includes('Revenue') || manageContent.includes('Tickets Sold');
|
||
|
||
if (hasStats) {
|
||
results.eventManagement.status = '✅';
|
||
console.log(' ✅ Event management page loads with stats');
|
||
} else {
|
||
results.eventManagement.status = '❌';
|
||
console.log(' ❌ Event management page missing stats');
|
||
}
|
||
|
||
await page.screenshot({ path: 'verification-event-management.png' });
|
||
} else {
|
||
results.eventManagement.status = '⚠️';
|
||
console.log(' ⚠️ No events found to test management page');
|
||
await page.screenshot({ path: 'verification-no-events.png' });
|
||
}
|
||
|
||
// Collect console errors
|
||
const errors = [];
|
||
page.on('pageerror', error => {
|
||
errors.push(error.message);
|
||
});
|
||
|
||
console.log('\n📊 FINAL VERIFICATION RESULTS:');
|
||
console.log('================================');
|
||
console.log(`Login: ${results.login.status}`);
|
||
console.log(`QR Scanner: ${results.scanner.status}`);
|
||
console.log(`Templates: ${results.templates.status}`);
|
||
console.log(`Calendar: ${results.calendar.status}`);
|
||
console.log(`Event Management: ${results.eventManagement.status}`);
|
||
|
||
const successCount = Object.values(results).filter(r => r.status === '✅').length;
|
||
const totalTests = Object.keys(results).length;
|
||
|
||
console.log(`\n🎯 Overall Success Rate: ${successCount}/${totalTests} (${Math.round(successCount/totalTests*100)}%)`);
|
||
|
||
if (errors.length > 0) {
|
||
console.log('\n🚨 Console Errors Found:');
|
||
errors.forEach(error => console.log(` - ${error}`));
|
||
} else {
|
||
console.log('\n✅ No critical console errors detected');
|
||
}
|
||
|
||
} catch (error) {
|
||
console.error('❌ Test failed:', error.message);
|
||
} finally {
|
||
await browser.close();
|
||
}
|
||
}
|
||
|
||
runFinalVerification(); |