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. |