- Add 26 documentation files including test reports, deployment guides, and troubleshooting documentation - Include 3 CSV data files for trainer imports and user registration tracking - Add 43 JavaScript test files covering mobile optimization, Safari compatibility, and E2E testing - Include 18 PHP utility files for debugging, geocoding, and data analysis - Add 12 shell scripts for deployment verification, user management, and database operations - Update .gitignore with whitelist patterns for development files, documentation, and CSV data 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			184 lines
		
	
	
		
			No EOL
		
	
	
		
			6.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			No EOL
		
	
	
		
			6.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * 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(); |