upskill-event-manager/docs/TESTING-GUIDE.md
Ben 8752905f9e docs: Comprehensive documentation update with best practices
- Created WORDPRESS-BEST-PRACTICES.md with complete WP standards guide
- Created TESTING-GUIDE.md with E2E testing procedures and display session setup
- Updated CLAUDE.md with JavaScript simplification and recent fixes
- Enhanced main docs README with new documentation links
- Added guidance on MCP Playwright usage vs standard Playwright
- Documented proper role checking (roles vs capabilities)
- Included display session configuration for headless testing
- Added production testing checklists and debug procedures

Key additions:
- How to use jQuery properly in WordPress (no compatibility layers needed)
- Display session setup (DISPLAY=:0) for Playwright testing
- Security best practices with proper examples
- Common pitfalls and solutions
- Test user accounts for staging/production

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-18 22:44:43 -03:00

414 lines
No EOL
10 KiB
Markdown

# Testing Guide
## Overview
This guide provides comprehensive testing procedures for the HVAC Community Events plugin, including E2E testing with Playwright, manual testing procedures, and production verification steps.
## Setting Up the Testing Environment
### Display Session Configuration
When running tests on a headless server or in CI/CD environments, you need to configure the display session:
```bash
# Set display environment variables
export DISPLAY=:0
export XAUTHORITY=/run/user/1000/.mutter-Xwaylandauth.90WDB3
# Verify display is working
echo $DISPLAY
# Should output: :0
# Run tests with display
DISPLAY=:0 node test-trainer-features.js
```
### Why Display Session Matters
- Playwright needs a display to render pages for screenshots
- Some JavaScript interactions require a visible browser
- CSS animations and transitions need a display context
- Debugging is easier with visual feedback
## E2E Testing with Playwright
### Test Structure
```javascript
// test-trainer-features.js
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
headless: true, // Set to false for debugging
args: ['--no-sandbox']
});
const context = await browser.newContext({
viewport: { width: 1920, height: 1080 }
});
const page = await context.newPage();
// Test implementation
await page.goto('https://upskill-staging.measurequick.com');
// Always close browser
await browser.close();
})();
```
### Using MCP Playwright Tools
MCP Playwright provides better integration with Claude Code:
```javascript
// Using MCP tools (preferred in Claude Code)
mcp__playwright__browser_navigate({ url: 'https://upskillhvac.com/training-login/' });
mcp__playwright__browser_type({ element: 'Username field', ref: 'e40', text: 'joe@measurequick.com' });
mcp__playwright__browser_click({ element: 'Log In button', ref: 'e50' });
mcp__playwright__browser_snapshot(); // Get page state
mcp__playwright__browser_take_screenshot({ filename: 'login-success.png' });
```
### Key Test Files
```bash
# Core test suites
test-all-features.js # Comprehensive test suite
test-trainer-features.js # Trainer-specific features
test-master-dashboard.js # Master trainer dashboard
test-custom-event-edit.js # Event editing functionality
test-registration.js # Registration form validation
# Run specific test
DISPLAY=:0 node test-trainer-features.js
# Run on staging
UPSKILL_STAGING_URL="https://upskill-staging.measurequick.com" node test-all-features.js
```
## Test User Accounts
### Staging Environment
```
Regular Trainer:
- Username: test_trainer
- Password: TestTrainer123!
Master Trainer:
- Username: JoeMedosch@gmail.com
- Password: JoeTrainer2025@
Dual Role (Trainer + Master):
- Username: joe@measurequick.com
- Password: JoeTrainer2025@
```
### Production Environment
```
Master Trainer:
- Username: joe@measurequick.com
- Password: JoeTrainer2025@
Note: Always test with real accounts in production
Never create test data in production
```
## Manual Testing Procedures
### Login Flow Testing
1. Navigate to `/training-login/`
2. Enter credentials
3. Verify redirect to appropriate dashboard
4. Check navigation menu displays correctly
5. Verify role-based features are accessible
### Event Management Testing
```
1. Create Event:
- Navigate to /trainer/event/manage/
- Fill all required fields
- Submit and verify creation
- Check event appears in dashboard
2. Edit Event:
- Navigate to /trainer/event/edit/?event_id=XXX
- Verify form populates with existing data
- Make changes and save
- Verify changes persist
3. Event Permissions:
- Test with different user roles
- Verify trainers can only edit own events
- Check master trainers can view all events
```
### CSS and Layout Testing
```
1. Responsive Design:
- Test at 320px (mobile)
- Test at 768px (tablet)
- Test at 1920px (desktop)
2. Browser Compatibility:
- Chrome/Edge (Chromium)
- Firefox
- Safari (critical for production)
- Mobile browsers
3. Theme Integration:
- Verify Astra theme compatibility
- Check sidebar removal on plugin pages
- Verify navigation z-index layering
```
## Automated Test Writing Best Practices
### Structure Your Tests
```javascript
describe('Trainer Dashboard', () => {
beforeEach(async () => {
// Login before each test
await loginAsTrainer(page);
});
test('displays user statistics', async () => {
await page.goto('/trainer/dashboard/');
const stats = await page.locator('.hvac-stats-card');
expect(await stats.count()).toBeGreaterThan(0);
});
test('shows events table', async () => {
await page.goto('/trainer/dashboard/');
const table = await page.locator('.hvac-events-table');
expect(await table.isVisible()).toBeTruthy();
});
});
```
### Common Test Patterns
```javascript
// Wait for navigation
await page.waitForURL('**/dashboard/**');
// Wait for element
await page.waitForSelector('.hvac-dashboard', { timeout: 10000 });
// Check for errors in console
page.on('console', msg => {
if (msg.type() === 'error') {
console.error('Console error:', msg.text());
}
});
// Take screenshot on failure
try {
// Test code
} catch (error) {
await page.screenshot({ path: 'error-screenshot.png' });
throw error;
}
```
## Production Testing Checklist
### Pre-deployment Verification
```bash
✅ Run pre-deployment validation
bin/pre-deployment-check.sh
✅ Test all features on staging
DISPLAY=:0 node test-all-features.js
✅ Verify no JavaScript errors
Check browser console for errors
✅ Validate CSS rendering
Test in Chrome, Firefox, Safari
✅ Check database operations
Verify CRUD operations work
```
### Post-deployment Verification
```bash
✅ Clear all caches
wp cache flush
wp rewrite flush
✅ Test critical paths
- Login flow
- Dashboard access
- Event creation/editing
- Navigation menus
✅ Monitor error logs
tail -f wp-content/debug.log
✅ Verify page load times
Check performance metrics
✅ Test with real user accounts
Use production credentials
```
## Debugging Failed Tests
### Common Issues and Solutions
#### jQuery Errors
```javascript
// Error: $ is not defined
// Solution: Use jQuery(document).ready()
jQuery(document).ready(function($) {
// $ is now available
});
```
#### Permission Errors
```php
// Error: You do not have permission
// Check role properly:
$user = wp_get_current_user();
if (!in_array('hvac_trainer', $user->roles)) {
// No access
}
```
#### CSS Not Loading
```php
// Verify page detection
private function is_plugin_page() {
// Check multiple conditions
return $this->check_page_template() ||
$this->check_url_pattern() ||
$this->check_page_id();
}
```
### Debug Output
```javascript
// Add debug logging
console.log('Current URL:', window.location.href);
console.log('User role:', hvac_ajax.user_role);
console.log('Page ID:', hvac_ajax.page_id);
// Check element state
const element = document.querySelector('.hvac-dashboard');
console.log('Element exists:', !!element);
console.log('Element visible:', element?.offsetParent !== null);
```
## Performance Testing
### Load Time Benchmarks
```javascript
// Measure page load time
const startTime = performance.now();
await page.goto('/trainer/dashboard/');
const loadTime = performance.now() - startTime;
console.log(`Page loaded in ${loadTime}ms`);
// Acceptable thresholds:
// - Homepage: < 2000ms
// - Dashboard: < 3000ms
// - Event forms: < 2500ms
```
### Database Query Monitoring
```php
// Enable query monitoring (development only)
define('SAVEQUERIES', true);
// Log slow queries
add_filter('log_query_custom_data', function($data, $query) {
if ($data['elapsed'] > 0.5) {
error_log('Slow query: ' . $query);
}
return $data;
}, 10, 2);
```
## Security Testing
### Authorization Testing
```javascript
// Test unauthorized access
await page.goto('/trainer/dashboard/');
// Should redirect to login if not authenticated
// Test role-based access
await loginAsRegularUser(page);
await page.goto('/master-trainer/master-dashboard/');
// Should show access denied
```
### Input Validation Testing
```javascript
// Test XSS prevention
await page.fill('#event_title', '<script>alert("XSS")</script>');
await page.click('#submit');
// Should sanitize input, no alert should appear
// Test SQL injection prevention
await page.fill('#user_email', "admin' OR '1'='1");
// Should reject invalid input
```
## Continuous Integration
### GitHub Actions Workflow
```yaml
name: Test Plugin
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup Node
uses: actions/setup-node@v2
with:
node-version: '16'
- name: Install dependencies
run: npm install playwright
- name: Run tests
run: |
export DISPLAY=:99
Xvfb :99 -screen 0 1920x1080x24 &
node test-all-features.js
```
## Test Coverage Goals
### Minimum Coverage Requirements
- **Authentication**: 100% - All login/logout paths
- **Authorization**: 100% - Role-based access control
- **CRUD Operations**: 90% - Create, Read, Update, Delete
- **UI Components**: 80% - Forms, buttons, navigation
- **Error Handling**: 85% - Error messages, validation
- **Edge Cases**: 70% - Boundary conditions
### Coverage Reporting
```bash
# Generate coverage report
npm run test:coverage
# View coverage
open coverage/index.html
```
## Best Practices Summary
1. **Always test on staging first**
2. **Use real test accounts, not mocked data**
3. **Verify both functionality and UI**
4. **Check browser console for errors**
5. **Test with different user roles**
6. **Take screenshots for debugging**
7. **Clean up test data after tests**
8. **Monitor performance metrics**
9. **Document test failures**
10. **Keep tests maintainable and readable**
## Resources
- [Playwright Documentation](https://playwright.dev/docs/intro)
- [WordPress Testing Best Practices](https://make.wordpress.org/core/handbook/testing/)
- [PHPUnit for WordPress](https://make.wordpress.org/core/handbook/testing/automated-testing/phpunit/)
- [Browser Testing Guide](https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Cross_browser_testing)