xref: /plugin/deletepageguard/tests/plugin_test_adapter.php (revision c176b8b34e4ca9181ac383002f75ffe5441c68b3)
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}