1*c176b8b3SJohann Duscher# Delete Page Guard - Developer Test Suite 2*c176b8b3SJohann Duscher 3*c176b8b3SJohann DuscherThis directory contains a standalone test suite for developers to verify the Delete Page Guard plugin's core functionality without requiring a full DokuWiki installation. 4*c176b8b3SJohann Duscher 5*c176b8b3SJohann Duscher## Running Tests 6*c176b8b3SJohann Duscher 7*c176b8b3SJohann Duscher```bash 8*c176b8b3SJohann Duscher# From the plugin root directory 9*c176b8b3SJohann Duscherphp tests/test_runner.php 10*c176b8b3SJohann Duscher``` 11*c176b8b3SJohann Duscher 12*c176b8b3SJohann Duscher## Requirements 13*c176b8b3SJohann Duscher 14*c176b8b3SJohann Duscher- PHP 7.4+ (same as the plugin) 15*c176b8b3SJohann Duscher- No external dependencies 16*c176b8b3SJohann Duscher 17*c176b8b3SJohann Duscher## Test Coverage 18*c176b8b3SJohann Duscher 19*c176b8b3SJohann DuscherThe test suite covers: 20*c176b8b3SJohann Duscher 21*c176b8b3SJohann Duscher### ✅ Pattern Validation 22*c176b8b3SJohann Duscher- Valid regex syntax validation 23*c176b8b3SJohann Duscher- ReDoS (Regular Expression Denial of Service) protection 24*c176b8b3SJohann Duscher- Pattern length limits (1000 character max) 25*c176b8b3SJohann Duscher- Line number reporting for errors 26*c176b8b3SJohann Duscher 27*c176b8b3SJohann Duscher### ✅ Pattern Matching 28*c176b8b3SJohann Duscher- Simple and complex regex patterns 29*c176b8b3SJohann Duscher- Exact matches and partial matches 30*c176b8b3SJohann Duscher- Case sensitivity 31*c176b8b3SJohann Duscher- Unicode character support 32*c176b8b3SJohann Duscher 33*c176b8b3SJohann Duscher### ✅ File Path Conversion 34*c176b8b3SJohann Duscher- Converting absolute paths to relative paths 35*c176b8b3SJohann Duscher- Windows and Unix path handling 36*c176b8b3SJohann Duscher- Nested directory structures 37*c176b8b3SJohann Duscher- Edge cases with non-standard paths 38*c176b8b3SJohann Duscher 39*c176b8b3SJohann Duscher### ✅ Configuration Parsing 40*c176b8b3SJohann Duscher- Multi-line pattern configuration 41*c176b8b3SJohann Duscher- Empty line handling 42*c176b8b3SJohann Duscher- Different line ending formats (Unix/Windows) 43*c176b8b3SJohann Duscher- Whitespace trimming 44*c176b8b3SJohann Duscher 45*c176b8b3SJohann Duscher### ✅ Security Features 46*c176b8b3SJohann Duscher- Forward slash escaping in patterns 47*c176b8b3SJohann Duscher- Unicode support and safety 48*c176b8b3SJohann Duscher- Special regex character handling 49*c176b8b3SJohann Duscher- Injection attempt protection 50*c176b8b3SJohann Duscher 51*c176b8b3SJohann Duscher### ✅ Edge Cases 52*c176b8b3SJohann Duscher- Empty patterns and targets 53*c176b8b3SJohann Duscher- Very long input strings 54*c176b8b3SJohann Duscher- Whitespace-only content 55*c176b8b3SJohann Duscher- Malformed input handling 56*c176b8b3SJohann Duscher 57*c176b8b3SJohann Duscher### ✅ Real-world Scenarios 58*c176b8b3SJohann Duscher- User page protection patterns 59*c176b8b3SJohann Duscher- Namespace-based protection 60*c176b8b3SJohann Duscher- File extension matching 61*c176b8b3SJohann Duscher- Complex multi-part patterns 62*c176b8b3SJohann Duscher 63*c176b8b3SJohann Duscher## Test Structure 64*c176b8b3SJohann Duscher 65*c176b8b3SJohann Duscher- **`test_runner.php`** - Main test framework and all test cases 66*c176b8b3SJohann Duscher- **`plugin_test_adapter.php`** - Makes plugin methods testable by mocking DokuWiki dependencies 67*c176b8b3SJohann Duscher- **`README.md`** - This documentation 68*c176b8b3SJohann Duscher 69*c176b8b3SJohann Duscher## Adding New Tests 70*c176b8b3SJohann Duscher 71*c176b8b3SJohann DuscherTo add a new test, edit `test_runner.php` and add: 72*c176b8b3SJohann Duscher 73*c176b8b3SJohann Duscher```php 74*c176b8b3SJohann Duscher$runner->addTest('Test Description', function() { 75*c176b8b3SJohann Duscher $plugin = new TestableDeletePageGuard(); 76*c176b8b3SJohann Duscher // Your test logic here 77*c176b8b3SJohann Duscher $result = $plugin->someMethod($input); 78*c176b8b3SJohann Duscher return $result === $expected; // Return true for pass, false/string for fail 79*c176b8b3SJohann Duscher}); 80*c176b8b3SJohann Duscher``` 81*c176b8b3SJohann Duscher 82*c176b8b3SJohann Duscher## Test Output 83*c176b8b3SJohann Duscher 84*c176b8b3SJohann Duscher- ✅ **PASS** - Test succeeded 85*c176b8b3SJohann Duscher- ❌ **FAIL** - Test failed with optional error message 86*c176b8b3SJohann Duscher- ❌ **ERROR** - Test threw an exception 87*c176b8b3SJohann Duscher 88*c176b8b3SJohann DuscherThe runner exits with code 0 on success, 1 on failure (suitable for CI/CD). 89*c176b8b3SJohann Duscher 90*c176b8b3SJohann Duscher## Mocked Dependencies 91*c176b8b3SJohann Duscher 92*c176b8b3SJohann DuscherThe test adapter mocks these DokuWiki components: 93*c176b8b3SJohann Duscher 94*c176b8b3SJohann Duscher- `dokuwiki\Extension\ActionPlugin` - Base plugin class 95*c176b8b3SJohann Duscher- `dokuwiki\Extension\Event` - Event system 96*c176b8b3SJohann Duscher- `dokuwiki\Extension\EventHandler` - Event registration 97*c176b8b3SJohann Duscher- Plugin configuration (`getConf()`) 98*c176b8b3SJohann Duscher- Language strings (`getLang()`) 99*c176b8b3SJohann Duscher 100*c176b8b3SJohann Duscher## Example Usage 101*c176b8b3SJohann Duscher 102*c176b8b3SJohann Duscher```bash 103*c176b8b3SJohann Duscher# Run tests and see detailed output 104*c176b8b3SJohann Duscherphp tests/test_runner.php 105*c176b8b3SJohann Duscher 106*c176b8b3SJohann Duscher# Check if tests pass (for scripts) 107*c176b8b3SJohann Duscherphp tests/test_runner.php && echo "All tests passed!" 108*c176b8b3SJohann Duscher 109*c176b8b3SJohann Duscher# Run tests and capture output 110*c176b8b3SJohann Duscherphp tests/test_runner.php > test_results.txt 2>&1 111*c176b8b3SJohann Duscher``` 112*c176b8b3SJohann Duscher 113*c176b8b3SJohann Duscher## Integration with Development Workflow 114*c176b8b3SJohann Duscher 115*c176b8b3SJohann DuscherThis test suite is designed for: 116*c176b8b3SJohann Duscher 117*c176b8b3SJohann Duscher- **Pre-commit testing** - Verify changes before committing 118*c176b8b3SJohann Duscher- **Continuous Integration** - Automated testing in CI/CD pipelines 119*c176b8b3SJohann Duscher- **Regression testing** - Ensure new features don't break existing functionality 120*c176b8b3SJohann Duscher- **Development confidence** - Rapid feedback during development 121*c176b8b3SJohann Duscher 122*c176b8b3SJohann Duscher## Performance 123*c176b8b3SJohann Duscher 124*c176b8b3SJohann DuscherThe test suite typically runs in under 1 second and includes 30+ test cases covering all critical functionality.