1*c176b8b3SJohann Duscher<?php 2*c176b8b3SJohann Duscher/** 3*c176b8b3SJohann Duscher * Test Adapter for Delete Page Guard Plugin 4*c176b8b3SJohann Duscher * 5*c176b8b3SJohann Duscher * This file provides a testable version of the plugin by extending the 6*c176b8b3SJohann Duscher * actual plugin class and making protected methods accessible for testing. 7*c176b8b3SJohann Duscher * 8*c176b8b3SJohann Duscher * @license GPL 2 (https://www.gnu.org/licenses/gpl-2.0.html) - see LICENSE.md 9*c176b8b3SJohann Duscher * @author Johann Duscher <jonny.dee@posteo.net> 10*c176b8b3SJohann Duscher * @copyright 2025 Johann Duscher 11*c176b8b3SJohann Duscher */ 12*c176b8b3SJohann Duscher 13*c176b8b3SJohann Duscher// Mock the DokuWiki ActionPlugin class for testing 14*c176b8b3SJohann Duscherif (!class_exists('dokuwiki\Extension\ActionPlugin')) { 15*c176b8b3SJohann Duscher class ActionPlugin { 16*c176b8b3SJohann Duscher protected $config = [ 17*c176b8b3SJohann Duscher 'patterns' => "^start$\n^sidebar$\n^users:[^:]+:start$", 18*c176b8b3SJohann Duscher 'match_target' => 'id', 19*c176b8b3SJohann Duscher 'exempt_groups' => 'editors,moderators', 20*c176b8b3SJohann Duscher 'trim_mode' => true 21*c176b8b3SJohann Duscher ]; 22*c176b8b3SJohann Duscher 23*c176b8b3SJohann Duscher protected $lang = [ 24*c176b8b3SJohann Duscher 'pattern_redos_warning' => 'Pattern "%s" may cause performance issues', 25*c176b8b3SJohann Duscher 'pattern_too_long' => 'Pattern "%s" is too long (max 1000 chars)', 26*c176b8b3SJohann Duscher 'pattern_invalid_syntax' => 'Pattern "%s" has invalid syntax: %s', 27*c176b8b3SJohann Duscher 'deny_msg' => 'Deleting this page is not allowed.', 28*c176b8b3SJohann Duscher 'config_validation_errors' => 'Some regex patterns have validation errors.' 29*c176b8b3SJohann Duscher ]; 30*c176b8b3SJohann Duscher 31*c176b8b3SJohann Duscher public function getConf($key) { 32*c176b8b3SJohann Duscher return isset($this->config[$key]) ? $this->config[$key] : null; 33*c176b8b3SJohann Duscher } 34*c176b8b3SJohann Duscher 35*c176b8b3SJohann Duscher public function getLang($key) { 36*c176b8b3SJohann Duscher return isset($this->lang[$key]) ? $this->lang[$key] : "[$key]"; 37*c176b8b3SJohann Duscher } 38*c176b8b3SJohann Duscher } 39*c176b8b3SJohann Duscher 40*c176b8b3SJohann Duscher // Create the namespace alias 41*c176b8b3SJohann Duscher class_alias('ActionPlugin', 'dokuwiki\Extension\ActionPlugin'); 42*c176b8b3SJohann Duscher} 43*c176b8b3SJohann Duscher 44*c176b8b3SJohann Duscher// Mock DokuWiki Event classes 45*c176b8b3SJohann Duscherif (!class_exists('dokuwiki\Extension\Event')) { 46*c176b8b3SJohann Duscher class Event { 47*c176b8b3SJohann Duscher public $data = []; 48*c176b8b3SJohann Duscher public $canPreventDefault = true; 49*c176b8b3SJohann Duscher } 50*c176b8b3SJohann Duscher class_alias('Event', 'dokuwiki\Extension\Event'); 51*c176b8b3SJohann Duscher} 52*c176b8b3SJohann Duscher 53*c176b8b3SJohann Duscherif (!class_exists('dokuwiki\Extension\EventHandler')) { 54*c176b8b3SJohann Duscher class EventHandler { 55*c176b8b3SJohann Duscher public function register_hook($event, $when, $obj, $method) { 56*c176b8b3SJohann Duscher // Mock implementation 57*c176b8b3SJohann Duscher } 58*c176b8b3SJohann Duscher } 59*c176b8b3SJohann Duscher class_alias('EventHandler', 'dokuwiki\Extension\EventHandler'); 60*c176b8b3SJohann Duscher} 61*c176b8b3SJohann Duscher 62*c176b8b3SJohann Duscher// Mock DokuWiki constants and functions 63*c176b8b3SJohann Duscherif (!defined('DOKU_INC')) define('DOKU_INC', dirname(__DIR__) . '/'); 64*c176b8b3SJohann Duscher 65*c176b8b3SJohann Duscher// Include the actual plugin file 66*c176b8b3SJohann Duscherrequire_once dirname(__DIR__) . '/action.php'; 67*c176b8b3SJohann Duscher 68*c176b8b3SJohann Duscher/** 69*c176b8b3SJohann Duscher * Testable version of the Delete Page Guard plugin 70*c176b8b3SJohann Duscher * 71*c176b8b3SJohann Duscher * Extends the actual plugin class and exposes protected methods for testing. 72*c176b8b3SJohann Duscher */ 73*c176b8b3SJohann Duscherclass TestableDeletePageGuard extends action_plugin_deletepageguard { 74*c176b8b3SJohann Duscher 75*c176b8b3SJohann Duscher /** 76*c176b8b3SJohann Duscher * Override getConf to use mock configuration 77*c176b8b3SJohann Duscher */ 78*c176b8b3SJohann Duscher public function getConf($key) { 79*c176b8b3SJohann Duscher $config = [ 80*c176b8b3SJohann Duscher 'patterns' => "^start$\n^sidebar$\n^users:[^:]+:start$", 81*c176b8b3SJohann Duscher 'match_target' => 'id', 82*c176b8b3SJohann Duscher 'exempt_groups' => 'editors,moderators', 83*c176b8b3SJohann Duscher 'trim_mode' => true 84*c176b8b3SJohann Duscher ]; 85*c176b8b3SJohann Duscher return isset($config[$key]) ? $config[$key] : null; 86*c176b8b3SJohann Duscher } 87*c176b8b3SJohann Duscher 88*c176b8b3SJohann Duscher /** 89*c176b8b3SJohann Duscher * Override getLang to use mock language strings 90*c176b8b3SJohann Duscher */ 91*c176b8b3SJohann Duscher public function getLang($key) { 92*c176b8b3SJohann Duscher $lang = [ 93*c176b8b3SJohann Duscher 'pattern_redos_warning' => 'Pattern "%s" may cause performance issues', 94*c176b8b3SJohann Duscher 'pattern_too_long' => 'Pattern "%s" is too long (max 1000 chars)', 95*c176b8b3SJohann Duscher 'pattern_invalid_syntax' => 'Pattern "%s" has invalid syntax: %s', 96*c176b8b3SJohann Duscher 'deny_msg' => 'Deleting this page is not allowed.', 97*c176b8b3SJohann Duscher 'config_validation_errors' => 'Some regex patterns have validation errors.' 98*c176b8b3SJohann Duscher ]; 99*c176b8b3SJohann Duscher return isset($lang[$key]) ? $lang[$key] : "[$key]"; 100*c176b8b3SJohann Duscher } 101*c176b8b3SJohann Duscher 102*c176b8b3SJohann Duscher /** 103*c176b8b3SJohann Duscher * Expose protected validateRegexPattern method for testing 104*c176b8b3SJohann Duscher */ 105*c176b8b3SJohann Duscher public function validateRegexPattern($pattern, $lineNumber = 0) { 106*c176b8b3SJohann Duscher return parent::validateRegexPattern($pattern, $lineNumber); 107*c176b8b3SJohann Duscher } 108*c176b8b3SJohann Duscher 109*c176b8b3SJohann Duscher /** 110*c176b8b3SJohann Duscher * Expose protected matchesPattern method for testing 111*c176b8b3SJohann Duscher */ 112*c176b8b3SJohann Duscher public function matchesPattern($pattern, $target) { 113*c176b8b3SJohann Duscher return parent::matchesPattern($pattern, $target); 114*c176b8b3SJohann Duscher } 115*c176b8b3SJohann Duscher 116*c176b8b3SJohann Duscher /** 117*c176b8b3SJohann Duscher * Expose protected getRelativeFilePath method for testing 118*c176b8b3SJohann Duscher */ 119*c176b8b3SJohann Duscher public function getRelativeFilePath($fullPath, $dataDir) { 120*c176b8b3SJohann Duscher return parent::getRelativeFilePath($fullPath, $dataDir); 121*c176b8b3SJohann Duscher } 122*c176b8b3SJohann Duscher}