// @ts-check const { test, expect } = require('@playwright/test'); /** * Test Data Setup and Event Creation * * This script helps create test events and data for ticket purchasing tests. * It can be run independently or as part of the test suite setup. */ class TestDataManager { constructor(page) { this.page = page; } async createTestEvent(eventData) { // This would typically interact with your admin interface or API // to create test events. For now, we'll mock the responses. const eventSlug = eventData.slug || 'test-event-' + Date.now(); // Mock the event page response await this.page.route(`**/e/${eventSlug}`, async route => { const mockEventHTML = this.generateMockEventHTML(eventData, eventSlug); await route.fulfill({ status: 200, contentType: 'text/html', body: mockEventHTML }); }); return { ...eventData, slug: eventSlug }; } generateMockEventHTML(eventData, slug) { return ` ${eventData.title} - Black Canyon Tickets

${eventData.title}

📅 ${eventData.date}
📍 ${eventData.venue}
${eventData.description ? `

${eventData.description}

` : ''}
${eventData.presaleRequired ? `
` : ''}

Get Your Tickets

${eventData.ticketTypes.map((ticket, index) => `

${ticket.name}

${ticket.description ? `

${ticket.description}

` : ''}
$${ticket.price.toFixed(2)} ${ticket.available} available
0
`).join('')}
⏰ Tickets reserved for 15:00

Order Summary

Subtotal: $0.00
Platform fee: $0.00
Total: $0.00
`; } // Predefined test events static getTestEvents() { return { basicEvent: { title: 'Sample Music Concert', date: 'Friday, December 15, 2024 at 8:00 PM', venue: 'Grand Theater', description: 'An amazing evening of live music featuring local artists.', presaleRequired: false, ticketTypes: [ { name: 'General Admission', price: 25.00, available: 50, description: 'Standing room on the main floor' }, { name: 'VIP Seating', price: 75.00, available: 20, description: 'Reserved seating with complimentary drink' }, { name: 'Student Discount', price: 15.00, available: 30, description: 'Valid student ID required at entry' } ] }, presaleEvent: { title: 'Exclusive Art Gallery Opening', date: 'Saturday, December 16, 2024 at 6:00 PM', venue: 'Modern Art Museum', description: 'Private preview of the new contemporary art exhibition.', presaleRequired: true, ticketTypes: [ { name: 'Early Bird Special', price: 35.00, available: 25, description: 'First access to the exhibition' }, { name: 'Collector Pass', price: 95.00, available: 10, description: 'Includes exclusive artist meet & greet' } ] }, soldOutEvent: { title: 'Popular Dance Performance', date: 'Sunday, December 17, 2024 at 7:30 PM', venue: 'City Performance Hall', description: 'Award-winning dance troupe presents their latest show.', presaleRequired: false, ticketTypes: [ { name: 'Orchestra Seating', price: 65.00, available: 0, description: 'Best view of the performance' }, { name: 'Balcony Seating', price: 45.00, available: 0, description: 'Elevated view with great acoustics' } ] }, lowStockEvent: { title: 'Intimate Jazz Session', date: 'Monday, December 18, 2024 at 9:00 PM', venue: 'Blue Note Lounge', description: 'Close-up performance with renowned jazz musicians.', presaleRequired: false, ticketTypes: [ { name: 'Table for Two', price: 120.00, available: 2, description: 'Prime table with bottle service' }, { name: 'Bar Seating', price: 45.00, available: 3, description: 'Seats at the jazz bar' }, { name: 'Standing Room', price: 25.00, available: 8, description: 'Standing area near the stage' } ] } }; } } // Export for use in other test files if (typeof module !== 'undefined' && module.exports) { module.exports = { TestDataManager }; } // Standalone test for data setup validation test.describe('Test Data Setup', () => { test('should create basic test event successfully', async ({ page }) => { const dataManager = new TestDataManager(page); const testEvents = TestDataManager.getTestEvents(); const event = await dataManager.createTestEvent(testEvents.basicEvent); await page.goto(`/e/${event.slug}`); // Verify event was created correctly await expect(page.locator('[data-test="event-title"]')).toContainText(event.title); await expect(page.locator('[data-test="venue"]')).toContainText(event.venue); // Verify ticket types are present const ticketTypes = page.locator('[data-test="ticket-type"]'); await expect(ticketTypes).toHaveCount(event.ticketTypes.length); console.log(`✓ Test event created: ${event.title} (${event.slug})`); }); test('should create presale event with code validation', async ({ page }) => { const dataManager = new TestDataManager(page); const testEvents = TestDataManager.getTestEvents(); const event = await dataManager.createTestEvent(testEvents.presaleEvent); await page.goto(`/e/${event.slug}`); // Verify presale section is visible await expect(page.locator('[data-test="presale-code-section"]')).toBeVisible(); // Test invalid code await page.fill('#presale-code', 'INVALID123'); await page.click('button:has-text("Apply Code")'); await expect(page.locator('[data-test="presale-error"]')).toBeVisible(); // Test valid code await page.fill('#presale-code', 'VALID123'); await page.click('button:has-text("Apply Code")'); await expect(page.locator('[data-test="presale-success"]')).toBeVisible(); console.log(`✓ Presale event created with validation: ${event.title}`); }); test('should create sold out event with disabled controls', async ({ page }) => { const dataManager = new TestDataManager(page); const testEvents = TestDataManager.getTestEvents(); const event = await dataManager.createTestEvent(testEvents.soldOutEvent); await page.goto(`/e/${event.slug}`); // Verify all increase buttons are disabled const increaseButtons = page.locator('.increase-btn'); const buttonCount = await increaseButtons.count(); for (let i = 0; i < buttonCount; i++) { await expect(increaseButtons.nth(i)).toBeDisabled(); } // Verify availability display shows 0 await expect(page.locator('[data-test="availability-display"]').first()).toContainText('0 available'); console.log(`✓ Sold out event created: ${event.title}`); }); });