- Created Page Object Model structure for all trainer-facing pages - Implemented complete test coverage for trainer journey steps 1-8 - Added centralized test data management with test users and events - Updated run-tests.sh with --trainer-journey option for easy execution - Enhanced documentation with test setup, usage, and troubleshooting guides - Created verification scripts to ensure proper test environment setup - Prepared framework for Phase 2/3 features (email, check-in, certificates) This implementation provides a solid foundation for testing the complete trainer user journey and can be easily extended as new features are deployed.
70 lines
No EOL
2.5 KiB
TypeScript
70 lines
No EOL
2.5 KiB
TypeScript
import { Page } from '@playwright/test';
|
|
import { BasePage } from './BasePage';
|
|
|
|
export class CreateEventPage extends BasePage {
|
|
private readonly eventTitleField = '#title';
|
|
private readonly eventDescriptionField = 'textarea[name="content"]';
|
|
private readonly startDateField = '#EventStartDate';
|
|
private readonly startTimeField = '#EventStartTime';
|
|
private readonly endDateField = '#EventEndDate';
|
|
private readonly endTimeField = '#EventEndTime';
|
|
private readonly venueSelector = '#venue';
|
|
private readonly organizerSelector = '#organizer';
|
|
private readonly publishButton = 'input[name="community-event"][value="Publish"]';
|
|
private readonly draftButton = 'input[name="community-event"][value="Draft"]';
|
|
private readonly returnToDashboardLink = 'a:has-text("Return to Dashboard")';
|
|
|
|
constructor(page: Page) {
|
|
super(page);
|
|
}
|
|
|
|
async navigateToCreateEvent(): Promise<void> {
|
|
await this.navigate('/create-event/');
|
|
}
|
|
|
|
async fillEventDetails(eventData: {
|
|
title: string;
|
|
description: string;
|
|
startDate: string;
|
|
startTime: string;
|
|
endDate: string;
|
|
endTime: string;
|
|
venue?: string;
|
|
organizer?: string;
|
|
}): Promise<void> {
|
|
await this.fill(this.eventTitleField, eventData.title);
|
|
await this.fill(this.eventDescriptionField, eventData.description);
|
|
await this.fill(this.startDateField, eventData.startDate);
|
|
await this.fill(this.startTimeField, eventData.startTime);
|
|
await this.fill(this.endDateField, eventData.endDate);
|
|
await this.fill(this.endTimeField, eventData.endTime);
|
|
|
|
if (eventData.venue) {
|
|
await this.page.selectOption(this.venueSelector, eventData.venue);
|
|
}
|
|
|
|
if (eventData.organizer) {
|
|
await this.page.selectOption(this.organizerSelector, eventData.organizer);
|
|
}
|
|
}
|
|
|
|
async publishEvent(): Promise<void> {
|
|
await this.click(this.publishButton);
|
|
await this.waitForNavigation();
|
|
}
|
|
|
|
async saveDraft(): Promise<void> {
|
|
await this.click(this.draftButton);
|
|
await this.waitForNavigation();
|
|
}
|
|
|
|
async returnToDashboard(): Promise<void> {
|
|
await this.click(this.returnToDashboardLink);
|
|
await this.waitForNavigation();
|
|
}
|
|
|
|
async isFormVisible(): Promise<boolean> {
|
|
return await this.isVisible(this.eventTitleField) &&
|
|
await this.isVisible(this.eventDescriptionField);
|
|
}
|
|
} |