Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
85.53% covered (warning)
85.53%
130 / 152
92.31% covered (success)
92.31%
12 / 13
CRAP
0.00% covered (danger)
0.00%
0 / 1
phpbb_extension_finder_test
85.53% covered (warning)
85.53%
130 / 152
92.31% covered (success)
92.31%
12 / 13
13.51
0.00% covered (danger)
0.00%
0 / 1
 setUp
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
1 / 1
1
 test_suffix_get_classes
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
1 / 1
1
 set_extensions_data
0.00% covered (danger)
0.00%
0 / 22
0.00% covered (danger)
0.00%
0 / 1
2
 test_set_extensions
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
1
 test_get_directories
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
1
 test_prefix_get_directories
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
1
 test_prefix_get_classes
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
1 / 1
1
 test_directory_get_classes
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
1
 test_absolute_directory_get_classes
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
1
 test_non_absolute_directory_get_classes
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
1
 test_sub_directory_get_classes
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
1
 test_uncleansub_directory_get_classes
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
1
 test_find_from_extension
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2/**
3*
4* This file is part of the phpBB Forum Software package.
5*
6* @copyright (c) phpBB Limited <https://www.phpbb.com>
7* @license GNU General Public License, version 2 (GPL-2.0)
8*
9* For full copyright and license information, please see
10* the docs/CREDITS.txt file.
11*
12*/
13
14class phpbb_extension_finder_test extends phpbb_test_case
15{
16    /** @var \phpbb\extension\manager */
17    protected $extension_manager;
18    /** @var \phpbb\finder\finder */
19    protected $finder;
20
21    protected function setUp(): void
22    {
23        $this->extension_manager = new phpbb_mock_extension_manager(
24            __DIR__ . '/',
25            array(
26                'vendor2/foo' => array(
27                    'ext_name' => 'vendor2/foo',
28                    'ext_active' => '1',
29                    'ext_path' => 'ext/vendor2/foo/',
30                ),
31                'vendor3/bar' => array(
32                    'ext_name' => 'vendor3/bar',
33                    'ext_active' => '1',
34                    'ext_path' => 'ext/vendor3/bar/',
35                ),
36            ));
37
38        $this->finder = $this->extension_manager->get_finder();
39    }
40
41    public function test_suffix_get_classes()
42    {
43        $classes = $this->finder
44            ->core_path('phpbb/default/')
45            ->extension_suffix('_class')
46            ->get_classes();
47
48        sort($classes);
49        $this->assertEquals(
50            array(
51                '\phpbb\default\implementation',
52                '\vendor2\foo\a_class',
53                '\vendor2\foo\b_class',
54                '\vendor3\bar\my\hidden_class',
55            ),
56            $classes
57        );
58    }
59
60    public static function set_extensions_data()
61    {
62        return array(
63            array(
64                array(),
65                array('\phpbb\default\implementation'),
66            ),
67            array(
68                array('vendor3/bar'),
69                array(
70                    '\phpbb\default\implementation',
71                    '\vendor3\bar\my\hidden_class',
72                ),
73            ),
74            array(
75                array('vendor2/foo', 'vendor3/bar'),
76                array(
77                    '\phpbb\default\implementation',
78                    '\vendor2\foo\a_class',
79                    '\vendor2\foo\b_class',
80                    '\vendor3\bar\my\hidden_class',
81                ),
82            ),
83        );
84    }
85
86    /**
87     * @dataProvider set_extensions_data
88     */
89    public function test_set_extensions($extensions, $expected)
90    {
91        $classes = $this->finder
92            ->set_extensions($extensions)
93            ->core_path('phpbb/default/')
94            ->extension_suffix('_class')
95            ->get_classes();
96
97        sort($classes);
98        $this->assertEquals($expected, $classes);
99    }
100
101    public function test_get_directories()
102    {
103        $dirs = $this->finder
104            ->directory('/type')
105            ->get_directories();
106
107        sort($dirs);
108        $this->assertEquals(array(
109            __DIR__ . '/ext/vendor2/foo/type/',
110        ), $dirs);
111    }
112
113    public function test_prefix_get_directories()
114    {
115        $dirs = $this->finder
116            ->prefix('ty')
117            ->get_directories();
118
119        sort($dirs);
120        $this->assertEquals(array(
121            __DIR__ . '/ext/vendor2/foo/sub/type/',
122            __DIR__ . '/ext/vendor2/foo/type/',
123            __DIR__ . '/ext/vendor2/foo/typewrong/',
124        ), $dirs);
125    }
126
127    public function test_prefix_get_classes()
128    {
129        $classes = $this->finder
130            ->core_path('phpbb/default/')
131            ->extension_prefix('hidden_')
132            ->get_classes();
133
134        sort($classes);
135        $this->assertEquals(
136            array(
137                '\phpbb\default\implementation',
138                '\vendor3\bar\my\hidden_class',
139            ),
140            $classes
141        );
142    }
143
144    public function test_directory_get_classes()
145    {
146        $classes = $this->finder
147            ->core_path('phpbb/default/')
148            ->extension_directory('type')
149            ->get_classes();
150
151        sort($classes);
152        $this->assertEquals(
153            array(
154                '\phpbb\default\implementation',
155                '\vendor2\foo\sub\type\alternative',
156                '\vendor2\foo\type\alternative',
157            ),
158            $classes
159        );
160    }
161
162    public function test_absolute_directory_get_classes()
163    {
164        $classes = $this->finder
165            ->directory('/type/')
166            ->get_classes();
167
168        sort($classes);
169        $this->assertEquals(
170            array(
171                '\vendor2\foo\type\alternative',
172            ),
173            $classes
174        );
175    }
176
177    public function test_non_absolute_directory_get_classes()
178    {
179        $classes = $this->finder
180            ->directory('type/')
181            ->get_classes();
182
183        sort($classes);
184        $this->assertEquals(
185            array(
186                '\vendor2\foo\sub\type\alternative',
187                '\vendor2\foo\type\alternative',
188            ),
189            $classes
190        );
191    }
192
193    public function test_sub_directory_get_classes()
194    {
195        $classes = $this->finder
196            ->directory('/sub/type')
197            ->get_classes();
198
199        sort($classes);
200        $this->assertEquals(
201            array(
202                '\vendor2\foo\sub\type\alternative',
203            ),
204            $classes
205        );
206    }
207
208    public function test_uncleansub_directory_get_classes()
209    {
210        $classes = $this->finder
211            ->directory('/sub/../sub/type')
212            ->get_classes();
213
214        sort($classes);
215        $this->assertEquals(
216            array(
217                '\vendor2\foo\sub\type\alternative',
218            ),
219            $classes
220        );
221    }
222
223    public function test_find_from_extension()
224    {
225        $files = $this->finder
226            ->extension_directory('/type')
227            ->find_from_extension('vendor2/foo', __DIR__ . '/ext/vendor2/foo/');
228        $classes = $this->finder->get_classes_from_files($files);
229
230        sort($classes);
231        $this->assertEquals(
232            array(
233                '\vendor2\foo\type\alternative',
234                '\vendor2\foo\type\dummy\empty',
235            ),
236            $classes
237        );
238    }
239
240    /**
241    * These do not work because of changes with PHPBB3-11386
242    * They do not seem necessary to me, so I am commenting them out for now
243    public function test_get_classes_create_cache()
244    {
245        $cache = new phpbb_mock_cache;
246        $finder = new \phpbb\finder\finder($cache, false, __DIR__ . '/', 'php', '_custom_cache_name');
247        $finder->set_extensions(array_keys($this->extension_manager->all_enabled()));
248        $files = $finder->suffix('_class.php')->get_files();
249
250        $expected_files = array(
251            'ext/bar/my/hidden_class.php' => 'bar',
252            'ext/foo/a_class.php' => 'foo',
253            'ext/foo/b_class.php' => 'foo',
254        );
255
256        $query = array(
257            'core_path' => false,
258            'core_suffix' => '_class.php',
259            'core_prefix' => false,
260            'core_directory' => false,
261            'extension_suffix' => '_class.php',
262            'extension_prefix' => false,
263            'extension_directory' => false,
264            'is_dir' => false,
265        );
266
267        $cache->checkAssociativeVar($this, '_custom_cache_name', array(
268            md5(serialize($query)) => $expected_files,
269        ), false);
270    }
271
272    public function test_cached_get_files()
273    {
274        $query = array(
275            'core_path' => 'phpbb/foo',
276            'core_suffix' => false,
277            'core_prefix' => false,
278            'core_directory' => 'bar',
279            'extension_suffix' => false,
280            'extension_prefix' => false,
281            'extension_directory' => false,
282            'is_dir' => false,
283        );
284
285        $finder = new \phpbb\finder\finder(
286            new phpbb_mock_cache(array(
287                '_ext_finder' => array(
288                    md5(serialize($query)) => array('file_name' => 'extension'),
289                ),
290            )),
291            false,
292            __DIR__ . '/',
293            '_ext_finder'
294        );
295        $finder->set_extensions(array_keys($this->extension_manager->all_enabled()));
296
297        $classes = $finder
298            ->core_path($query['core_path'])
299            ->core_directory($query['core_directory'])
300            ->get_files();
301
302        sort($classes);
303        $this->assertEquals(
304            array(__DIR__ . '/file_name'),
305            $classes
306        );
307    }
308    */
309}