- 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>
		
			
				
	
	
		
			203 lines
		
	
	
		
			No EOL
		
	
	
		
			7.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
		
			No EOL
		
	
	
		
			7.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Remote Taxonomy Testing Script
 | |
|  * Test taxonomy implementation on staging server
 | |
|  */
 | |
| 
 | |
| // Define WordPress bootstrap
 | |
| define('SHORTINIT', true);
 | |
| require_once '../../../wp-load.php';
 | |
| 
 | |
| // Include the taxonomy migration if it exists
 | |
| $migration_file = ABSPATH . 'wp-content/plugins/hvac-community-events/includes/taxonomy-migration.php';
 | |
| if (file_exists($migration_file)) {
 | |
|     require_once $migration_file;
 | |
| }
 | |
| 
 | |
| class TaxonomyTester {
 | |
|     private $tests_passed = 0;
 | |
|     private $tests_failed = 0;
 | |
|     
 | |
|     public function run_test($test_name, $test_function, $expected = null) {
 | |
|         echo "\n🔍 Testing: $test_name\n";
 | |
|         
 | |
|         try {
 | |
|             $result = call_user_func($test_function);
 | |
|             
 | |
|             if ($expected === null || $result === $expected || (is_string($expected) && strpos($result, $expected) !== false)) {
 | |
|                 echo "✅ PASS: $test_name\n";
 | |
|                 $this->tests_passed++;
 | |
|                 return true;
 | |
|             } else {
 | |
|                 echo "❌ FAIL: $test_name - Expected: $expected, Got: $result\n";
 | |
|                 $this->tests_failed++;
 | |
|                 return false;
 | |
|             }
 | |
|         } catch (Exception $e) {
 | |
|             echo "❌ FAIL: $test_name - Error: " . $e->getMessage() . "\n";
 | |
|             $this->tests_failed++;
 | |
|             return false;
 | |
|         }
 | |
|     }
 | |
|     
 | |
|     public function get_results() {
 | |
|         return [
 | |
|             'passed' => $this->tests_passed,
 | |
|             'failed' => $this->tests_failed,
 | |
|             'total' => $this->tests_passed + $this->tests_failed
 | |
|         ];
 | |
|     }
 | |
| }
 | |
| 
 | |
| $tester = new TaxonomyTester();
 | |
| 
 | |
| echo "🧪 HVAC Taxonomy Implementation Test Suite\n";
 | |
| echo "==========================================\n";
 | |
| 
 | |
| echo "\n📋 Phase 1: Taxonomy Registration Tests\n";
 | |
| 
 | |
| // Test 1: Check if taxonomies are registered
 | |
| $tester->run_test('Business Type taxonomy registered', function() {
 | |
|     return taxonomy_exists('business_type') ? 'exists' : 'missing';
 | |
| }, 'exists');
 | |
| 
 | |
| $tester->run_test('Training Audience taxonomy registered', function() {
 | |
|     return taxonomy_exists('training_audience') ? 'exists' : 'missing';
 | |
| }, 'exists');
 | |
| 
 | |
| $tester->run_test('Training Formats taxonomy registered', function() {
 | |
|     return taxonomy_exists('training_formats') ? 'exists' : 'missing';
 | |
| }, 'exists');
 | |
| 
 | |
| $tester->run_test('Training Locations taxonomy registered', function() {
 | |
|     return taxonomy_exists('training_locations') ? 'exists' : 'missing';
 | |
| }, 'exists');
 | |
| 
 | |
| $tester->run_test('Training Resources taxonomy registered', function() {
 | |
|     return taxonomy_exists('training_resources') ? 'exists' : 'missing';
 | |
| }, 'exists');
 | |
| 
 | |
| echo "\n📋 Phase 2: Default Terms Tests\n";
 | |
| 
 | |
| // Test 2: Check if default terms exist
 | |
| $tester->run_test('Business Type has default terms', function() {
 | |
|     $terms = get_terms(['taxonomy' => 'business_type', 'hide_empty' => false]);
 | |
|     return is_wp_error($terms) ? 0 : count($terms);
 | |
| }, 7);
 | |
| 
 | |
| $tester->run_test('Training Audience has default terms', function() {
 | |
|     $terms = get_terms(['taxonomy' => 'training_audience', 'hide_empty' => false]);
 | |
|     return is_wp_error($terms) ? 0 : count($terms);
 | |
| }, 4);
 | |
| 
 | |
| $tester->run_test('Training Formats has default terms', function() {
 | |
|     $terms = get_terms(['taxonomy' => 'training_formats', 'hide_empty' => false]);
 | |
|     return is_wp_error($terms) ? 0 : count($terms);
 | |
| }, 4);
 | |
| 
 | |
| $tester->run_test('Training Locations has default terms', function() {
 | |
|     $terms = get_terms(['taxonomy' => 'training_locations', 'hide_empty' => false]);
 | |
|     return is_wp_error($terms) ? 0 : count($terms);
 | |
| }, 5);
 | |
| 
 | |
| $tester->run_test('Training Resources has default terms', function() {
 | |
|     $terms = get_terms(['taxonomy' => 'training_resources', 'hide_empty' => false]);
 | |
|     return is_wp_error($terms) ? 0 : count($terms);
 | |
| }, 12);
 | |
| 
 | |
| echo "\n📋 Phase 3: Post Type Tests\n";
 | |
| 
 | |
| $tester->run_test('Trainer Profile post type registered', function() {
 | |
|     return post_type_exists('trainer_profile') ? 'exists' : 'missing';
 | |
| }, 'exists');
 | |
| 
 | |
| $tester->run_test('Trainer profiles exist in database', function() {
 | |
|     $profiles = get_posts(['post_type' => 'trainer_profile', 'numberposts' => 1]);
 | |
|     return count($profiles) > 0 ? 'exists' : 'none';
 | |
| });
 | |
| 
 | |
| echo "\n📋 Phase 4: Class Integration Tests\n";
 | |
| 
 | |
| $tester->run_test('HVAC_Trainer_Profile_Manager class exists', function() {
 | |
|     return class_exists('HVAC_Trainer_Profile_Manager') ? 'exists' : 'missing';
 | |
| }, 'exists');
 | |
| 
 | |
| $tester->run_test('HVAC_Geocoding_Ajax class exists', function() {
 | |
|     return class_exists('HVAC_Geocoding_Ajax') ? 'exists' : 'missing';
 | |
| }, 'exists');
 | |
| 
 | |
| if (class_exists('HVAC_Taxonomy_Migration')) {
 | |
|     $tester->run_test('HVAC_Taxonomy_Migration class exists', function() {
 | |
|         return 'exists';
 | |
|     }, 'exists');
 | |
| }
 | |
| 
 | |
| echo "\n📋 Phase 5: Term Validation Tests\n";
 | |
| 
 | |
| // Test specific default terms
 | |
| $tester->run_test('Business Type contains Manufacturer', function() {
 | |
|     $term = get_term_by('name', 'Manufacturer', 'business_type');
 | |
|     return $term ? 'exists' : 'missing';
 | |
| }, 'exists');
 | |
| 
 | |
| $tester->run_test('Training Audience contains "Anyone (open to the public)"', function() {
 | |
|     $term = get_term_by('name', 'Anyone (open to the public)', 'training_audience');
 | |
|     return $term ? 'exists' : 'missing';
 | |
| }, 'exists');
 | |
| 
 | |
| $tester->run_test('Training Formats contains In-person', function() {
 | |
|     $term = get_term_by('name', 'In-person', 'training_formats');
 | |
|     return $term ? 'exists' : 'missing';
 | |
| }, 'exists');
 | |
| 
 | |
| $tester->run_test('Training Locations contains Online', function() {
 | |
|     $term = get_term_by('name', 'Online', 'training_locations');
 | |
|     return $term ? 'exists' : 'missing';
 | |
| }, 'exists');
 | |
| 
 | |
| $tester->run_test('Training Resources contains Classroom', function() {
 | |
|     $term = get_term_by('name', 'Classroom', 'training_resources');
 | |
|     return $term ? 'exists' : 'missing';
 | |
| }, 'exists');
 | |
| 
 | |
| echo "\n📋 Phase 6: Profile-Taxonomy Integration Tests\n";
 | |
| 
 | |
| // Test with first available trainer profile
 | |
| $profiles = get_posts(['post_type' => 'trainer_profile', 'numberposts' => 1]);
 | |
| if (!empty($profiles)) {
 | |
|     $profile_id = $profiles[0]->ID;
 | |
|     
 | |
|     $tester->run_test('Can assign business type to trainer profile', function() use ($profile_id) {
 | |
|         $result = wp_set_post_terms($profile_id, ['Contractor'], 'business_type');
 | |
|         return is_wp_error($result) ? 'error' : 'success';
 | |
|     }, 'success');
 | |
|     
 | |
|     $tester->run_test('Business type assignment persists', function() use ($profile_id) {
 | |
|         $terms = get_the_terms($profile_id, 'business_type');
 | |
|         return (!empty($terms) && !is_wp_error($terms)) ? $terms[0]->name : 'none';
 | |
|     }, 'Contractor');
 | |
|     
 | |
|     $tester->run_test('Can remove business type from trainer profile', function() use ($profile_id) {
 | |
|         $result = wp_remove_object_terms($profile_id, ['Contractor'], 'business_type');
 | |
|         return is_wp_error($result) ? 'error' : 'success';
 | |
|     }, 'success');
 | |
| } else {
 | |
|     echo "⚠️  No trainer profiles found - skipping profile-taxonomy integration tests\n";
 | |
| }
 | |
| 
 | |
| // Results summary
 | |
| $results = $tester->get_results();
 | |
| echo "\n📊 Test Results Summary\n";
 | |
| echo "=======================\n";
 | |
| echo "Tests Passed: " . $results['passed'] . "\n";
 | |
| echo "Tests Failed: " . $results['failed'] . "\n";
 | |
| echo "Total Tests: " . $results['total'] . "\n";
 | |
| 
 | |
| if ($results['failed'] === 0) {
 | |
|     echo "\n🎉 All tests passed! Taxonomy implementation is working correctly.\n";
 | |
|     exit(0);
 | |
| } else {
 | |
|     echo "\n⚠️  Some tests failed. Please review the implementation.\n";
 | |
|     exit(1);
 | |
| }
 | |
| ?>
 |