150 lines
No EOL
5.3 KiB
TypeScript
150 lines
No EOL
5.3 KiB
TypeScript
import { STAGING_URL, PATHS, TIMEOUTS } from './config/staging-config';
|
|
import { test, expect } from '@playwright/test';
|
|
|
|
// STAGING_URL is now imported from config
|
|
|
|
test.describe('Working Event Creation', () => {
|
|
test('should successfully create an event with all required fields', async ({ page }) => {
|
|
// Login
|
|
await page.goto(PATHS.login);
|
|
await page.fill('#user_login', 'test_trainer');
|
|
await page.fill('#user_pass', 'Test123!');
|
|
await page.click('#wp-submit');
|
|
await page.waitForURL('**/hvac-dashboard/');
|
|
|
|
// Navigate to create event
|
|
const createEventBtn = page.locator('a:has-text("CREATE EVENT"), a:has-text("Create Event")').first();
|
|
await createEventBtn.click();
|
|
await page.waitForLoadState('networkidle');
|
|
|
|
// Fill all required fields
|
|
const eventTitle = `HVAC Training Event ${Date.now()}`;
|
|
await page.fill('input[name="post_title"]', eventTitle);
|
|
console.log('Filled title:', eventTitle);
|
|
|
|
// Fill description - REQUIRED
|
|
// First try to switch to text editor mode
|
|
const textTab = page.locator('#content-text, #content-tmce, .switch-text');
|
|
if (await textTab.isVisible()) {
|
|
await textTab.click();
|
|
await page.waitForTimeout(500);
|
|
}
|
|
|
|
const description = `This is a comprehensive HVAC training event covering installation, maintenance, and troubleshooting techniques. Created on ${new Date().toLocaleString()}`;
|
|
|
|
// Try multiple selectors for description
|
|
const descriptionFilled = await page.evaluate((desc) => {
|
|
// Try direct textarea
|
|
const textarea = document.querySelector('textarea[name="post_content"], textarea#content');
|
|
if (textarea) {
|
|
(textarea as HTMLTextAreaElement).value = desc;
|
|
return true;
|
|
}
|
|
|
|
// Try via jQuery if available
|
|
if (typeof jQuery !== 'undefined') {
|
|
const $textarea = jQuery('#content, textarea[name="post_content"]');
|
|
if ($textarea.length) {
|
|
$textarea.val(desc);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}, description);
|
|
|
|
if (!descriptionFilled) {
|
|
// Try the iframe approach
|
|
const iframe = page.frameLocator('iframe[id*="content"], iframe[title*="editor"]').first();
|
|
await iframe.locator('body').fill(description);
|
|
}
|
|
|
|
console.log('Filled description');
|
|
|
|
// Fill date and time fields
|
|
const today = new Date();
|
|
const dateStr = `${(today.getMonth() + 1).toString().padStart(2, '0')}/${today.getDate().toString().padStart(2, '0')}/${today.getFullYear()}`;
|
|
|
|
await page.fill('input#EventStartDate', dateStr);
|
|
await page.fill('input#EventEndDate', dateStr);
|
|
await page.fill('input#EventStartTime', '10:00');
|
|
await page.fill('input#EventEndTime', '12:00');
|
|
console.log('Filled dates and times');
|
|
|
|
// Check if organizer/venue dropdowns exist and have options
|
|
const organizerSelect = page.locator('select[name="organizer"]');
|
|
if (await organizerSelect.isVisible()) {
|
|
const options = await organizerSelect.locator('option').count();
|
|
if (options > 1) {
|
|
await organizerSelect.selectOption({ index: 1 });
|
|
console.log('Selected organizer');
|
|
}
|
|
}
|
|
|
|
const venueSelect = page.locator('select[name="venue"]');
|
|
if (await venueSelect.isVisible()) {
|
|
const options = await venueSelect.locator('option').count();
|
|
if (options > 1) {
|
|
await venueSelect.selectOption({ index: 1 });
|
|
console.log('Selected venue');
|
|
}
|
|
}
|
|
|
|
// Scroll to submit button
|
|
await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
|
|
await page.waitForTimeout(1000);
|
|
|
|
// Submit the form
|
|
const submitButton = page.locator('input[type="submit"][value="Submit Event"]');
|
|
|
|
// Listen for navigation
|
|
const navigationPromise = page.waitForNavigation({
|
|
timeout: 15000,
|
|
waitUntil: 'networkidle'
|
|
}).catch(() => null);
|
|
|
|
await submitButton.click();
|
|
console.log('Clicked submit button');
|
|
|
|
// Wait for response
|
|
const navigated = await navigationPromise;
|
|
await page.waitForTimeout(3000);
|
|
|
|
// Take screenshot
|
|
await page.screenshot({ path: 'test-results/working-event-creation-result.png', fullPage: true });
|
|
|
|
// Check for success
|
|
const currentUrl = page.url();
|
|
console.log('Current URL:', currentUrl);
|
|
|
|
// Look for success indicators
|
|
const successMessages = [
|
|
'.updated',
|
|
'.notice-success',
|
|
'.tribe-success',
|
|
'.success-message',
|
|
'.message.updated'
|
|
];
|
|
|
|
let successFound = false;
|
|
for (const selector of successMessages) {
|
|
if (await page.locator(selector).isVisible()) {
|
|
const text = await page.locator(selector).textContent();
|
|
console.log('Success message found:', text);
|
|
successFound = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Check if we were redirected to a success page or the event page
|
|
const urlChanged = !currentUrl.includes('/manage-event/');
|
|
const hasEventInUrl = currentUrl.includes('/event/') || currentUrl.includes('/tribe_events/');
|
|
|
|
console.log('Success found:', successFound);
|
|
console.log('URL changed:', urlChanged);
|
|
console.log('Has event in URL:', hasEventInUrl);
|
|
|
|
// Success criteria: success message OR URL change OR event URL
|
|
expect(successFound || urlChanged || hasEventInUrl).toBeTruthy();
|
|
});
|
|
}); |