## Major Enhancements ### 🏗️ Architecture & Infrastructure - Implement comprehensive Docker testing infrastructure with hermetic environment - Add Forgejo Actions CI/CD pipeline for automated deployments - Create Page Object Model (POM) testing architecture reducing test duplication by 90% - Establish security-first development patterns with input validation and output escaping ### 🧪 Testing Framework Modernization - Migrate 146+ tests from 80 duplicate files to centralized architecture - Add comprehensive E2E test suites for all user roles and workflows - Implement WordPress error detection with automatic site health monitoring - Create robust browser lifecycle management with proper cleanup ### 📚 Documentation & Guides - Add comprehensive development best practices guide - Create detailed administrator setup documentation - Establish user guides for trainers and master trainers - Document security incident reports and migration guides ### 🔧 Core Plugin Features - Enhance trainer profile management with certification system - Improve find trainer functionality with advanced filtering - Strengthen master trainer area with content management - Add comprehensive venue and organizer management ### 🛡️ Security & Reliability - Implement security-first patterns throughout codebase - Add comprehensive input validation and output escaping - Create secure credential management system - Establish proper WordPress role-based access control ### 🎯 WordPress Integration - Strengthen singleton pattern implementation across all classes - Enhance template hierarchy with proper WordPress integration - Improve page manager with hierarchical URL structure - Add comprehensive shortcode and menu system ### 🔍 Developer Experience - Add extensive debugging and troubleshooting tools - Create comprehensive test data seeding scripts - Implement proper error handling and logging - Establish consistent code patterns and standards ### 📊 Performance & Optimization - Optimize database queries and caching strategies - Improve asset loading and script management - Enhance template rendering performance - Streamline user experience across all interfaces 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1078 lines
No EOL
24 KiB
Markdown
1078 lines
No EOL
24 KiB
Markdown
# Docker Development Guide
|
|
|
|
**Version**: 2.0.0
|
|
**Last Updated**: August 28, 2025
|
|
**Audience**: Developers, QA Engineers
|
|
**Platform**: HVAC Community Events
|
|
|
|
## Executive Summary
|
|
|
|
This guide provides comprehensive documentation for the Docker-based development and testing environment for the HVAC Community Events WordPress plugin. The environment includes a complete WordPress stack with testing tools, database management, and email testing capabilities.
|
|
|
|
## Table of Contents
|
|
|
|
1. [Environment Overview](#environment-overview)
|
|
2. [Prerequisites](#prerequisites)
|
|
3. [Initial Setup](#initial-setup)
|
|
4. [Container Management](#container-management)
|
|
5. [Database Operations](#database-operations)
|
|
6. [Test Framework Architecture](#test-framework-architecture)
|
|
7. [Running Tests](#running-tests)
|
|
8. [Debugging](#debugging)
|
|
9. [Performance Testing](#performance-testing)
|
|
10. [Troubleshooting](#troubleshooting)
|
|
11. [Best Practices](#best-practices)
|
|
12. [Advanced Configuration](#advanced-configuration)
|
|
|
|
## Environment Overview
|
|
|
|
### Architecture Diagram
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ Host Machine │
|
|
│ │
|
|
│ ┌─────────────────────────────────────────────────────┐ │
|
|
│ │ Docker Compose Network │ │
|
|
│ │ │ │
|
|
│ │ ┌──────────────┐ ┌──────────────┐ ┌───────────┐ │ │
|
|
│ │ │ WordPress │ │ MySQL │ │ Redis │ │ │
|
|
│ │ │ PHP 8.2 │◄─┤ 8.0 │◄─┤ Cache │ │ │
|
|
│ │ │ Port: 8080 │ │ Port: 3307 │ │Port: 6380 │ │ │
|
|
│ │ └──────────────┘ └──────────────┘ └───────────┘ │ │
|
|
│ │ │ │
|
|
│ │ ┌──────────────┐ ┌──────────────┐ ┌───────────┐ │ │
|
|
│ │ │ PhpMyAdmin │ │ Mailhog │ │ Selenium │ │ │
|
|
│ │ │ Port: 8081 │ │ Port: 8025 │ │ Port: 4444│ │ │
|
|
│ │ └──────────────┘ └──────────────┘ └───────────┘ │ │
|
|
│ └─────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ Test Files ◄──────► Plugin Source ◄──────► Test Results │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### Service Details
|
|
|
|
| Service | Image | Port | Purpose |
|
|
|---------|-------|------|---------|
|
|
| WordPress | wordpress:6.4-php8.2-apache | 8080 | Main application |
|
|
| MySQL | mysql:8.0 | 3307 | Database server |
|
|
| Redis | redis:7-alpine | 6380 | Object caching |
|
|
| PhpMyAdmin | phpmyadmin:5 | 8081 | Database management |
|
|
| Mailhog | mailhog/mailhog | 8025 | Email testing |
|
|
| Selenium | selenium/standalone-chrome | 4444 | Browser automation |
|
|
|
|
## Prerequisites
|
|
|
|
### System Requirements
|
|
|
|
```yaml
|
|
Operating System:
|
|
- Linux (Ubuntu 20.04+, Debian 11+)
|
|
- macOS (11.0+)
|
|
- Windows 10/11 with WSL2
|
|
|
|
Docker:
|
|
version: "20.10+"
|
|
compose: "2.0+"
|
|
|
|
Resources:
|
|
RAM: "8GB minimum, 16GB recommended"
|
|
CPU: "4 cores minimum"
|
|
Disk: "20GB free space"
|
|
|
|
Development Tools:
|
|
- Node.js 16+
|
|
- npm or yarn
|
|
- Git
|
|
- Visual Studio Code (recommended)
|
|
```
|
|
|
|
### Installation
|
|
|
|
#### Linux/macOS
|
|
```bash
|
|
# Install Docker
|
|
curl -fsSL https://get.docker.com -o get-docker.sh
|
|
sh get-docker.sh
|
|
|
|
# Install Docker Compose
|
|
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
|
sudo chmod +x /usr/local/bin/docker-compose
|
|
|
|
# Verify installation
|
|
docker --version
|
|
docker compose version
|
|
```
|
|
|
|
#### Windows (WSL2)
|
|
```powershell
|
|
# Install WSL2
|
|
wsl --install
|
|
|
|
# Install Docker Desktop
|
|
# Download from https://docker.com/products/docker-desktop
|
|
|
|
# Enable WSL2 integration in Docker Desktop settings
|
|
```
|
|
|
|
## Initial Setup
|
|
|
|
### 1. Clone Repository
|
|
|
|
```bash
|
|
# Clone the repository
|
|
git clone https://github.com/your-org/upskill-event-manager.git
|
|
cd upskill-event-manager
|
|
|
|
# Checkout development branch
|
|
git checkout development
|
|
```
|
|
|
|
### 2. Environment Configuration
|
|
|
|
```bash
|
|
# Copy environment template
|
|
cp tests/.env.template tests/.env
|
|
|
|
# Edit environment variables
|
|
nano tests/.env
|
|
```
|
|
|
|
#### Environment Variables
|
|
```env
|
|
# WordPress Configuration
|
|
WORDPRESS_DB_HOST=mysql-test
|
|
WORDPRESS_DB_USER=hvac_test_user
|
|
WORDPRESS_DB_PASSWORD=hvac_test_password
|
|
WORDPRESS_DB_NAME=hvac_test_db
|
|
WORDPRESS_DEBUG=1
|
|
WORDPRESS_DEBUG_LOG=1
|
|
WORDPRESS_DEBUG_DISPLAY=0
|
|
|
|
# Test Configuration
|
|
HVAC_TEST_MODE=true
|
|
HVAC_TEST_DATA_ISOLATION=true
|
|
HVAC_TEST_EMAIL=test@example.com
|
|
|
|
# Service Ports
|
|
WORDPRESS_PORT=8080
|
|
MYSQL_PORT=3307
|
|
REDIS_PORT=6380
|
|
PHPMYADMIN_PORT=8081
|
|
MAILHOG_PORT=8025
|
|
SELENIUM_PORT=4444
|
|
|
|
# Volumes
|
|
WORDPRESS_VOLUME=wordpress_test_data
|
|
MYSQL_VOLUME=mysql_test_data
|
|
REDIS_VOLUME=redis_test_data
|
|
```
|
|
|
|
### 3. Build and Start Containers
|
|
|
|
```bash
|
|
# Navigate to tests directory
|
|
cd tests
|
|
|
|
# Build and start all services
|
|
docker compose -f docker-compose.test.yml up -d --build
|
|
|
|
# Wait for services to be healthy
|
|
docker compose -f docker-compose.test.yml ps
|
|
|
|
# Check logs
|
|
docker compose -f docker-compose.test.yml logs -f
|
|
```
|
|
|
|
### 4. Initialize WordPress
|
|
|
|
```bash
|
|
# Install WordPress
|
|
docker compose exec wordpress-test wp core install \
|
|
--url="http://localhost:8080" \
|
|
--title="HVAC Test Site" \
|
|
--admin_user="admin" \
|
|
--admin_password="admin123" \
|
|
--admin_email="admin@test.local"
|
|
|
|
# Activate plugin
|
|
docker compose exec wordpress-test wp plugin activate hvac-community-events
|
|
|
|
# Install The Events Calendar
|
|
docker compose exec wordpress-test wp plugin install the-events-calendar --activate
|
|
|
|
# Create test pages
|
|
docker compose exec wordpress-test wp eval 'HVAC_Page_Manager::create_required_pages();'
|
|
|
|
# Flush permalinks
|
|
docker compose exec wordpress-test wp rewrite flush
|
|
```
|
|
|
|
### 5. Seed Test Data
|
|
|
|
```bash
|
|
# Create test users
|
|
./scripts/seed-test-users.sh
|
|
|
|
# Create test events
|
|
./scripts/seed-test-events.sh
|
|
|
|
# Import sample venues
|
|
docker compose exec wordpress-test wp import fixtures/venues.xml --authors=create
|
|
|
|
# Generate test certificates
|
|
docker compose exec wordpress-test wp eval 'HVAC_Test_Data::generate_certificates(50);'
|
|
```
|
|
|
|
## Container Management
|
|
|
|
### Starting and Stopping
|
|
|
|
```bash
|
|
# Start all containers
|
|
docker compose -f docker-compose.test.yml up -d
|
|
|
|
# Stop all containers (preserves data)
|
|
docker compose -f docker-compose.test.yml stop
|
|
|
|
# Stop and remove containers (preserves volumes)
|
|
docker compose -f docker-compose.test.yml down
|
|
|
|
# Stop and remove everything (including volumes)
|
|
docker compose -f docker-compose.test.yml down -v
|
|
|
|
# Restart specific service
|
|
docker compose -f docker-compose.test.yml restart wordpress-test
|
|
```
|
|
|
|
### Accessing Services
|
|
|
|
```bash
|
|
# WordPress site
|
|
open http://localhost:8080
|
|
|
|
# WordPress admin
|
|
open http://localhost:8080/wp-admin
|
|
# Username: admin
|
|
# Password: admin123
|
|
|
|
# PhpMyAdmin
|
|
open http://localhost:8081
|
|
# Username: hvac_test_user
|
|
# Password: hvac_test_password
|
|
|
|
# Mailhog (email testing)
|
|
open http://localhost:8025
|
|
|
|
# Redis Commander (if installed)
|
|
docker run -d --name redis-commander \
|
|
--network hvac-test-network \
|
|
-p 8082:8081 \
|
|
rediscommander/redis-commander \
|
|
--redis-host redis-test
|
|
```
|
|
|
|
### Executing Commands
|
|
|
|
```bash
|
|
# WordPress CLI
|
|
docker compose exec wordpress-test wp [command]
|
|
|
|
# MySQL CLI
|
|
docker compose exec mysql-test mysql -u root -p
|
|
|
|
# Redis CLI
|
|
docker compose exec redis-test redis-cli
|
|
|
|
# PHP commands
|
|
docker compose exec wordpress-test php [script.php]
|
|
|
|
# Bash shell
|
|
docker compose exec wordpress-test bash
|
|
```
|
|
|
|
## Database Operations
|
|
|
|
### Backup and Restore
|
|
|
|
```bash
|
|
# Backup database
|
|
docker compose exec mysql-test mysqldump \
|
|
-u hvac_test_user -phvac_test_password \
|
|
hvac_test_db > backup-$(date +%Y%m%d).sql
|
|
|
|
# Restore database
|
|
docker compose exec -T mysql-test mysql \
|
|
-u hvac_test_user -phvac_test_password \
|
|
hvac_test_db < backup-20250828.sql
|
|
|
|
# Export specific tables
|
|
docker compose exec mysql-test mysqldump \
|
|
-u hvac_test_user -phvac_test_password \
|
|
hvac_test_db wp_posts wp_postmeta > posts-backup.sql
|
|
```
|
|
|
|
### Database Management
|
|
|
|
```bash
|
|
# Connect to MySQL
|
|
docker compose exec mysql-test mysql -u root -p
|
|
|
|
# Common queries
|
|
SHOW DATABASES;
|
|
USE hvac_test_db;
|
|
SHOW TABLES;
|
|
DESCRIBE wp_users;
|
|
|
|
# Check plugin tables
|
|
SHOW TABLES LIKE 'wp_hvac%';
|
|
|
|
# Query examples
|
|
SELECT * FROM wp_users WHERE user_login LIKE 'hvac_%';
|
|
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'tribe_events';
|
|
```
|
|
|
|
### Reset Database
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
# reset-database.sh
|
|
|
|
# Drop and recreate database
|
|
docker compose exec mysql-test mysql -u root -p -e "
|
|
DROP DATABASE IF EXISTS hvac_test_db;
|
|
CREATE DATABASE hvac_test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
GRANT ALL ON hvac_test_db.* TO 'hvac_test_user'@'%';
|
|
FLUSH PRIVILEGES;
|
|
"
|
|
|
|
# Reinstall WordPress
|
|
docker compose exec wordpress-test wp core install \
|
|
--url="http://localhost:8080" \
|
|
--title="HVAC Test Site" \
|
|
--admin_user="admin" \
|
|
--admin_password="admin123" \
|
|
--admin_email="admin@test.local"
|
|
|
|
# Reactivate plugins and recreate pages
|
|
docker compose exec wordpress-test wp plugin activate hvac-community-events
|
|
docker compose exec wordpress-test wp eval 'HVAC_Page_Manager::create_required_pages();'
|
|
```
|
|
|
|
## Test Framework Architecture
|
|
|
|
### Page Object Model (POM)
|
|
|
|
The test framework uses the Page Object Model pattern for maintainability and reusability:
|
|
|
|
```javascript
|
|
// Structure
|
|
tests/
|
|
├── e2e/
|
|
│ ├── page-objects/
|
|
│ │ ├── BasePage.js
|
|
│ │ ├── LoginPage.js
|
|
│ │ ├── DashboardPage.js
|
|
│ │ ├── EventPage.js
|
|
│ │ └── VenuePage.js
|
|
│ ├── fixtures/
|
|
│ │ ├── users.json
|
|
│ │ ├── events.json
|
|
│ │ └── venues.json
|
|
│ ├── helpers/
|
|
│ │ ├── BrowserManager.js
|
|
│ │ ├── TestData.js
|
|
│ │ └── Utilities.js
|
|
│ └── tests/
|
|
│ ├── authentication.test.js
|
|
│ ├── event-management.test.js
|
|
│ └── venue-management.test.js
|
|
```
|
|
|
|
### Browser Manager (Singleton)
|
|
|
|
```javascript
|
|
// BrowserManager.js
|
|
const { chromium, firefox, webkit } = require('playwright');
|
|
|
|
class BrowserManager {
|
|
constructor() {
|
|
if (BrowserManager.instance) {
|
|
return BrowserManager.instance;
|
|
}
|
|
|
|
this.browser = null;
|
|
this.context = null;
|
|
this.page = null;
|
|
BrowserManager.instance = this;
|
|
}
|
|
|
|
async initialize(options = {}) {
|
|
const browserType = options.browser || 'chromium';
|
|
const headless = options.headless !== false;
|
|
|
|
this.browser = await chromium.launch({
|
|
headless,
|
|
args: ['--no-sandbox', '--disable-setuid-sandbox'],
|
|
});
|
|
|
|
this.context = await this.browser.newContext({
|
|
viewport: { width: 1920, height: 1080 },
|
|
ignoreHTTPSErrors: true,
|
|
...options.context,
|
|
});
|
|
|
|
this.page = await this.context.newPage();
|
|
|
|
// Set up error handling
|
|
this.page.on('pageerror', error => {
|
|
console.error('Page error:', error.message);
|
|
});
|
|
|
|
return this.page;
|
|
}
|
|
|
|
async cleanup() {
|
|
if (this.page) await this.page.close();
|
|
if (this.context) await this.context.close();
|
|
if (this.browser) await this.browser.close();
|
|
}
|
|
}
|
|
|
|
module.exports = new BrowserManager();
|
|
```
|
|
|
|
### Test Configuration
|
|
|
|
```javascript
|
|
// test.config.js
|
|
module.exports = {
|
|
baseURL: process.env.BASE_URL || 'http://localhost:8080',
|
|
timeout: 30000,
|
|
retries: 2,
|
|
workers: 4,
|
|
|
|
use: {
|
|
headless: process.env.HEADLESS === 'true',
|
|
screenshot: 'only-on-failure',
|
|
video: 'retain-on-failure',
|
|
trace: 'on-first-retry',
|
|
},
|
|
|
|
projects: [
|
|
{
|
|
name: 'Chrome',
|
|
use: { browserName: 'chromium' },
|
|
},
|
|
{
|
|
name: 'Firefox',
|
|
use: { browserName: 'firefox' },
|
|
},
|
|
{
|
|
name: 'Safari',
|
|
use: { browserName: 'webkit' },
|
|
},
|
|
],
|
|
|
|
reporter: [
|
|
['html', { outputFolder: 'test-results/html' }],
|
|
['json', { outputFile: 'test-results/results.json' }],
|
|
['junit', { outputFile: 'test-results/junit.xml' }],
|
|
],
|
|
};
|
|
```
|
|
|
|
## Running Tests
|
|
|
|
### E2E Test Execution
|
|
|
|
```bash
|
|
# Run all tests (headless)
|
|
HEADLESS=true BASE_URL=http://localhost:8080 npm test
|
|
|
|
# Run specific test file
|
|
HEADLESS=true npm test -- test-master-trainer-e2e.js
|
|
|
|
# Run with visible browser
|
|
HEADLESS=false npm test
|
|
|
|
# Run specific test suite
|
|
npm test -- --grep "Event Management"
|
|
|
|
# Run in parallel
|
|
npm test -- --workers=4
|
|
|
|
# Generate HTML report
|
|
npm test -- --reporter=html
|
|
open test-results/index.html
|
|
```
|
|
|
|
### Test Categories
|
|
|
|
```bash
|
|
# Authentication tests
|
|
node tests/e2e/auth.test.js
|
|
|
|
# Event management tests
|
|
node tests/e2e/events.test.js
|
|
|
|
# Venue management tests
|
|
node tests/e2e/venues.test.js
|
|
|
|
# Certificate generation tests
|
|
node tests/e2e/certificates.test.js
|
|
|
|
# Master trainer features
|
|
node tests/e2e/master-trainer.test.js
|
|
|
|
# Performance tests
|
|
node tests/performance/load-test.js
|
|
```
|
|
|
|
### Cross-Browser Testing
|
|
|
|
```bash
|
|
# Chrome
|
|
BROWSER=chromium npm test
|
|
|
|
# Firefox
|
|
BROWSER=firefox npm test
|
|
|
|
# Safari (WebKit)
|
|
BROWSER=webkit npm test
|
|
|
|
# All browsers sequentially
|
|
npm run test:cross-browser
|
|
|
|
# All browsers in parallel
|
|
npm run test:cross-browser:parallel
|
|
```
|
|
|
|
### Visual Regression Testing
|
|
|
|
```bash
|
|
# Capture baseline screenshots
|
|
npm run test:visual:baseline
|
|
|
|
# Run visual comparison tests
|
|
npm run test:visual:compare
|
|
|
|
# Update baseline images
|
|
npm run test:visual:update
|
|
|
|
# View diff report
|
|
open test-results/visual-diff/index.html
|
|
```
|
|
|
|
## Debugging
|
|
|
|
### Debug Mode
|
|
|
|
```javascript
|
|
// Enable debug mode in tests
|
|
const DEBUG = process.env.DEBUG === 'true';
|
|
|
|
if (DEBUG) {
|
|
// Slow down actions
|
|
page.setDefaultTimeout(60000);
|
|
|
|
// Pause on failures
|
|
page.on('pageerror', async () => {
|
|
await page.pause();
|
|
});
|
|
|
|
// Take screenshots at each step
|
|
afterEach(async () => {
|
|
await page.screenshot({
|
|
path: `debug/step-${Date.now()}.png`
|
|
});
|
|
});
|
|
}
|
|
```
|
|
|
|
### Interactive Debugging
|
|
|
|
```bash
|
|
# Launch browser with DevTools
|
|
PWDEBUG=1 node test-file.js
|
|
|
|
# Use Playwright Inspector
|
|
npx playwright test --debug
|
|
|
|
# Pause at specific point
|
|
await page.pause(); // Add in test code
|
|
```
|
|
|
|
### Container Debugging
|
|
|
|
```bash
|
|
# View container logs
|
|
docker compose logs -f wordpress-test
|
|
|
|
# Access container shell
|
|
docker compose exec wordpress-test bash
|
|
|
|
# Check PHP errors
|
|
docker compose exec wordpress-test tail -f /var/log/apache2/error.log
|
|
|
|
# Monitor MySQL queries
|
|
docker compose exec mysql-test tail -f /var/log/mysql/query.log
|
|
|
|
# Debug WordPress
|
|
docker compose exec wordpress-test wp shell
|
|
```
|
|
|
|
### Network Debugging
|
|
|
|
```bash
|
|
# Monitor network traffic
|
|
docker compose exec wordpress-test tcpdump -i any -w traffic.pcap
|
|
|
|
# Check container connectivity
|
|
docker compose exec wordpress-test ping mysql-test
|
|
|
|
# Inspect Docker network
|
|
docker network inspect hvac-test-network
|
|
|
|
# Port forwarding issues
|
|
netstat -tuln | grep 8080
|
|
```
|
|
|
|
## Performance Testing
|
|
|
|
### Load Testing Setup
|
|
|
|
```javascript
|
|
// load-test.js
|
|
const { chromium } = require('playwright');
|
|
const { performance } = require('perf_hooks');
|
|
|
|
async function loadTest(config) {
|
|
const { concurrent = 10, iterations = 100 } = config;
|
|
const results = [];
|
|
|
|
const runTest = async () => {
|
|
const start = performance.now();
|
|
const browser = await chromium.launch({ headless: true });
|
|
const page = await browser.newPage();
|
|
|
|
await page.goto('http://localhost:8080/trainer/dashboard/');
|
|
await page.waitForSelector('.hvac-dashboard');
|
|
|
|
const end = performance.now();
|
|
await browser.close();
|
|
|
|
return end - start;
|
|
};
|
|
|
|
// Run concurrent tests
|
|
for (let i = 0; i < iterations; i += concurrent) {
|
|
const batch = Array(concurrent).fill().map(() => runTest());
|
|
const times = await Promise.all(batch);
|
|
results.push(...times);
|
|
}
|
|
|
|
// Calculate statistics
|
|
const avg = results.reduce((a, b) => a + b, 0) / results.length;
|
|
const max = Math.max(...results);
|
|
const min = Math.min(...results);
|
|
|
|
console.log(`Average: ${avg}ms, Max: ${max}ms, Min: ${min}ms`);
|
|
}
|
|
|
|
// Run load test
|
|
loadTest({ concurrent: 20, iterations: 200 });
|
|
```
|
|
|
|
### Performance Metrics
|
|
|
|
```bash
|
|
# Monitor container resources
|
|
docker stats
|
|
|
|
# MySQL performance
|
|
docker compose exec mysql-test mysqladmin -u root -p status
|
|
|
|
# Redis performance
|
|
docker compose exec redis-test redis-cli INFO stats
|
|
|
|
# Apache performance
|
|
docker compose exec wordpress-test apache2ctl -S
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
#### Container won't start
|
|
|
|
```bash
|
|
# Check for port conflicts
|
|
lsof -i :8080
|
|
lsof -i :3307
|
|
|
|
# Kill conflicting processes
|
|
kill -9 $(lsof -t -i:8080)
|
|
|
|
# Reset Docker
|
|
docker system prune -a
|
|
docker volume prune
|
|
```
|
|
|
|
#### Database connection errors
|
|
|
|
```bash
|
|
# Verify MySQL is running
|
|
docker compose ps mysql-test
|
|
|
|
# Check MySQL logs
|
|
docker compose logs mysql-test
|
|
|
|
# Test connection
|
|
docker compose exec wordpress-test wp db check
|
|
|
|
# Reset MySQL password
|
|
docker compose exec mysql-test mysql -u root -e "
|
|
ALTER USER 'hvac_test_user'@'%' IDENTIFIED BY 'hvac_test_password';
|
|
FLUSH PRIVILEGES;
|
|
"
|
|
```
|
|
|
|
#### Plugin activation fails
|
|
|
|
```bash
|
|
# Check PHP errors
|
|
docker compose exec wordpress-test tail -f /var/log/apache2/error.log
|
|
|
|
# Verify plugin files
|
|
docker compose exec wordpress-test ls -la /var/www/html/wp-content/plugins/hvac-community-events/
|
|
|
|
# Debug plugin activation
|
|
docker compose exec wordpress-test wp plugin activate hvac-community-events --debug
|
|
```
|
|
|
|
#### Tests timing out
|
|
|
|
```javascript
|
|
// Increase timeout in test
|
|
test.setTimeout(60000);
|
|
|
|
// Or globally
|
|
module.exports = {
|
|
timeout: 60000,
|
|
// ...
|
|
};
|
|
|
|
// Debug slow operations
|
|
console.time('operation');
|
|
await slowOperation();
|
|
console.timeEnd('operation');
|
|
```
|
|
|
|
### Reset Everything
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
# full-reset.sh
|
|
|
|
# Stop and remove all containers
|
|
docker compose -f docker-compose.test.yml down -v
|
|
|
|
# Remove all test data
|
|
rm -rf wordpress_test_data/
|
|
rm -rf mysql_test_data/
|
|
rm -rf redis_test_data/
|
|
|
|
# Clean Docker system
|
|
docker system prune -a --volumes
|
|
|
|
# Rebuild and start fresh
|
|
docker compose -f docker-compose.test.yml up -d --build
|
|
|
|
# Wait for healthy state
|
|
sleep 30
|
|
|
|
# Initialize WordPress
|
|
./scripts/init-wordpress.sh
|
|
|
|
# Seed test data
|
|
./scripts/seed-all-data.sh
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
### Development Workflow
|
|
|
|
1. **Branch Strategy**
|
|
```bash
|
|
# Create feature branch
|
|
git checkout -b feature/new-venue-system
|
|
|
|
# Make changes and test locally
|
|
docker compose up -d
|
|
npm test
|
|
|
|
# Commit with conventional commits
|
|
git commit -m "feat: implement new venue management system"
|
|
```
|
|
|
|
2. **Test-Driven Development**
|
|
```javascript
|
|
// Write test first
|
|
test('should create new venue', async () => {
|
|
await venuePage.createVenue({
|
|
name: 'Test Venue',
|
|
address: '123 Test St',
|
|
});
|
|
|
|
expect(await venuePage.venueExists('Test Venue')).toBe(true);
|
|
});
|
|
|
|
// Then implement feature
|
|
```
|
|
|
|
3. **Data Isolation**
|
|
```javascript
|
|
// Use unique test data
|
|
const testId = Date.now();
|
|
const venueName = `Venue_${testId}`;
|
|
|
|
// Clean up after tests
|
|
afterEach(async () => {
|
|
await cleanup(testId);
|
|
});
|
|
```
|
|
|
|
### Code Quality
|
|
|
|
1. **Linting**
|
|
```bash
|
|
# JavaScript
|
|
npm run lint
|
|
|
|
# PHP
|
|
docker compose exec wordpress-test ./vendor/bin/phpcs
|
|
|
|
# Fix automatically
|
|
npm run lint:fix
|
|
```
|
|
|
|
2. **Code Coverage**
|
|
```bash
|
|
# Generate coverage report
|
|
npm run test:coverage
|
|
|
|
# View report
|
|
open coverage/index.html
|
|
```
|
|
|
|
3. **Security Scanning**
|
|
```bash
|
|
# Scan for vulnerabilities
|
|
npm audit
|
|
|
|
# PHP dependencies
|
|
docker compose exec wordpress-test ./vendor/bin/security-checker security:check
|
|
```
|
|
|
|
### Performance Optimization
|
|
|
|
1. **Container Resources**
|
|
```yaml
|
|
# docker-compose.yml
|
|
services:
|
|
wordpress-test:
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: '2'
|
|
memory: 2G
|
|
reservations:
|
|
cpus: '1'
|
|
memory: 1G
|
|
```
|
|
|
|
2. **Caching Strategy**
|
|
```bash
|
|
# Enable Redis object cache
|
|
docker compose exec wordpress-test wp plugin install redis-cache --activate
|
|
docker compose exec wordpress-test wp redis enable
|
|
```
|
|
|
|
3. **Database Optimization**
|
|
```sql
|
|
-- Add indexes
|
|
ALTER TABLE wp_posts ADD INDEX idx_type_status (post_type, post_status);
|
|
ALTER TABLE wp_postmeta ADD INDEX idx_meta_key (meta_key);
|
|
|
|
-- Optimize tables
|
|
OPTIMIZE TABLE wp_posts;
|
|
OPTIMIZE TABLE wp_postmeta;
|
|
```
|
|
|
|
## Advanced Configuration
|
|
|
|
### Custom Docker Network
|
|
|
|
```yaml
|
|
# docker-compose.override.yml
|
|
networks:
|
|
hvac-test-network:
|
|
driver: bridge
|
|
ipam:
|
|
config:
|
|
- subnet: 172.28.0.0/16
|
|
gateway: 172.28.0.1
|
|
```
|
|
|
|
### SSL Configuration
|
|
|
|
```bash
|
|
# Generate self-signed certificate
|
|
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
|
|
-keyout nginx/ssl/private.key \
|
|
-out nginx/ssl/certificate.crt
|
|
|
|
# Add nginx proxy container
|
|
services:
|
|
nginx:
|
|
image: nginx:alpine
|
|
ports:
|
|
- "443:443"
|
|
volumes:
|
|
- ./nginx/conf.d:/etc/nginx/conf.d
|
|
- ./nginx/ssl:/etc/nginx/ssl
|
|
```
|
|
|
|
### Multi-Site Testing
|
|
|
|
```yaml
|
|
# Enable WordPress Multisite
|
|
environment:
|
|
WORDPRESS_CONFIG_EXTRA: |
|
|
define('WP_ALLOW_MULTISITE', true);
|
|
define('MULTISITE', true);
|
|
define('SUBDOMAIN_INSTALL', false);
|
|
define('DOMAIN_CURRENT_SITE', 'localhost');
|
|
define('PATH_CURRENT_SITE', '/');
|
|
define('SITE_ID_CURRENT_SITE', 1);
|
|
define('BLOG_ID_CURRENT_SITE', 1);
|
|
```
|
|
|
|
### CI/CD Integration
|
|
|
|
```yaml
|
|
# .github/workflows/test.yml
|
|
name: E2E Tests
|
|
|
|
on: [push, pull_request]
|
|
|
|
jobs:
|
|
test:
|
|
runs-on: ubuntu-latest
|
|
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
|
|
- name: Start Docker Compose
|
|
run: |
|
|
docker compose -f tests/docker-compose.test.yml up -d
|
|
sleep 30
|
|
|
|
- name: Initialize WordPress
|
|
run: |
|
|
docker compose exec -T wordpress-test wp core install \
|
|
--url="http://localhost:8080" \
|
|
--title="Test" \
|
|
--admin_user="admin" \
|
|
--admin_password="admin123" \
|
|
--admin_email="test@test.com"
|
|
|
|
- name: Run Tests
|
|
run: |
|
|
npm ci
|
|
npm test
|
|
|
|
- name: Upload Results
|
|
if: always()
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: test-results
|
|
path: test-results/
|
|
```
|
|
|
|
---
|
|
|
|
## Quick Reference
|
|
|
|
### Essential Commands
|
|
|
|
```bash
|
|
# Start environment
|
|
docker compose -f tests/docker-compose.test.yml up -d
|
|
|
|
# Stop environment
|
|
docker compose -f tests/docker-compose.test.yml down
|
|
|
|
# View logs
|
|
docker compose -f tests/docker-compose.test.yml logs -f
|
|
|
|
# Run tests
|
|
HEADLESS=true npm test
|
|
|
|
# Access WordPress
|
|
open http://localhost:8080
|
|
|
|
# Access database
|
|
open http://localhost:8081
|
|
|
|
# View emails
|
|
open http://localhost:8025
|
|
|
|
# Shell access
|
|
docker compose exec wordpress-test bash
|
|
|
|
# WP-CLI
|
|
docker compose exec wordpress-test wp [command]
|
|
```
|
|
|
|
### Service URLs
|
|
|
|
| Service | URL | Credentials |
|
|
|---------|-----|-------------|
|
|
| WordPress | http://localhost:8080 | admin / admin123 |
|
|
| WordPress Admin | http://localhost:8080/wp-admin | admin / admin123 |
|
|
| PhpMyAdmin | http://localhost:8081 | hvac_test_user / hvac_test_password |
|
|
| Mailhog | http://localhost:8025 | No auth required |
|
|
| Redis Commander | http://localhost:8082 | No auth required |
|
|
|
|
### File Locations
|
|
|
|
```bash
|
|
# Plugin source
|
|
./
|
|
|
|
# Test files
|
|
./tests/
|
|
|
|
# Docker config
|
|
./tests/docker-compose.test.yml
|
|
|
|
# Test results
|
|
./test-results/
|
|
|
|
# Screenshots
|
|
./screenshots/
|
|
|
|
# Fixtures
|
|
./tests/fixtures/
|
|
```
|
|
|
|
---
|
|
|
|
*This guide is maintained by the HVAC Community Events development team. For updates or issues, please submit a pull request or open an issue in the repository.*
|
|
|
|
**Document Version**: 2.0.0
|
|
**Last Updated**: August 28, 2025
|
|
**Next Review**: September 28, 2025 |