// @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 ? `
✓ Presale access granted
` : ''}
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}`);
});
});