xref: /plugin/deletepageguard/tests/README.md (revision c176b8b34e4ca9181ac383002f75ffe5441c68b3)
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.