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();
 | |
|   });
 | |
| }); |