/** * Administrative Features E2E Test Suite - Agent D * * Comprehensive end-to-end testing for administrative and operational systems * Focus Areas: * - Certificate generation and reporting * - Mass communication systems * - Data integration (Google Sheets) * - Import/export functionality * - Administrative workflows * * Requirements: * - Use MCP Playwright tools for browser automation * - Test with GNOME session display integration * - Stage testing at https://upskill-staging.measurequick.com * - Use test accounts: test_trainer/TestTrainer123!, test_master/TestMaster123! * - Include WordPress error detection before each test */ const BaseTest = require('../framework/base/BaseTest'); const { getAuthManager } = require('../framework/authentication/AuthManager'); const WordPressErrorDetector = require('../framework/utils/WordPressErrorDetector'); class AdministrativeFeatures extends BaseTest { constructor() { super('AdministrativeFeatures'); this.authManager = getAuthManager(); this.baseUrl = 'https://upskill-staging.measurequick.com'; this.testDataPrefix = `admin_test_${Date.now()}`; } /** * Initialize test environment with proper configuration */ async setUp() { await super.setUp({ environment: 'staging', headless: process.env.HEADLESS !== 'false', slowMo: process.env.PLAYWRIGHT_SLOW_MO ? parseInt(process.env.PLAYWRIGHT_SLOW_MO) : 0, timeout: 45000, screenshotOnFailure: true }); // Set up display environment for GNOME session if (process.env.DISPLAY && process.env.XAUTHORITY) { console.log('๐Ÿ–ฅ๏ธ Using GNOME session display integration'); } await this.authManager.initialize({ baseUrl: this.baseUrl, loginPath: '/community-login/' }); } /** * Detect WordPress errors before proceeding with tests */ async detectWordPressErrors() { const page = this.browserManager.getCurrentPage(); const errorDetector = new WordPressErrorDetector(page); const errorReport = await errorDetector.getErrorReport(); if (errorReport.hasErrors && errorReport.blockingErrors.length > 0) { const blockingError = errorReport.blockingErrors[0]; throw new Error(`WordPress Error Detected: ${blockingError.type} - ${blockingError.message}`); } return errorReport; } /** * CERTIFICATE GENERATION SYSTEM TESTS */ async testCertificateGenerationWorkflow() { console.log('๐Ÿ† Testing Certificate Generation System'); await this.runTestStep('Login as Master Trainer', async () => { await this.authManager.loginAsMasterTrainer({ takeScreenshot: true }); await this.detectWordPressErrors(); }); await this.runTestStep('Navigate to Certificate Reports', async () => { const page = this.browserManager.getCurrentPage(); const certificateReportsUrl = `${this.baseUrl}/master-trainer/certificate-reports/`; await page.goto(certificateReportsUrl); await this.detectWordPressErrors(); // Verify certificate reports page loads await this.assertElementVisible('body', 'Certificate reports page should load'); // Look for certificate management elements const certificateElements = [ '.certificate-reports-container', '.certificate-list', '[data-certificate-action]', '.certificate-generation-controls' ]; let foundElements = 0; for (const selector of certificateElements) { try { await page.waitForSelector(selector, { timeout: 5000 }); foundElements++; } catch (error) { console.log(` ๐Ÿ“ Optional element not found: ${selector}`); } } console.log(` โœ… Certificate reports page loaded with ${foundElements} management elements`); return { foundElements }; }); await this.runTestStep('Navigate to Certificate Generation', async () => { const page = this.browserManager.getCurrentPage(); const certificateGenUrl = `${this.baseUrl}/master-trainer/generate-certificates/`; await page.goto(certificateGenUrl); await this.detectWordPressErrors(); // Verify certificate generation page loads await this.assertElementVisible('body', 'Certificate generation page should load'); // Look for certificate generation form elements const generationElements = [ '.certificate-generation-form', 'select[name*="event"], select[name*="certificate"]', 'input[name*="participant"], input[name*="attendee"]', 'button[type="submit"], input[type="submit"]', '.template-selection' ]; let formElements = 0; for (const selector of generationElements) { try { const elements = await page.$$(selector); if (elements.length > 0) { formElements++; console.log(` โœ… Found certificate generation element: ${selector}`); } } catch (error) { console.log(` ๐Ÿ“ Optional element not found: ${selector}`); } } console.log(` โœ… Certificate generation page loaded with ${formElements} form elements`); return { formElements }; }); await this.runTestStep('Test Certificate Template Customization', async () => { const page = this.browserManager.getCurrentPage(); // Look for template customization options const templateSelectors = [ '.certificate-template-selector', 'select[name*="template"]', '.template-preview', '.template-customization-options' ]; let customizationFeatures = 0; for (const selector of templateSelectors) { try { await page.waitForSelector(selector, { timeout: 3000 }); customizationFeatures++; console.log(` โœ… Template customization feature available: ${selector}`); } catch (error) { console.log(` ๐Ÿ“ Template feature not found: ${selector}`); } } // Try to interact with template selector if available try { const templateSelect = await page.$('select[name*="template"]'); if (templateSelect) { const options = await templateSelect.$$('option'); console.log(` ๐Ÿ“‹ Found ${options.length} certificate template options`); } } catch (error) { console.log(' ๐Ÿ“ No template selector found'); } return { customizationFeatures }; }); await this.runTestStep('Test Certificate Generation Process', async () => { const page = this.browserManager.getCurrentPage(); // Look for bulk generation controls const bulkGenerationSelectors = [ '.bulk-certificate-generation', 'input[name*="bulk"], input[name*="batch"]', '.participant-selection', '.event-selection' ]; let bulkFeatures = 0; for (const selector of bulkGenerationSelectors) { try { await page.waitForSelector(selector, { timeout: 3000 }); bulkFeatures++; console.log(` โœ… Bulk generation feature available: ${selector}`); } catch (error) { console.log(` ๐Ÿ“ Bulk feature not found: ${selector}`); } } // Test certificate generation workflow if form is available try { const submitButton = await page.$('button[type="submit"], input[type="submit"]'); if (submitButton) { console.log(' ๐ŸŽฏ Certificate generation form ready for interaction'); // Don't actually submit to avoid generating test certificates // but verify the form structure const isVisible = await submitButton.isVisible(); this.assertTrue(isVisible, 'Certificate generation submit button should be visible'); } } catch (error) { console.log(' ๐Ÿ“ No certificate generation form found'); } return { bulkFeatures }; }); } /** * COMMUNICATION SYSTEMS TESTS */ async testCommunicationSystems() { console.log('๐Ÿ“ง Testing Communication Systems'); await this.runTestStep('Navigate to Email Attendees', async () => { const page = this.browserManager.getCurrentPage(); const emailAttendeesUrl = `${this.baseUrl}/master-trainer/email-attendees/`; await page.goto(emailAttendeesUrl); await this.detectWordPressErrors(); // Verify email attendees page loads await this.assertElementVisible('body', 'Email attendees page should load'); // Look for mass communication elements const emailElements = [ '.email-attendees-form', '.attendee-selection', 'textarea[name*="message"], textarea[name*="content"]', 'input[name*="subject"]', '.recipient-filters' ]; let emailFeatures = 0; for (const selector of emailElements) { try { await page.waitForSelector(selector, { timeout: 5000 }); emailFeatures++; console.log(` โœ… Email feature available: ${selector}`); } catch (error) { console.log(` ๐Ÿ“ Email feature not found: ${selector}`); } } return { emailFeatures }; }); await this.runTestStep('Test Attendee Filtering and Selection', async () => { const page = this.browserManager.getCurrentPage(); // Test attendee filtering capabilities const filterSelectors = [ '.attendee-filter-options', 'select[name*="event"], select[name*="filter"]', '.date-range-picker', '.role-based-filtering' ]; let filterFeatures = 0; for (const selector of filterSelectors) { try { const element = await page.$(selector); if (element) { filterFeatures++; console.log(` โœ… Filter feature available: ${selector}`); // Test basic interaction if it's a select element if (selector.includes('select')) { try { const options = await element.$$('option'); console.log(` ๐Ÿ“‹ Found ${options.length} filter options`); } catch (error) { // Non-blocking } } } } catch (error) { console.log(` ๐Ÿ“ Filter feature not found: ${selector}`); } } return { filterFeatures }; }); await this.runTestStep('Navigate to Communication Templates', async () => { const page = this.browserManager.getCurrentPage(); const templatesUrl = `${this.baseUrl}/master-trainer/communication-templates/`; await page.goto(templatesUrl); await this.detectWordPressErrors(); // Verify communication templates page loads await this.assertElementVisible('body', 'Communication templates page should load'); // Look for template management elements const templateElements = [ '.communication-templates-list', '.template-editor', 'button[name*="create"], button[name*="add"]', '.template-preview', 'input[name*="template_name"]' ]; let templateFeatures = 0; for (const selector of templateElements) { try { await page.waitForSelector(selector, { timeout: 5000 }); templateFeatures++; console.log(` โœ… Template feature available: ${selector}`); } catch (error) { console.log(` ๐Ÿ“ Template feature not found: ${selector}`); } } return { templateFeatures }; }); await this.runTestStep('Test Template Creation and Customization', async () => { const page = this.browserManager.getCurrentPage(); // Test template editor functionality const editorSelectors = [ '.template-editor textarea, .wp-editor-area', '.template-variables-panel', '.template-preview-panel', '.template-save-controls' ]; let editorFeatures = 0; for (const selector of editorSelectors) { try { const element = await page.$(selector); if (element) { editorFeatures++; console.log(` โœ… Template editor feature available: ${selector}`); } } catch (error) { console.log(` ๐Ÿ“ Editor feature not found: ${selector}`); } } // Test variable insertion if available try { const variableButtons = await page.$$('.template-variable-button, [data-variable]'); if (variableButtons.length > 0) { console.log(` ๐Ÿ“‹ Found ${variableButtons.length} template variables`); } } catch (error) { console.log(' ๐Ÿ“ No template variables found'); } return { editorFeatures }; }); await this.runTestStep('Navigate to Communication Schedules', async () => { const page = this.browserManager.getCurrentPage(); const schedulesUrl = `${this.baseUrl}/master-trainer/communication-schedules/`; await page.goto(schedulesUrl); await this.detectWordPressErrors(); // Verify communication schedules page loads await this.assertElementVisible('body', 'Communication schedules page should load'); // Look for scheduling elements const scheduleElements = [ '.communication-scheduler', '.scheduled-communications-list', 'input[type="datetime-local"], .date-picker', '.recurring-schedule-options', '.schedule-management-controls' ]; let scheduleFeatures = 0; for (const selector of scheduleElements) { try { await page.waitForSelector(selector, { timeout: 5000 }); scheduleFeatures++; console.log(` โœ… Schedule feature available: ${selector}`); } catch (error) { console.log(` ๐Ÿ“ Schedule feature not found: ${selector}`); } } return { scheduleFeatures }; }); } /** * DATA INTEGRATION SYSTEMS TESTS */ async testDataIntegrationSystems() { console.log('๐Ÿ“Š Testing Data Integration Systems'); await this.runTestStep('Navigate to Google Sheets Integration', async () => { const page = this.browserManager.getCurrentPage(); const googleSheetsUrl = `${this.baseUrl}/master-trainer/google-sheets/`; await page.goto(googleSheetsUrl); await this.detectWordPressErrors(); // Verify Google Sheets integration page loads await this.assertElementVisible('body', 'Google Sheets page should load'); // Look for Google Sheets integration elements const sheetsElements = [ '.google-sheets-integration', '.sheets-sync-controls', '.spreadsheet-selector', 'button[name*="sync"], button[name*="connect"]', '.integration-status' ]; let integrationFeatures = 0; for (const selector of sheetsElements) { try { await page.waitForSelector(selector, { timeout: 5000 }); integrationFeatures++; console.log(` โœ… Google Sheets feature available: ${selector}`); } catch (error) { console.log(` ๐Ÿ“ Sheets feature not found: ${selector}`); } } return { integrationFeatures }; }); await this.runTestStep('Test Google Sheets Synchronization', async () => { const page = this.browserManager.getCurrentPage(); // Test synchronization controls const syncSelectors = [ '.sync-status-indicator', '.last-sync-timestamp', '.sync-configuration-options', '.data-mapping-controls' ]; let syncFeatures = 0; for (const selector of syncSelectors) { try { const element = await page.$(selector); if (element) { syncFeatures++; console.log(` โœ… Sync feature available: ${selector}`); // Get sync status if available if (selector.includes('status')) { try { const statusText = await element.textContent(); console.log(` ๐Ÿ“Š Sync status: ${statusText?.trim()}`); } catch (error) { // Non-blocking } } } } catch (error) { console.log(` ๐Ÿ“ Sync feature not found: ${selector}`); } } return { syncFeatures }; }); await this.runTestStep('Navigate to Import/Export System', async () => { const page = this.browserManager.getCurrentPage(); const importExportUrl = `${this.baseUrl}/master-trainer/import-export/`; await page.goto(importExportUrl); await this.detectWordPressErrors(); // Verify import/export page loads await this.assertElementVisible('body', 'Import/Export page should load'); // Look for import/export elements const importExportElements = [ '.import-export-controls', 'input[type="file"]', '.export-options', '.data-format-selector', 'button[name*="import"], button[name*="export"]' ]; let dataTransferFeatures = 0; for (const selector of importExportElements) { try { await page.waitForSelector(selector, { timeout: 5000 }); dataTransferFeatures++; console.log(` โœ… Data transfer feature available: ${selector}`); } catch (error) { console.log(` ๐Ÿ“ Data transfer feature not found: ${selector}`); } } return { dataTransferFeatures }; }); await this.runTestStep('Test CSV Import/Export Functionality', async () => { const page = this.browserManager.getCurrentPage(); // Test CSV handling capabilities const csvSelectors = [ '.csv-import-options', '.csv-export-options', '.field-mapping-interface', '.data-validation-controls' ]; let csvFeatures = 0; for (const selector of csvSelectors) { try { const element = await page.$(selector); if (element) { csvFeatures++; console.log(` โœ… CSV feature available: ${selector}`); } } catch (error) { console.log(` ๐Ÿ“ CSV feature not found: ${selector}`); } } // Test file format options try { const formatSelectors = await page.$$('select[name*="format"] option, .format-option'); if (formatSelectors.length > 0) { console.log(` ๐Ÿ“‹ Found ${formatSelectors.length} data format options`); } } catch (error) { console.log(' ๐Ÿ“ No format options found'); } return { csvFeatures }; }); await this.runTestStep('Test Data Validation and Error Handling', async () => { const page = this.browserManager.getCurrentPage(); // Test data validation features const validationSelectors = [ '.data-validation-rules', '.import-error-display', '.field-validation-messages', '.data-integrity-checks' ]; let validationFeatures = 0; for (const selector of validationSelectors) { try { const element = await page.$(selector); if (element) { validationFeatures++; console.log(` โœ… Validation feature available: ${selector}`); } } catch (error) { console.log(` ๐Ÿ“ Validation feature not found: ${selector}`); } } return { validationFeatures }; }); } /** * ADMINISTRATIVE WORKFLOWS TESTS */ async testAdministrativeWorkflows() { console.log('โš™๏ธ Testing Administrative Workflows'); await this.runTestStep('Test System Monitoring and Health Checks', async () => { const page = this.browserManager.getCurrentPage(); // Navigate to dashboard to check for system health indicators const dashboardUrl = `${this.baseUrl}/master-trainer/master-dashboard/`; await page.goto(dashboardUrl); await this.detectWordPressErrors(); // Look for system monitoring elements const monitoringSelectors = [ '.system-health-indicator', '.server-status', '.database-status', '.plugin-status-check', '.error-log-summary' ]; let monitoringFeatures = 0; for (const selector of monitoringSelectors) { try { const element = await page.$(selector); if (element) { monitoringFeatures++; console.log(` โœ… Monitoring feature available: ${selector}`); // Get status if available try { const statusText = await element.textContent(); console.log(` ๐Ÿ“Š Status: ${statusText?.trim().substring(0, 100)}`); } catch (error) { // Non-blocking } } } catch (error) { console.log(` ๐Ÿ“ Monitoring feature not found: ${selector}`); } } return { monitoringFeatures }; }); await this.runTestStep('Test User Management Interface', async () => { const page = this.browserManager.getCurrentPage(); // Navigate to user management (trainers page) const trainersUrl = `${this.baseUrl}/master-trainer/trainers/`; await page.goto(trainersUrl); await this.detectWordPressErrors(); // Look for user management elements const userMgmtSelectors = [ '.trainers-management-list', '.trainer-search', '.trainer-actions', '.role-assignment-controls', 'button[name*="approve"], button[name*="manage"]' ]; let userMgmtFeatures = 0; for (const selector of userMgmtSelectors) { try { await page.waitForSelector(selector, { timeout: 5000 }); userMgmtFeatures++; console.log(` โœ… User management feature available: ${selector}`); } catch (error) { console.log(` ๐Ÿ“ User management feature not found: ${selector}`); } } // Count trainers if list is available try { const trainerItems = await page.$$('.trainer-item, .trainer-row, tbody tr'); if (trainerItems.length > 0) { console.log(` ๐Ÿ“‹ Found ${trainerItems.length} trainers in management list`); } } catch (error) { console.log(' ๐Ÿ“ No trainer list found'); } return { userMgmtFeatures }; }); await this.runTestStep('Test Configuration Management Interface', async () => { const page = this.browserManager.getCurrentPage(); // Look for configuration management elements on current page const configSelectors = [ '.configuration-panel', '.system-settings', '.admin-configuration', '.plugin-settings-link', 'a[href*="options"], a[href*="settings"]' ]; let configFeatures = 0; for (const selector of configSelectors) { try { const element = await page.$(selector); if (element) { configFeatures++; console.log(` โœ… Configuration feature available: ${selector}`); } } catch (error) { console.log(` ๐Ÿ“ Configuration feature not found: ${selector}`); } } return { configFeatures }; }); await this.runTestStep('Test Audit Logging and Compliance', async () => { const page = this.browserManager.getCurrentPage(); // Look for audit and compliance features const auditSelectors = [ '.audit-log', '.compliance-status', '.activity-log', '.security-log', '.backup-status' ]; let auditFeatures = 0; for (const selector of auditSelectors) { try { const element = await page.$(selector); if (element) { auditFeatures++; console.log(` โœ… Audit feature available: ${selector}`); // Get audit info if available try { const auditText = await element.textContent(); console.log(` ๐Ÿ“Š Audit info: ${auditText?.trim().substring(0, 100)}`); } catch (error) { // Non-blocking } } } catch (error) { console.log(` ๐Ÿ“ Audit feature not found: ${selector}`); } } return { auditFeatures }; }); await this.runTestStep('Test Backup and Restore Operations', async () => { const page = this.browserManager.getCurrentPage(); // Look for backup and restore features const backupSelectors = [ '.backup-controls', '.restore-options', '.backup-schedule', '.backup-history', 'button[name*="backup"], button[name*="restore"]' ]; let backupFeatures = 0; for (const selector of backupSelectors) { try { const element = await page.$(selector); if (element) { backupFeatures++; console.log(` โœ… Backup feature available: ${selector}`); } } catch (error) { console.log(` ๐Ÿ“ Backup feature not found: ${selector}`); } } return { backupFeatures }; }); } /** * Run comprehensive administrative features test suite */ async runComprehensiveTests() { try { await this.setUp(); console.log('๐Ÿš€ Starting Administrative Features E2E Test Suite'); console.log(`๐Ÿ“ Testing environment: ${this.baseUrl}`); console.log(`๐Ÿค– Agent D: Administrative Features Coverage`); // Execute test suites const certificateResults = await this.testCertificateGenerationWorkflow(); const communicationResults = await this.testCommunicationSystems(); const dataIntegrationResults = await this.testDataIntegrationSystems(); const adminWorkflowResults = await this.testAdministrativeWorkflows(); // Generate comprehensive results const results = { certificate: certificateResults, communication: communicationResults, dataIntegration: dataIntegrationResults, adminWorkflows: adminWorkflowResults, summary: this.getTestSummary() }; console.log('๐Ÿ“Š Administrative Features Test Results:'); console.log(` Certificate System: ${results.summary.passed} passed, ${results.summary.failed} failed`); console.log(` Communication Systems: Tested multiple components`); console.log(` Data Integration: Tested Google Sheets & Import/Export`); console.log(` Administrative Workflows: Tested monitoring & management`); console.log(` Overall Success Rate: ${results.summary.successRate}%`); return results; } catch (error) { console.error('โŒ Administrative Features test suite failed:', error.message); throw error; } finally { await this.tearDown(); } } } // Execute tests if run directly if (require.main === module) { (async () => { console.log('๐Ÿงช Administrative Features E2E Test Suite - Agent D'); console.log('Coverage: Certificate generation, communication systems, data integration, administrative workflows'); const testSuite = new AdministrativeFeatures(); try { const results = await testSuite.runComprehensiveTests(); console.log('\nโœ… Administrative Features E2E Tests Completed Successfully!'); console.log('๐Ÿ“‹ Test Results Summary:'); console.log(` Total Steps: ${results.summary.total}`); console.log(` Passed: ${results.summary.passed}`); console.log(` Failed: ${results.summary.failed}`); console.log(` Success Rate: ${results.summary.successRate}%`); process.exit(0); } catch (error) { console.error('\nโŒ Administrative Features E2E Tests Failed!'); console.error(`Error: ${error.message}`); process.exit(1); } })(); } module.exports = AdministrativeFeatures;