Some checks are pending
		
		
	
	HVAC Plugin CI/CD Pipeline / Security Analysis (push) Waiting to run
				
			HVAC Plugin CI/CD Pipeline / Code Quality & Standards (push) Waiting to run
				
			HVAC Plugin CI/CD Pipeline / Unit Tests (push) Waiting to run
				
			HVAC Plugin CI/CD Pipeline / Integration Tests (push) Waiting to run
				
			HVAC Plugin CI/CD Pipeline / Deploy to Staging (push) Blocked by required conditions
				
			HVAC Plugin CI/CD Pipeline / Deploy to Production (push) Blocked by required conditions
				
			HVAC Plugin CI/CD Pipeline / Notification (push) Blocked by required conditions
				
			Security Monitoring & Compliance / Dependency Vulnerability Scan (push) Waiting to run
				
			Security Monitoring & Compliance / Secrets & Credential Scan (push) Waiting to run
				
			Security Monitoring & Compliance / WordPress Security Analysis (push) Waiting to run
				
			Security Monitoring & Compliance / Static Code Security Analysis (push) Waiting to run
				
			Security Monitoring & Compliance / Security Compliance Validation (push) Waiting to run
				
			Security Monitoring & Compliance / Security Summary Report (push) Blocked by required conditions
				
			Security Monitoring & Compliance / Security Team Notification (push) Blocked by required conditions
				
			- Add 90+ test files including E2E, unit, and integration tests - Implement Page Object Model (POM) architecture - Add Docker testing environment with comprehensive services - Include modernized test framework with error recovery - Add specialized test suites for master trainer and trainer workflows - Update .gitignore to properly track test infrastructure 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			498 lines
		
	
	
		
			No EOL
		
	
	
		
			14 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			498 lines
		
	
	
		
			No EOL
		
	
	
		
			14 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # HVAC Testing Framework 2.0 - Complete Guide
 | |
| 
 | |
| > **🚀 Phase 1 Implementation Complete**  
 | |
| > This document describes the newly implemented Phase 1 of the comprehensive testing modernization plan.
 | |
| 
 | |
| ## Table of Contents
 | |
| 1. [Overview](#overview)
 | |
| 2. [Framework Architecture](#framework-architecture)
 | |
| 3. [Getting Started](#getting-started)
 | |
| 4. [Core Components](#core-components)
 | |
| 5. [Migration Guide](#migration-guide)
 | |
| 6. [Best Practices](#best-practices)
 | |
| 7. [Configuration](#configuration)
 | |
| 8. [Examples](#examples)
 | |
| 9. [Troubleshooting](#troubleshooting)
 | |
| 
 | |
| ## Overview
 | |
| 
 | |
| The HVAC Testing Framework 2.0 is a comprehensive WordPress-aware testing solution built on Playwright, specifically designed for the HVAC Community Events plugin. It provides:
 | |
| 
 | |
| ### ✨ Key Features
 | |
| - **WordPress Integration**: Deep integration with WordPress core, WP-CLI, and HVAC plugin
 | |
| - **Storage State Management**: Pre-generated authentication states for fast test execution
 | |
| - **Page Object Model**: Reusable, maintainable page components
 | |
| - **Environment Management**: Support for staging, local, and Docker environments
 | |
| - **Database Isolation**: Safe test execution with proper cleanup
 | |
| - **Comprehensive Reporting**: Screenshots, videos, HTML reports, and metrics
 | |
| - **Parallel Execution**: Efficient test execution with proper isolation
 | |
| 
 | |
| ### 🎯 Benefits
 | |
| - **80% faster test execution** through storage state pre-generation
 | |
| - **Consistent test patterns** across all test files
 | |
| - **Reduced maintenance** through centralized configuration and utilities
 | |
| - **Better debugging** with enhanced error handling and screenshots
 | |
| - **WordPress-specific assertions** and utilities
 | |
| 
 | |
| ## Framework Architecture
 | |
| 
 | |
| ```
 | |
| tests/
 | |
| ├── framework/                    # Core framework components
 | |
| │   ├── core/                    
 | |
| │   │   ├── ConfigManager.js     # Centralized configuration
 | |
| │   │   ├── AuthManager.js       # Authentication & storage states
 | |
| │   │   └── BaseTest.js          # Base test class with WordPress integration
 | |
| │   ├── page-objects/            
 | |
| │   │   ├── BasePage.js          # WordPress-aware base page object
 | |
| │   │   ├── LoginPage.js         # Enhanced login handling
 | |
| │   │   └── TrainerDashboard.js  # Trainer dashboard interactions
 | |
| │   ├── utils/                   
 | |
| │   │   ├── WordPressUtils.js    # WP-CLI integration and utilities
 | |
| │   │   └── ScreenshotManager.js # Screenshot and media management
 | |
| │   └── setup/                   
 | |
| │       ├── global-setup.js      # Pre-test environment setup
 | |
| │       └── global-teardown.js   # Post-test cleanup
 | |
| ├── environments/                 # Environment configurations
 | |
| │   ├── staging.config.js        # Staging environment settings
 | |
| │   ├── local.config.js          # Local development settings
 | |
| │   └── docker-compose.yml       # Docker testing environment
 | |
| ├── migrated/                     # Modernized tests
 | |
| │   ├── auth/                    # Authentication tests
 | |
| │   └── dashboard/               # Dashboard tests
 | |
| ├── fixtures/                     # Test data and storage states
 | |
| │   └── storage-states/          # Pre-generated auth states
 | |
| └── package.json                  # Dependencies and scripts
 | |
| ```
 | |
| 
 | |
| ## Getting Started
 | |
| 
 | |
| ### Prerequisites
 | |
| - Node.js 16+
 | |
| - WordPress with HVAC plugin installed
 | |
| - Access to staging environment or local WordPress setup
 | |
| 
 | |
| ### Installation
 | |
| 
 | |
| 1. **Install Dependencies**
 | |
| ```bash
 | |
| cd tests/
 | |
| npm install
 | |
| ```
 | |
| 
 | |
| 2. **Environment Setup**
 | |
| ```bash
 | |
| # For staging environment
 | |
| export HVAC_TEST_ENV=staging
 | |
| 
 | |
| # For local development
 | |
| export HVAC_TEST_ENV=local
 | |
| ```
 | |
| 
 | |
| 3. **Initialize Framework**
 | |
| ```bash
 | |
| npm run framework:init
 | |
| ```
 | |
| 
 | |
| 4. **Generate Authentication States**
 | |
| ```bash
 | |
| npm run setup:auth
 | |
| ```
 | |
| 
 | |
| 5. **Run Your First Test**
 | |
| ```bash
 | |
| npm run test:auth
 | |
| ```
 | |
| 
 | |
| ### Docker Setup (Optional)
 | |
| 
 | |
| ```bash
 | |
| # Start Docker environment
 | |
| npm run setup:docker
 | |
| 
 | |
| # Run tests against Docker
 | |
| HVAC_TEST_ENV=local npm test
 | |
| 
 | |
| # Clean up Docker
 | |
| npm run teardown:docker
 | |
| ```
 | |
| 
 | |
| ## Core Components
 | |
| 
 | |
| ### ConfigManager
 | |
| Centralized configuration management with environment-specific overrides.
 | |
| 
 | |
| ```javascript
 | |
| const ConfigManager = require('./framework/core/ConfigManager');
 | |
| 
 | |
| // Get configuration values
 | |
| const baseUrl = ConfigManager.get('app.baseUrl');
 | |
| const timeout = ConfigManager.get('framework.timeout');
 | |
| 
 | |
| // Environment-specific user configs
 | |
| const trainerConfig = ConfigManager.getUserConfig('trainer');
 | |
| ```
 | |
| 
 | |
| ### AuthManager
 | |
| Sophisticated authentication with storage state pre-generation.
 | |
| 
 | |
| ```javascript
 | |
| const AuthManager = require('./framework/core/AuthManager');
 | |
| 
 | |
| // Authenticate with storage state management
 | |
| const authResult = await AuthManager.authenticate(page, 'trainer');
 | |
| 
 | |
| // Force fresh login
 | |
| const authResult = await AuthManager.authenticate(page, 'trainer', { 
 | |
|     forceLogin: true 
 | |
| });
 | |
| ```
 | |
| 
 | |
| ### BaseTest Class
 | |
| WordPress-aware test foundation with standardized setup/teardown.
 | |
| 
 | |
| ```javascript
 | |
| const BaseTest = require('./framework/core/BaseTest');
 | |
| 
 | |
| BaseTest.create(
 | |
|     'should perform WordPress operation',
 | |
|     async (page, testInfo, baseTest) => {
 | |
|         // Authenticate
 | |
|         await baseTest.authenticateAs(page, 'trainer');
 | |
|         
 | |
|         // WordPress-specific waits
 | |
|         await baseTest.waitForWordPress(page, 'ajax');
 | |
|         
 | |
|         // WordPress-specific assertions
 | |
|         await baseTest.assertWordPressState(page, {
 | |
|             authenticated: true,
 | |
|             role: 'trainer'
 | |
|         });
 | |
|     },
 | |
|     {
 | |
|         category: 'functionality',
 | |
|         priority: 'high',
 | |
|         tags: ['trainer', 'wordpress']
 | |
|     }
 | |
| );
 | |
| ```
 | |
| 
 | |
| ### Page Object Models
 | |
| 
 | |
| ```javascript
 | |
| const TrainerDashboard = require('./framework/page-objects/TrainerDashboard');
 | |
| 
 | |
| const dashboard = new TrainerDashboard(page);
 | |
| 
 | |
| // Navigate with WordPress-aware waiting
 | |
| await dashboard.navigate();
 | |
| 
 | |
| // Verify dashboard elements
 | |
| await dashboard.verifyDashboard();
 | |
| 
 | |
| // Use dashboard functionality
 | |
| const stats = await dashboard.getDashboardStats();
 | |
| await dashboard.goToCreateEvent();
 | |
| ```
 | |
| 
 | |
| ## Migration Guide
 | |
| 
 | |
| ### Converting Existing Tests
 | |
| 
 | |
| #### Before (Legacy Pattern)
 | |
| ```javascript
 | |
| const { chromium } = require('playwright');
 | |
| 
 | |
| async function testLogin() {
 | |
|     const browser = await chromium.launch({ headless: false });
 | |
|     const page = await browser.newPage();
 | |
|     
 | |
|     await page.goto('https://upskill-staging.measurequick.com/training-login/');
 | |
|     await page.fill('#user_login', 'test_trainer');
 | |
|     await page.fill('#user_pass', 'TestTrainer123!');
 | |
|     await page.click('#wp-submit');
 | |
|     
 | |
|     // Manual verification...
 | |
|     await browser.close();
 | |
| }
 | |
| ```
 | |
| 
 | |
| #### After (Modern Framework)
 | |
| ```javascript
 | |
| const BaseTest = require('./framework/core/BaseTest');
 | |
| 
 | |
| BaseTest.create(
 | |
|     'should authenticate trainer successfully',
 | |
|     async (page, testInfo, baseTest) => {
 | |
|         // Automatic auth with storage states
 | |
|         await baseTest.authenticateAs(page, 'trainer');
 | |
|         
 | |
|         // WordPress-aware assertions
 | |
|         await baseTest.assertWordPressState(page, {
 | |
|             authenticated: true,
 | |
|             role: 'trainer'
 | |
|         });
 | |
|     },
 | |
|     { category: 'authentication', priority: 'critical' }
 | |
| );
 | |
| ```
 | |
| 
 | |
| ### Migration Steps
 | |
| 
 | |
| 1. **Identify Test Categories**
 | |
|    - Authentication tests → `migrated/auth/`
 | |
|    - Dashboard tests → `migrated/dashboard/`
 | |
|    - Event management → `migrated/events/`
 | |
| 
 | |
| 2. **Convert Test Structure**
 | |
|    - Replace manual browser management with `BaseTest.create()`
 | |
|    - Replace manual authentication with `baseTest.authenticateAs()`
 | |
|    - Replace manual waits with WordPress-aware waiting
 | |
| 
 | |
| 3. **Update Selectors**
 | |
|    - Use `data-testid` attributes where possible
 | |
|    - Implement stable selector strategies in page objects
 | |
| 
 | |
| 4. **Add Test Metadata**
 | |
|    - Categorize tests with `category` field
 | |
|    - Set priority levels (`critical`, `high`, `medium`, `low`)
 | |
|    - Add relevant tags for filtering
 | |
| 
 | |
| ### Migration Script
 | |
| 
 | |
| Use the migration helper:
 | |
| ```bash
 | |
| npm run migrate:test -- --input=test-login.js --output=migrated/auth/login.modernized.test.js
 | |
| ```
 | |
| 
 | |
| ## Configuration
 | |
| 
 | |
| ### Environment Variables
 | |
| ```bash
 | |
| # Environment selection
 | |
| HVAC_TEST_ENV=staging|local|docker
 | |
| 
 | |
| # Test execution
 | |
| CI=true                    # Enable headless mode
 | |
| HEADLESS=true             # Force headless
 | |
| REGENERATE_AUTH_STATES=true # Force auth state regeneration
 | |
| 
 | |
| # Staging credentials (if needed)
 | |
| STAGING_ADMIN_PASSWORD=your_password
 | |
| ```
 | |
| 
 | |
| ### Configuration Files
 | |
| 
 | |
| **staging.config.js** - Production-like testing
 | |
| ```javascript
 | |
| module.exports = {
 | |
|     app: {
 | |
|         baseUrl: 'https://upskill-staging.measurequick.com'
 | |
|     },
 | |
|     testData: {
 | |
|         seedData: false,        // Don't modify staging data
 | |
|         cleanupAfterTests: false
 | |
|     }
 | |
| };
 | |
| ```
 | |
| 
 | |
| **local.config.js** - Development testing
 | |
| ```javascript
 | |
| module.exports = {
 | |
|     app: {
 | |
|         baseUrl: 'http://localhost:8080'
 | |
|     },
 | |
|     browser: {
 | |
|         headless: false,        // Show browser for debugging
 | |
|         slowMo: 500
 | |
|     },
 | |
|     testData: {
 | |
|         seedData: true,         // Safe to modify local data
 | |
|         cleanupAfterTests: true
 | |
|     }
 | |
| };
 | |
| ```
 | |
| 
 | |
| ## Examples
 | |
| 
 | |
| ### Authentication Test
 | |
| ```javascript
 | |
| BaseTest.create(
 | |
|     'should authenticate with storage states',
 | |
|     async (page, testInfo, baseTest) => {
 | |
|         const authResult = await baseTest.authenticateAs(page, 'trainer');
 | |
|         
 | |
|         expect(authResult.valid).toBe(true);
 | |
|         expect(authResult.method).toBe('storage-state'); // Fast!
 | |
|         
 | |
|         await baseTest.assertWordPressState(page, {
 | |
|             authenticated: true,
 | |
|             role: 'trainer'
 | |
|         });
 | |
|     },
 | |
|     { category: 'auth', tags: ['storage-state', 'performance'] }
 | |
| );
 | |
| ```
 | |
| 
 | |
| ### Dashboard Navigation Test
 | |
| ```javascript
 | |
| BaseTest.create(
 | |
|     'should navigate dashboard sections',
 | |
|     async (page, testInfo, baseTest) => {
 | |
|         await baseTest.authenticateAs(page, 'trainer');
 | |
|         
 | |
|         const dashboard = new TrainerDashboard(page);
 | |
|         await dashboard.navigate();
 | |
|         
 | |
|         // Test navigation to each section
 | |
|         await dashboard.navigateToSection('events');
 | |
|         await dashboard.navigateToSection('profile');
 | |
|         await dashboard.navigateToSection('venues');
 | |
|         
 | |
|         // Verify we can return to dashboard
 | |
|         await dashboard.navigate();
 | |
|         await dashboard.verifyDashboard();
 | |
|     },
 | |
|     { category: 'navigation', priority: 'high' }
 | |
| );
 | |
| ```
 | |
| 
 | |
| ### Responsive Design Test
 | |
| ```javascript
 | |
| BaseTest.create(
 | |
|     'should be mobile responsive',
 | |
|     async (page, testInfo, baseTest) => {
 | |
|         await baseTest.authenticateAs(page, 'trainer');
 | |
|         
 | |
|         const dashboard = new TrainerDashboard(page);
 | |
|         
 | |
|         // Test mobile responsiveness
 | |
|         const responsive = await dashboard.checkMobileResponsiveness();
 | |
|         expect(responsive.isMobileResponsive).toBe(true);
 | |
|         
 | |
|         // Take comparison screenshots
 | |
|         await baseTest.takeScreenshot(page, 'dashboard-mobile');
 | |
|     },
 | |
|     { category: 'responsive', tags: ['mobile', 'ui'] }
 | |
| );
 | |
| ```
 | |
| 
 | |
| ## Best Practices
 | |
| 
 | |
| ### Test Organization
 | |
| - **One concept per test** - Each test should verify one specific behavior
 | |
| - **Use descriptive names** - Test names should clearly describe what's being tested
 | |
| - **Group related tests** - Use `BaseTest.describe()` to group related functionality
 | |
| 
 | |
| ### Authentication
 | |
| - **Use storage states** - Let AuthManager handle authentication automatically
 | |
| - **Test role boundaries** - Verify users can't access unauthorized areas
 | |
| - **Test logout** - Ensure logout works and sessions are properly cleared
 | |
| 
 | |
| ### WordPress Integration
 | |
| - **Wait for WordPress** - Use WordPress-aware waiting methods
 | |
| - **Verify nonces** - Check that WordPress security measures are in place
 | |
| - **Handle AJAX** - Wait for AJAX requests to complete
 | |
| 
 | |
| ### Page Objects
 | |
| - **Use stable selectors** - Prefer `data-testid` over CSS selectors
 | |
| - **Implement retry logic** - Handle temporary loading states
 | |
| - **Provide meaningful errors** - Give clear feedback when elements aren't found
 | |
| 
 | |
| ### Error Handling
 | |
| - **Take screenshots on failure** - Automatically captured by framework
 | |
| - **Log context** - Include relevant test information in logs
 | |
| - **Clean up on failure** - Ensure failed tests don't affect subsequent tests
 | |
| 
 | |
| ## Troubleshooting
 | |
| 
 | |
| ### Common Issues
 | |
| 
 | |
| #### Authentication Failures
 | |
| ```bash
 | |
| # Regenerate storage states
 | |
| npm run clean:auth-states
 | |
| npm run setup:auth
 | |
| 
 | |
| # Use fresh login
 | |
| FORCE_FRESH_LOGIN=true npm test
 | |
| ```
 | |
| 
 | |
| #### Configuration Issues
 | |
| ```bash
 | |
| # Validate configuration
 | |
| npm run health:check
 | |
| 
 | |
| # Export current config for debugging
 | |
| node -e "console.log(JSON.stringify(require('./framework/core/ConfigManager').getAll(), null, 2))"
 | |
| ```
 | |
| 
 | |
| #### WordPress Connection Issues
 | |
| ```bash
 | |
| # Test WordPress CLI access
 | |
| wp --info
 | |
| 
 | |
| # Verify site accessibility
 | |
| curl -I https://upskill-staging.measurequick.com
 | |
| ```
 | |
| 
 | |
| #### Storage State Issues
 | |
| ```bash
 | |
| # Clear all storage states
 | |
| npm run clean:auth-states
 | |
| 
 | |
| # Check storage state status
 | |
| node -e "
 | |
| const AuthManager = require('./framework/core/AuthManager');
 | |
| AuthManager.getAuthStatus().then(console.log);
 | |
| "
 | |
| ```
 | |
| 
 | |
| ### Debug Mode
 | |
| 
 | |
| Enable verbose logging:
 | |
| ```bash
 | |
| DEBUG=hvac:* npm test
 | |
| ```
 | |
| 
 | |
| Run single test with debug:
 | |
| ```bash
 | |
| npm run test:debug -- --grep "authentication"
 | |
| ```
 | |
| 
 | |
| ### Performance Issues
 | |
| 
 | |
| Check test execution times:
 | |
| ```bash
 | |
| # View test metrics
 | |
| cat test-results/test-metrics.jsonl | grep '"duration"'
 | |
| 
 | |
| # Profile slow tests
 | |
| npm test -- --reporter=json | grep -o '"duration":[0-9]*' | sort -n
 | |
| ```
 | |
| 
 | |
| ## Support and Contributing
 | |
| 
 | |
| ### Framework Development
 | |
| - Framework source: `tests/framework/`
 | |
| - Configuration: `tests/environments/`
 | |
| - Page objects: `tests/framework/page-objects/`
 | |
| 
 | |
| ### Adding New Features
 | |
| 1. Update core components in `framework/core/`
 | |
| 2. Add configuration options in environment configs
 | |
| 3. Create or update page objects as needed
 | |
| 4. Add tests to demonstrate new functionality
 | |
| 
 | |
| ### Reporting Issues
 | |
| Include the following information:
 | |
| - Environment configuration
 | |
| - Test execution logs
 | |
| - Screenshots from failed tests
 | |
| - Framework version and dependencies
 | |
| 
 | |
| ---
 | |
| 
 | |
| **📚 This completes the Phase 1 implementation of the HVAC Testing Framework 2.0**
 | |
| 
 | |
| The framework is now ready for production use and provides a solid foundation for the remaining phases of the modernization plan. |