233 lines
No EOL
8.9 KiB
TypeScript
233 lines
No EOL
8.9 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
import { STAGING_CONFIG } from '../../playwright.config';
|
|
import { execSync } from 'child_process';
|
|
|
|
test.describe('Final Event Creation Test', () => {
|
|
test.beforeEach(async () => {
|
|
// Clear cache before each test
|
|
console.log('Clearing cache...');
|
|
try {
|
|
execSync('./bin/clear-breeze-cache.sh', { cwd: process.cwd() });
|
|
} catch (error) {
|
|
console.log('Cache clearing error:', error.message);
|
|
}
|
|
});
|
|
|
|
test('should create event handling TinyMCE properly', async ({ page }) => {
|
|
// Login as test_trainer
|
|
await page.goto(`https://${STAGING_CONFIG.url}/wp-login.php`);
|
|
await page.fill('#user_login', 'test_trainer');
|
|
await page.fill('#user_pass', 'Test123!');
|
|
await page.click('#wp-submit');
|
|
|
|
// Wait for dashboard
|
|
await page.waitForURL('**/hvac-dashboard/**', { timeout: 10000 });
|
|
console.log('Logged in successfully');
|
|
|
|
// Navigate to event creation page
|
|
await page.goto(`https://${STAGING_CONFIG.url}/manage-event/`);
|
|
console.log('Navigated to manage-event page');
|
|
|
|
// Wait for page to fully load
|
|
await page.waitForLoadState('networkidle');
|
|
await page.waitForTimeout(3000);
|
|
|
|
// Fill event title
|
|
const titleField = page.locator('input[name="post_title"]');
|
|
await titleField.waitFor({ state: 'visible', timeout: 10000 });
|
|
const eventTitle = `HVAC Training Event ${Date.now()}`;
|
|
await titleField.fill(eventTitle);
|
|
console.log('Filled event title:', eventTitle);
|
|
|
|
// Handle description field using TinyMCE iframe
|
|
const descriptionText = 'This is a comprehensive HVAC training event covering installation, maintenance, and troubleshooting. Learn from industry experts in a hands-on environment. This training will help you advance your HVAC career.';
|
|
|
|
// Check if we need to handle an iframe for TinyMCE
|
|
const iframe = page.frameLocator('iframe#tcepostcontent_ifr');
|
|
const iframeBody = iframe.locator('body');
|
|
|
|
try {
|
|
// Try to type into the iframe
|
|
await iframeBody.click();
|
|
await iframeBody.type(descriptionText);
|
|
console.log('Typed description into TinyMCE iframe');
|
|
} catch (e) {
|
|
console.log('TinyMCE iframe approach failed, trying direct JavaScript');
|
|
|
|
// Use JavaScript to set content directly
|
|
await page.evaluate((text) => {
|
|
// Try TinyMCE first
|
|
if (typeof tinymce !== 'undefined') {
|
|
const editors = tinymce.editors;
|
|
for (let i = 0; i < editors.length; i++) {
|
|
const editor = editors[i];
|
|
if (editor.id === 'tcepostcontent' || editor.id.includes('content')) {
|
|
editor.setContent(text);
|
|
editor.save();
|
|
return;
|
|
}
|
|
}
|
|
|
|
// If no specific editor found, use the first one
|
|
if (editors.length > 0) {
|
|
editors[0].setContent(text);
|
|
editors[0].save();
|
|
}
|
|
}
|
|
|
|
// Also set the hidden textarea directly
|
|
const textarea = document.querySelector('textarea[name="tcepostcontent"]');
|
|
if (textarea) {
|
|
textarea.value = text;
|
|
textarea.style.display = 'block'; // Make it visible
|
|
textarea.style.visibility = 'visible';
|
|
textarea.dispatchEvent(new Event('change', { bubbles: true }));
|
|
}
|
|
|
|
// Try other textareas
|
|
const allTextareas = document.querySelectorAll('textarea');
|
|
allTextareas.forEach(ta => {
|
|
if (ta.name.includes('content') || ta.id.includes('content')) {
|
|
ta.value = text;
|
|
ta.dispatchEvent(new Event('change', { bubbles: true }));
|
|
}
|
|
});
|
|
}, descriptionText);
|
|
console.log('Set description via JavaScript');
|
|
}
|
|
|
|
// Fill date fields
|
|
const tomorrow = new Date();
|
|
tomorrow.setDate(tomorrow.getDate() + 1);
|
|
const dateStr = `${tomorrow.getMonth() + 1}/${tomorrow.getDate()}/${tomorrow.getFullYear()}`;
|
|
|
|
await page.fill('input[name="EventStartDate"]', dateStr);
|
|
await page.fill('input[name="EventEndDate"]', dateStr);
|
|
console.log('Filled dates:', dateStr);
|
|
|
|
// Update time fields
|
|
await page.fill('input[name="EventStartTime"]', '9:00am');
|
|
await page.fill('input[name="EventEndTime"]', '5:00pm');
|
|
console.log('Filled times');
|
|
|
|
// Fill venue information
|
|
const venueName = page.locator('input[name="venue[Venue][]"]').first();
|
|
if (await venueName.isVisible({ timeout: 1000 })) {
|
|
await venueName.fill('HVAC Training Center');
|
|
await page.fill('input[name="venue[Address][]"]', '123 Main Street');
|
|
await page.fill('input[name="venue[City][]"]', 'Atlanta');
|
|
|
|
// Try to select state
|
|
const stateSelect = page.locator('select[name="venue[State][]"]');
|
|
if (await stateSelect.isVisible()) {
|
|
await stateSelect.selectOption('GA');
|
|
} else {
|
|
// Try text input for state
|
|
const stateInput = page.locator('input[name="venue[State][]"], input[name="venue[Province][]"]').first();
|
|
if (await stateInput.isVisible()) {
|
|
await stateInput.fill('GA');
|
|
}
|
|
}
|
|
|
|
await page.fill('input[name="venue[Zip][]"]', '30301');
|
|
console.log('Filled venue information');
|
|
}
|
|
|
|
// Fill organizer information
|
|
const organizerName = page.locator('input[name="organizer[Organizer][]"]').first();
|
|
if (await organizerName.isVisible({ timeout: 1000 })) {
|
|
await organizerName.fill('HVAC Training Institute');
|
|
await page.fill('input[name="organizer[Email][]"]', 'training@hvacupskill.com');
|
|
await page.fill('input[name="organizer[Phone][]"]', '555-1234');
|
|
console.log('Filled organizer information');
|
|
}
|
|
|
|
// Take a screenshot before submission
|
|
await page.screenshot({ path: 'test-results/pre-submit-final.png', fullPage: true });
|
|
|
|
// Ensure TinyMCE content is saved before submission
|
|
await page.evaluate(() => {
|
|
if (typeof tinymce !== 'undefined' && tinymce.editors.length > 0) {
|
|
tinymce.triggerSave();
|
|
}
|
|
});
|
|
|
|
// Scroll to submit button
|
|
await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
|
|
await page.waitForTimeout(1000);
|
|
|
|
// Find and click the submit button
|
|
const submitButton = page.locator('input[type="submit"][value="Submit Event"]');
|
|
await submitButton.waitFor({ state: 'visible', timeout: 5000 });
|
|
|
|
// Capture URL before submission
|
|
const beforeSubmitUrl = page.url();
|
|
|
|
// Click submit
|
|
await submitButton.click();
|
|
console.log('Clicked submit button');
|
|
|
|
// Wait for response
|
|
await page.waitForTimeout(10000);
|
|
|
|
// Take a screenshot after submission
|
|
await page.screenshot({ path: 'test-results/post-submit-final.png', fullPage: true });
|
|
|
|
// Check results
|
|
const afterSubmitUrl = page.url();
|
|
const hasNavigated = beforeSubmitUrl !== afterSubmitUrl;
|
|
|
|
console.log('Before URL:', beforeSubmitUrl);
|
|
console.log('After URL:', afterSubmitUrl);
|
|
console.log('Navigation occurred:', hasNavigated);
|
|
|
|
// Look for success indicators
|
|
const hasSuccessMessage = await page.locator('.tribe-success-msg, .success, .notice-success, .updated').count() > 0;
|
|
const hasErrorMessage = await page.locator('.tribe-error, .error, .notice-error').count() > 0;
|
|
|
|
console.log('Has success message:', hasSuccessMessage);
|
|
console.log('Has error message:', hasErrorMessage);
|
|
|
|
// Get any messages
|
|
if (hasErrorMessage) {
|
|
const errorElements = await page.locator('.tribe-error, .error, .notice-error').all();
|
|
for (const element of errorElements) {
|
|
const text = await element.textContent();
|
|
console.log('Error message:', text);
|
|
}
|
|
}
|
|
|
|
if (hasSuccessMessage) {
|
|
const successElements = await page.locator('.tribe-success-msg, .success, .notice-success, .updated').all();
|
|
for (const element of successElements) {
|
|
const text = await element.textContent();
|
|
console.log('Success message:', text);
|
|
}
|
|
}
|
|
|
|
// Check the page content for specific error messages
|
|
const pageContent = await page.content();
|
|
if (pageContent.includes('Event Description is required')) {
|
|
console.log('Found description validation error in page content');
|
|
|
|
// Log what's in the textarea
|
|
const textareaValue = await page.evaluate(() => {
|
|
const ta = document.querySelector('textarea[name="tcepostcontent"]');
|
|
return ta ? ta.value : 'not found';
|
|
});
|
|
console.log('Textarea value:', textareaValue);
|
|
|
|
// Log what's in TinyMCE
|
|
const tinymceContent = await page.evaluate(() => {
|
|
if (typeof tinymce !== 'undefined' && tinymce.editors.length > 0) {
|
|
return tinymce.editors[0].getContent();
|
|
}
|
|
return 'TinyMCE not found';
|
|
});
|
|
console.log('TinyMCE content:', tinymceContent);
|
|
}
|
|
|
|
// Assert success
|
|
expect(hasNavigated || hasSuccessMessage).toBeTruthy();
|
|
});
|
|
}); |