1<?php
2
3namespace dokuwiki\tpl\mikio\test;
4
5use dokuwiki\template\mikio\mikio;
6use DokuWikiTest;
7
8/**
9 * General tests for the mikio template
10 *
11 * @group tpl_mikio
12 * @group plugins
13 */
14class general_tpl_mikio_test extends DokuWikiTest
15{
16
17    /**
18     * Simple test to make sure the template.info.txt is in correct format
19     */
20    public function test_templateinfo()
21    {
22        $file = __DIR__ . '/../template.info.txt';
23        $this->assertFileExists($file);
24
25        $info = confToHash($file);
26
27        $this->assertArrayHasKey('base', $info);
28        $this->assertArrayHasKey('author', $info);
29        $this->assertArrayHasKey('email', $info);
30        $this->assertArrayHasKey('date', $info);
31        $this->assertArrayHasKey('name', $info);
32        $this->assertArrayHasKey('desc', $info);
33        $this->assertArrayHasKey('url', $info);
34
35        $this->assertEquals('mikio', $info['base']);
36        $this->assertRegExp('/^https?:\/\//', $info['url']);
37        $this->assertTrue(mail_isvalid($info['email']));
38        $this->assertRegExp('/^\d\d\d\d-\d\d-\d\d$/', $info['date']);
39        $this->assertTrue(false !== strtotime($info['date']));
40    }
41
42    /**
43     * Test to ensure that every conf['...'] entry in conf/default.php has a corresponding meta['...'] entry in
44     * conf/metadata.php.
45     */
46    public function test_tpl_conf_and_meta_exists(): void
47    {
48        global $conf, $meta;
49
50        $conf_existing_keys = [];
51        if(!is_null($conf)) {
52            $conf_existing_keys = array_keys($conf);
53        }
54
55        $conf_file = __DIR__ . '/../conf/default.php';
56
57        if (file_exists($conf_file)) {
58            include $conf_file;
59        }
60
61        $meta_existing_keys = [];
62        if(!is_null($meta)) {
63            $meta_existing_keys = array_keys($meta);
64        }
65
66        $meta_file = __DIR__ . '/../conf/metadata.php';
67
68        if (file_exists($meta_file)) {
69            include $meta_file;
70        }
71
72        $this->assertEquals(
73            gettype($conf),
74            gettype($meta),
75            'Both conf/default.php and conf/metadata.php have to exist and contain the same keys.'
76        );
77
78        if (!is_null($conf) && !is_null($meta)) {
79            foreach ($conf as $key => $value) {
80                if(in_array($key, $conf_existing_keys, true)) {
81                    continue;
82                }
83
84                $this->assertArrayHasKey(
85                    $key,
86                    $meta,
87                    'Key $meta[\'' . $key . '\'] missing in conf/metadata.php'
88                );
89            }
90
91            foreach ($meta as $key => $value) {
92                if(in_array($key, $meta_existing_keys, true)) {
93                    continue;
94                }
95
96                $this->assertArrayHasKey(
97                    $key,
98                    $conf,
99                    'Key $conf[\'' . $key . '\'] missing in conf/default.php'
100                );
101            }
102        }
103    }
104
105    /**
106     * Test to ensure that every conf['...'] entry in conf/default.php has a corresponding lang['...'] entry in
107     * lang/../setting.php.
108     */
109    public function test_tpl_lang_settings_conf_exists(): void
110    {
111        global $conf, $lang;
112
113        $conf_existing_keys = [];
114        if(!is_null($conf)) {
115            $conf_existing_keys = array_keys($conf);
116        }
117
118        $conf_file = __DIR__ . '/../conf/default.php';
119
120        $this->assertFileExists(
121            $conf_file,
122            'conf/default.php has to exist.'
123        );
124
125        include $conf_file;
126
127        if (!is_null($conf)) {
128            $lang_dir = __DIR__ . '/../lang/';
129            $lang_dir_codes = scandir($lang_dir);
130
131            $lang_orig_keys = array_keys($lang);
132
133            foreach ($lang_dir_codes as $lang_code) {
134                if($lang_code !== '.' && $lang_code !== '..' && is_dir($lang_dir . $lang_code)) {
135                    $lang_file_path = $lang_dir . $lang_code . '/settings.php';
136                    $this->assertFileExists(
137                        $lang_file_path,
138                        'lang/' . $lang_code . '/lang.php has to exist.'
139                    );
140
141                    include $lang_file_path;
142
143                    foreach ($conf as $key => $value) {
144                        if(in_array($key, $conf_existing_keys, true)) {
145                            continue;
146                        }
147
148                        $this->assertArrayHasKey(
149                            $key,
150                            $lang,
151                            'Key $lang[\'' . $key . '\'] missing in lang/' . $lang_code . '/lang.php'
152                        );
153                    }
154
155                    foreach(array_keys($lang) as $lang_key) {
156                        if(in_array($lang_key, $lang_orig_keys, true)) {
157                            continue;
158                        }
159
160                        unset($lang[$lang_key]);
161                    }
162                }
163            }
164        }
165    }
166
167    /**
168     * Test to ensure that every lang['...'] entry in lang/../lang.php has a corresponding lang['...'] entry in
169     * lang/en/lang.php.
170     */
171    public function test_tpl_lang_exists_in_non_en_lang(): void
172    {
173        global $lang;
174
175        $lang_dir = __DIR__ . '/../lang/';
176
177        $lang_existing_keys = [];
178        if(!is_null($lang)) {
179            $lang_existing_keys = array_keys($lang);
180        }
181
182        $lang_en_file = $lang_dir . 'en/lang.php';
183
184        $this->assertFileExists(
185            $lang_en_file,
186            'lang/en/lang.php has to exist.'
187        );
188
189        include $lang_en_file;
190
191        $lang_en_keys = array_diff(array_keys($lang), $lang_existing_keys);
192        foreach($lang_en_keys as $lang_key) {
193            unset($lang[$lang_key]);
194        }
195
196        $lang_dir_codes = scandir($lang_dir);
197
198        foreach ($lang_dir_codes as $lang_code) {
199            if($lang_code !== '.' && $lang_code !== '..' && $lang_code !== 'en' && is_dir($lang_dir . $lang_code)) {
200                $lang_file_path = $lang_dir . $lang_code . '/lang.php';
201                $this->assertFileExists(
202                    $lang_file_path,
203                    'lang/' . $lang_code . '/lang.php has to exist.'
204                );
205
206                include $lang_file_path;
207
208                foreach ($lang_en_keys as $key) {
209                    $this->assertArrayHasKey(
210                        $key,
211                        $lang,
212                        'Key $lang[\'' . $key . '\'] missing in lang/' . $lang_code . '/lang.php'
213                    );
214
215                    unset($lang[$key]);
216                }
217            }
218        }
219    }
220
221    /**
222     * Test to ensure that the mikio class is a singleton
223     */
224    public function test_singleton_pattern()
225    {
226        $instance1 = mikio::getInstance();
227        $instance2 = mikio::getInstance();
228        $this->assertSame($instance1, $instance2);
229    }
230}
231