import { STAGING_URL, PATHS, TIMEOUTS } from './config/staging-config'; import { test, expect } from '@playwright/test'; // STAGING_URL is now imported from config test.describe('Event Debug Final', () => { test('debug exact event submission requirements', async ({ page }) => { // Enable console logging page.on('console', msg => { if (msg.type() === 'error') { console.log('Console error:', msg.text()); } }); // 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 await page.click('a:has-text("CREATE EVENT")'); await page.waitForLoadState('networkidle'); await page.waitForTimeout(3000); // Ensure everything loads // Fill title const eventTitle = `Debug Event ${Date.now()}`; await page.fill('input[name="post_title"]', eventTitle); // Debug: Check what type of editor we have const editorInfo = await page.evaluate(() => { const info: any = {}; // Check for TinyMCE if (typeof tinymce !== 'undefined') { info.tinymce = true; info.activeEditor = tinymce.activeEditor ? true : false; info.editorId = tinymce.activeEditor ? tinymce.activeEditor.id : null; } // Check for textarea const textarea = document.querySelector('textarea#content, textarea[name="post_content"]'); info.textarea = textarea ? true : false; info.textareaVisible = textarea ? (textarea as HTMLElement).offsetParent !== null : false; // Check for iframe const iframe = document.querySelector('iframe[id*="content"], iframe[title*="editor"]'); info.iframe = iframe ? true : false; return info; }); console.log('Editor info:', editorInfo); // Try multiple approaches to fill description const description = 'This is a required description for the HVAC training event.'; // Method 1: Direct TinyMCE API const tinymceResult = await page.evaluate((desc) => { if (typeof tinymce !== 'undefined' && tinymce.activeEditor) { tinymce.activeEditor.setContent(desc); // Trigger change events tinymce.activeEditor.fire('change'); tinymce.activeEditor.save(); return true; } return false; }, description).catch(() => false); console.log('TinyMCE method result:', tinymceResult); // Method 2: Fill hidden textarea const textareaResult = await page.evaluate((desc) => { const textarea = document.querySelector('textarea#content, textarea[name="post_content"]'); if (textarea) { (textarea as HTMLTextAreaElement).value = desc; // Trigger events textarea.dispatchEvent(new Event('change', { bubbles: true })); textarea.dispatchEvent(new Event('input', { bubbles: true })); return true; } return false; }, description).catch(() => false); console.log('Textarea method result:', textareaResult); // Method 3: Fill iframe if visible try { const iframe = page.frameLocator('iframe[id*="content"], iframe[title*="editor"]').first(); await iframe.locator('body').click(); await iframe.locator('body').fill(description); console.log('Iframe method succeeded'); } catch (e) { console.log('Iframe method failed:', e.message); } // Fill dates and times 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 AM'); await page.fill('input#EventEndTime', '12:00 PM'); // Verify description is set before submitting const contentCheck = await page.evaluate(() => { const checks: any = {}; // Check TinyMCE content if (typeof tinymce !== 'undefined' && tinymce.activeEditor) { checks.tinymceContent = tinymce.activeEditor.getContent(); } // Check textarea value const textarea = document.querySelector('textarea#content, textarea[name="post_content"]'); if (textarea) { checks.textareaContent = (textarea as HTMLTextAreaElement).value; } // Check form data const form = document.querySelector('form'); if (form) { const formData = new FormData(form as HTMLFormElement); checks.formData = {}; formData.forEach((value, key) => { checks.formData[key] = value; }); } return checks; }); console.log('Content check before submit:', contentCheck); // Try to find and click the submit button await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight)); await page.waitForTimeout(1000); // Debug: Check all submit buttons const submitButtons = await page.evaluate(() => { const buttons = document.querySelectorAll('input[type="submit"], button[type="submit"]'); return Array.from(buttons).map(btn => ({ value: (btn as HTMLInputElement).value || btn.textContent, name: (btn as HTMLInputElement).name, id: btn.id, visible: (btn as HTMLElement).offsetParent !== null })); }); console.log('Submit buttons found:', submitButtons); // Click the submit button const submitButton = page.locator('input[type="submit"][value="Submit Event"]'); // Listen for network activity page.on('request', request => { if (request.method() === 'POST') { console.log('POST request:', request.url()); } }); page.on('response', response => { if (response.status() >= 400) { console.log('Error response:', response.status(), response.url()); } }); // Submit form await submitButton.click(); console.log('Clicked submit'); // Wait and check result await page.waitForTimeout(5000); // Final check const finalUrl = page.url(); const finalContent = await page.content(); console.log('Final URL:', finalUrl); // Look for any messages const messages = await page.evaluate(() => { const msgs: string[] = []; // Check for any error or success divs const elements = document.querySelectorAll('.error, .notice, .updated, .message, .tribe-error, .tribe-success'); elements.forEach(el => { if (el.textContent) { msgs.push(el.textContent.trim()); } }); return msgs; }); console.log('Messages found:', messages); // Check if form is still present const formStillPresent = await page.locator('form').count() > 0; console.log('Form still present:', formStillPresent); // Save debug info await page.screenshot({ path: 'test-results/event-debug-final.png', fullPage: true }); // For now, just pass the test to see debug output expect(true).toBe(true); }); });