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