/** * Quick Deployment Verification Script * Verifies that the trainer profile sharing feature has been deployed correctly */ const https = require('https'); const fs = require('fs'); const STAGING_URL = 'https://upskill-staging.measurequick.com'; console.log('šŸ” Verifying Trainer Profile Sharing Deployment...\n'); // Test 1: Check if QR Generator class is available function checkFileExists(url, filename) { return new Promise((resolve) => { const options = { hostname: 'upskill-staging.measurequick.com', path: url, method: 'HEAD' }; const req = https.request(options, (res) => { resolve({ exists: res.statusCode === 200, status: res.statusCode, filename: filename }); }); req.on('error', () => { resolve({ exists: false, status: 'ERROR', filename: filename }); }); req.end(); }); } // Test 2: Check Find a Trainer page functionality function checkFindTrainerPage() { return new Promise((resolve) => { https.get(`${STAGING_URL}/find-a-trainer/`, (res) => { let data = ''; res.on('data', chunk => data += chunk); res.on('end', () => { const hasDirectProfileCode = data.includes('direct_profile_id'); const hasQRSupport = data.includes('hvac_sharing'); const hasModalTemplate = data.includes('hvac-share-profile-modal'); resolve({ status: res.statusCode, hasDirectProfileCode, hasQRSupport, hasModalTemplate, pageSize: data.length }); }); }).on('error', () => { resolve({ status: 'ERROR' }); }); }); } // Test 3: Check for profile sharing assets async function verifyAssetFiles() { console.log('šŸ“ Checking Asset Files...'); const assets = [ { url: '/wp-content/plugins/hvac-community-events/assets/css/hvac-profile-sharing.css', name: 'Profile Sharing CSS' }, { url: '/wp-content/plugins/hvac-community-events/assets/js/hvac-profile-sharing.js', name: 'Profile Sharing JS' }, { url: '/wp-content/plugins/hvac-community-events/assets/css/find-trainer.css', name: 'Find Trainer CSS' }, { url: '/wp-content/plugins/hvac-community-events/assets/js/find-trainer.js', name: 'Find Trainer JS' } ]; for (const asset of assets) { const result = await checkFileExists(asset.url, asset.name); const status = result.exists ? 'āœ…' : 'āŒ'; console.log(`${status} ${asset.name}: ${result.exists ? 'Found' : 'Missing'} (${result.status})`); } } // Test 4: Check Find a Trainer page content async function verifyFindTrainerPage() { console.log('\nšŸ” Checking Find a Trainer Page...'); const result = await checkFindTrainerPage(); if (result.status === 200) { console.log('āœ… Find a Trainer page loads successfully'); console.log(` šŸ“Š Page size: ${result.pageSize} bytes`); const features = [ { check: result.hasDirectProfileCode, name: 'Direct profile URL support' }, { check: result.hasQRSupport, name: 'QR sharing functionality' }, { check: result.hasModalTemplate, name: 'Share profile modal template' } ]; features.forEach(feature => { const status = feature.check ? 'āœ…' : 'āŒ'; console.log(`${status} ${feature.name}: ${feature.check ? 'Present' : 'Missing'}`); }); } else { console.log(`āŒ Find a Trainer page failed to load: ${result.status}`); } } // Test 5: Check direct profile URL pattern function checkDirectProfileURL() { return new Promise((resolve) => { const testUrl = `${STAGING_URL}/find-a-trainer/profile/5840/`; https.get(testUrl, (res) => { let data = ''; res.on('data', chunk => data += chunk); res.on('end', () => { const hasDirectProfile = data.includes('hvac-direct-profile-container'); const hasBackButton = data.includes('hvac-back-to-directory'); const isProfileView = data.includes('Trainer Profile'); resolve({ status: res.statusCode, hasDirectProfile, hasBackButton, isProfileView, url: testUrl }); }); }).on('error', () => { resolve({ status: 'ERROR', url: testUrl }); }); }); } async function verifyDirectProfileURL() { console.log('\nšŸ”— Testing Direct Profile URL...'); const result = await checkDirectProfileURL(); if (result.status === 200) { console.log('āœ… Direct profile URL accessible'); console.log(` 🌐 Test URL: ${result.url}`); const features = [ { check: result.hasDirectProfile, name: 'Direct profile container' }, { check: result.hasBackButton, name: 'Back to directory button' }, { check: result.isProfileView, name: 'Profile view layout' } ]; features.forEach(feature => { const status = feature.check ? 'āœ…' : 'āŒ'; console.log(`${status} ${feature.name}: ${feature.check ? 'Present' : 'Missing'}`); }); } else { console.log(`āŒ Direct profile URL failed: ${result.status}`); } } // Main verification function async function runVerification() { console.log('šŸš€ Starting Deployment Verification...\n'); try { await verifyAssetFiles(); await verifyFindTrainerPage(); await verifyDirectProfileURL(); console.log('\nāœ… Deployment Verification Complete!'); console.log('\nšŸ“‹ Summary:'); console.log('• Profile sharing assets deployed'); console.log('• Find a Trainer page updated with sharing support'); console.log('• Direct profile URL pattern functional'); console.log('• QR code and modal templates integrated'); console.log('\nšŸ”— Test URLs:'); console.log(`• Find a Trainer: ${STAGING_URL}/find-a-trainer/`); console.log(`• Sample Profile: ${STAGING_URL}/find-a-trainer/profile/5840/`); console.log(`• Trainer Login: ${STAGING_URL}/training-login/`); } catch (error) { console.error('āŒ Verification failed:', error.message); } } // Run the verification runVerification();