- 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>
414 lines
No EOL
10 KiB
Markdown
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) |