Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
89.37% covered (warning)
89.37%
269 / 301
89.47% covered (warning)
89.47%
17 / 19
CRAP
0.00% covered (danger)
0.00%
0 / 1
phpbb_textformatter_s9e_renderer_test
89.37% covered (warning)
89.37%
269 / 301
89.47% covered (warning)
89.47%
17 / 19
31.08
0.00% covered (danger)
0.00%
0 / 1
 get_cache_dir
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 test_load_from_cache
100.00% covered (success)
100.00%
20 / 20
100.00% covered (success)
100.00%
1 / 1
1
 test_regenerate_on_cache_miss
100.00% covered (success)
100.00%
22 / 22
100.00% covered (success)
100.00%
1 / 1
1
 test_options
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
2
 get_options_cases
0.00% covered (danger)
0.00%
0 / 27
0.00% covered (danger)
0.00%
0 / 1
2
 test_default_options
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
 get_default_options_cases
100.00% covered (success)
100.00%
94 / 94
100.00% covered (success)
100.00%
1 / 1
1
 test_default_lang
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 test_get_option
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
1
 get_option_names
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 test_styles
100.00% covered (success)
100.00%
19 / 19
100.00% covered (success)
100.00%
1 / 1
2
 test_style_inheritance1
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
1
 test_style_inheritance2
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
1 / 1
2
 test_setup_event
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
1 / 1
1
 setup_event_callback
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
2
 test_render_event
100.00% covered (success)
100.00%
30 / 30
100.00% covered (success)
100.00%
1 / 1
1
 render_before_event_callback
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
4
 render_after_event_callback
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
4
 test_get_renderer
100.00% covered (success)
100.00%
3 / 3
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_textformatter_s9e_renderer_test extends phpbb_test_case
15{
16    public function get_cache_dir()
17    {
18        return __DIR__ . '/../../tmp/';
19    }
20
21    public function test_load_from_cache()
22    {
23        // Save a fake renderer class in the cache dir
24        file_put_contents(
25            $this->get_cache_dir() . 'renderer_foo.php',
26            '<?php class renderer_foo { public function setParameter() {} }'
27        );
28
29        $cache = $this->createMock('phpbb_mock_cache');
30        $cache->expects($this->once())
31              ->method('get')
32              ->with('_foo_renderer')
33              ->will($this->returnValue(array('class' => 'renderer_foo')));
34
35        $factory = $this->getMockBuilder('phpbb\\textformatter\\s9e\\factory')
36                        ->disableOriginalConstructor()
37                        ->getMock();
38        $factory->expects($this->never())->method('regenerate');
39
40        $renderer = new \phpbb\textformatter\s9e\renderer(
41            $cache,
42            $this->get_cache_dir(),
43            '_foo_renderer',
44            $factory,
45            new phpbb_mock_event_dispatcher
46        );
47    }
48
49    public function test_regenerate_on_cache_miss()
50    {
51        $mock = $this->getMockForAbstractClass('s9e\\TextFormatter\\Renderer');
52
53        $cache = $this->createMock('phpbb_mock_cache');
54        $cache->expects($this->once())
55              ->method('get')
56              ->with('_foo_renderer')
57              ->will($this->returnValue(false));
58
59        $factory = $this->getMockBuilder('phpbb\\textformatter\\s9e\\factory')
60                        ->disableOriginalConstructor()
61                        ->getMock();
62        $factory->expects($this->once())
63                ->method('regenerate')
64                ->will($this->returnValue([
65                    'parser' => $mock,
66                    'renderer' => $mock,
67                ]));
68
69        $renderer = new \phpbb\textformatter\s9e\renderer(
70            $cache,
71            $this->get_cache_dir(),
72            '_foo_renderer',
73            $factory,
74            new phpbb_mock_event_dispatcher
75        );
76    }
77
78    /**
79    * @dataProvider get_options_cases
80    */
81    public function test_options($original, $expected, $calls)
82    {
83        $container = new phpbb_mock_container_builder;
84        $this->get_test_case_helpers()->set_s9e_services($container);
85
86        $renderer = $container->get('text_formatter.renderer');
87
88        foreach ($calls as $method => $arg)
89        {
90            $renderer->$method($arg);
91        }
92
93        $this->assertSame($expected, $renderer->render($original));
94    }
95
96    public static function get_options_cases()
97    {
98        return array(
99            array(
100                '<t>apple</t>',
101                'banana',
102                array('set_viewcensors' => true)
103            ),
104            array(
105                '<t>apple</t>',
106                'apple',
107                array('set_viewcensors' => false)
108            ),
109            array(
110                '<r><IMG src="http://example.org/foo.png"><s>[img]</s>http://example.org/foo.png<e>[/img]</e></IMG></r>',
111                '<img src="http://example.org/foo.png" class="postimage" alt="Image">',
112                array('set_viewimg' => true)
113            ),
114            array(
115                '<r><E>:)</E></r>',
116                '<img class="smilies" src="phpBB/images/smilies/icon_e_smile.gif" width="15" height="17" alt=":)" title="Smile">',
117                array('set_viewsmilies' => true)
118            ),
119            array(
120                '<r><E>:)</E></r>',
121                ':)',
122                array('set_viewsmilies' => false)
123            ),
124        );
125    }
126
127    /**
128    * @dataProvider get_default_options_cases
129    */
130    public function test_default_options($original, $expected, $setup = null)
131    {
132        $container = new phpbb_mock_container_builder;
133
134        if (isset($setup))
135        {
136            $setup($container, $this);
137        }
138
139        $this->get_test_case_helpers()->set_s9e_services($container);
140
141        $this->assertSame($expected, $container->get('text_formatter.renderer')->render($original));
142    }
143
144    public static function get_default_options_cases()
145    {
146        return array(
147            array(
148                '<t>apple</t>',
149                'banana'
150            ),
151            array(
152                '<t>apple</t>',
153                'banana',
154                function ($phpbb_container)
155                {
156                    global $phpbb_root_path, $phpEx;
157
158                    $lang_loader = new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx);
159                    $lang = new \phpbb\language\language($lang_loader);
160                    $user = new \phpbb\user($lang, '\phpbb\datetime');
161                    $user->data['user_options'] = 230271;
162                    $user->optionset('viewcensors', false);
163
164                    $phpbb_container->set('user', $user);
165                }
166            ),
167            array(
168                '<t>apple</t>',
169                'banana',
170                function ($phpbb_container)
171                {
172                    global $phpbb_root_path, $phpEx;
173
174                    $lang_loader = new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx);
175                    $lang = new \phpbb\language\language($lang_loader);
176                    $user = new \phpbb\user($lang, '\phpbb\datetime');
177                    $user->data['user_options'] = 230271;
178                    $user->optionset('viewcensors', false);
179
180                    $config = new \phpbb\config\config(array('allow_nocensors' => true));
181
182                    $phpbb_container->set('user', $user);
183                    $phpbb_container->set('config', $config);
184                }
185            ),
186            array(
187                '<t>apple</t>',
188                'apple',
189                function ($phpbb_container, $test)
190                {
191                    global $phpbb_root_path, $phpEx;
192
193                    $lang_loader = new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx);
194                    $lang = new \phpbb\language\language($lang_loader);
195                    $user = new \phpbb\user($lang, '\phpbb\datetime');
196                    $user->data['user_options'] = 230271;
197                    $user->optionset('viewcensors', false);
198
199                    $config = new \phpbb\config\config(array('allow_nocensors' => true));
200
201                    $auth = $test->createMock('phpbb\\auth\\auth');
202                    $auth->expects($test->any())
203                         ->method('acl_get')
204                         ->with('u_chgcensors')
205                         ->will($test->returnValue(true));
206
207                    $phpbb_container->set('user', $user);
208                    $phpbb_container->set('config', $config);
209                    $phpbb_container->set('auth', $auth);
210                }
211            ),
212            array(
213                '<r><IMG src="http://localhost/mrgreen.gif"><s>[img]</s><URL url="http://localhost/mrgreen.gif">http://localhost/mrgreen.gif</URL><e>[/img]</e></IMG></r>',
214                '<img src="http://localhost/mrgreen.gif" class="postimage" alt="Image">'
215            ),
216            array(
217                '<r><IMG src="http://localhost/mrgreen.gif"><s>[img]</s><URL url="http://localhost/mrgreen.gif">http://localhost/mrgreen.gif</URL><e>[/img]</e></IMG></r>',
218                '<a href="http://localhost/mrgreen.gif" class="postlink">http://localhost/mrgreen.gif</a>',
219                function ($phpbb_container)
220                {
221                    global $phpbb_root_path, $phpEx;
222
223                    $lang_loader = new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx);
224                    $lang = new \phpbb\language\language($lang_loader);
225                    $user = new \phpbb\user($lang, '\phpbb\datetime');
226                    $user->data['user_options'] = 230271;
227                    $user->optionset('viewimg', false);
228
229                    $phpbb_container->set('user', $user);
230                }
231            ),
232            array(
233                '<r><E>:)</E></r>',
234                '<img class="smilies" src="phpBB/images/smilies/icon_e_smile.gif" width="15" height="17" alt=":)" title="Smile">'
235            ),
236            array(
237                '<r><E>:)</E></r>',
238                ':)',
239                function ($phpbb_container)
240                {
241                    global $phpbb_root_path, $phpEx;
242
243                    $lang_loader = new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx);
244                    $lang = new \phpbb\language\language($lang_loader);
245                    $user = new \phpbb\user($lang, '\phpbb\datetime');
246                    $user->data['user_options'] = 230271;
247                    $user->optionset('viewsmilies', false);
248
249                    $phpbb_container->set('user', $user);
250                }
251            ),
252        );
253    }
254
255    public function test_default_lang()
256    {
257        global $phpbb_container;
258        $this->get_test_case_helpers()->set_s9e_services($phpbb_container, __DIR__ . '/fixtures/default_lang.xml');
259
260        $renderer = $phpbb_container->get('text_formatter.renderer');
261
262        $this->assertSame('FOO_BAR', $renderer->render('<r><FOO/></r>'));
263    }
264
265    /**
266    * @dataProvider get_option_names
267    */
268    public function test_get_option($option_name)
269    {
270        global $phpbb_container;
271        $this->get_test_case_helpers()->set_s9e_services();
272
273        $renderer = $phpbb_container->get('text_formatter.renderer');
274
275        $renderer->{'set_' . $option_name}(false);
276        $this->assertFalse($renderer->{'get_' . $option_name}());
277        $renderer->{'set_' . $option_name}(true);
278        $this->assertTrue($renderer->{'get_' . $option_name}());
279    }
280
281    public static function get_option_names()
282    {
283        return array(
284            array('viewcensors'),
285            array('viewimg'),
286            array('viewsmilies')
287        );
288    }
289
290    public function test_styles()
291    {
292        global $phpbb_container;
293
294        $tests = array(
295            1 => '<strong>bold</strong>',
296            2 => '<b>bold</b>'
297        );
298
299        global $phpbb_root_path, $phpEx;
300
301        foreach ($tests as $style_id => $expected)
302        {
303            $lang_loader = new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx);
304            $lang = new \phpbb\language\language($lang_loader);
305            $user = new \phpbb\user($lang, '\phpbb\datetime');
306            $user->style = array('style_id' => $style_id);
307
308            $phpbb_container = new phpbb_mock_container_builder;
309            $phpbb_container->set('user', $user);
310
311            $this->get_test_case_helpers()->set_s9e_services($phpbb_container, __DIR__ . '/fixtures/styles.xml', __DIR__ . '/fixtures/styles/');
312
313            $renderer = $phpbb_container->get('text_formatter.renderer');
314            $this->assertSame(
315                $expected,
316                $renderer->render('<r><B><s>[b]</s>bold<e>[/b]</e></B></r>')
317            );
318        }
319    }
320
321    public function test_style_inheritance1()
322    {
323        global $phpbb_container, $phpbb_root_path, $phpEx;
324
325        // Style 3 inherits from 2 which inherits from 1. Only style 1 has a bbcode.html
326        $lang_loader = new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx);
327        $lang = new \phpbb\language\language($lang_loader);
328        $user = new \phpbb\user($lang, '\phpbb\datetime');
329        $user->style = array('style_id' => 3);
330
331        $phpbb_container = new phpbb_mock_container_builder;
332        $phpbb_container->set('user', $user);
333
334        $this->get_test_case_helpers()->set_s9e_services($phpbb_container, __DIR__ . '/fixtures/style_inheritance.xml', __DIR__ . '/fixtures/styles/');
335
336        $renderer = $phpbb_container->get('text_formatter.renderer');
337        $this->assertSame(
338            '<strong>bold</strong>',
339            $renderer->render('<r><B><s>[b]</s>bold<e>[/b]</e></B></r>')
340        );
341    }
342
343    public function test_style_inheritance2()
344    {
345        global $phpbb_container, $phpbb_root_path, $phpEx;
346
347        // Style 5 inherits from 4, but both have a bbcode.html
348        $tests = array(
349            4 => '<b>bold</b>',
350            5 => '<b class="barplus">bold</b>'
351        );
352
353        foreach ($tests as $style_id => $expected)
354        {
355            $lang_loader = new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx);
356            $lang = new \phpbb\language\language($lang_loader);
357            $user = new \phpbb\user($lang, '\phpbb\datetime');
358            $user->style = array('style_id' => $style_id);
359
360            $phpbb_container = new phpbb_mock_container_builder;
361            $phpbb_container->set('user', $user);
362
363            $this->get_test_case_helpers()->set_s9e_services($phpbb_container, __DIR__ . '/fixtures/style_inheritance.xml', __DIR__ . '/fixtures/styles/');
364
365            $renderer = $phpbb_container->get('text_formatter.renderer');
366            $this->assertSame(
367                $expected,
368                $renderer->render('<r><B><s>[b]</s>bold<e>[/b]</e></B></r>')
369            );
370        }
371    }
372
373    /**
374    * @testdox The constructor triggers a core.text_formatter_s9e_renderer_setup event
375    */
376    public function test_setup_event()
377    {
378        $container = $this->get_test_case_helpers()->set_s9e_services();
379        $dispatcher = $this->createMock('phpbb\\event\\dispatcher_interface');
380        $dispatcher
381            ->expects($this->once())
382            ->method('trigger_event')
383            ->with(
384                'core.text_formatter_s9e_renderer_setup',
385                $this->callback(array($this, 'setup_event_callback'))
386            )
387            ->will($this->returnArgument(1));
388
389        new \phpbb\textformatter\s9e\renderer(
390            $container->get('cache.driver'),
391            $container->getParameter('cache.dir'),
392            '_foo_renderer',
393            $container->get('text_formatter.s9e.factory'),
394            $dispatcher
395        );
396    }
397
398    public function setup_event_callback($vars)
399    {
400        return isset($vars['renderer'])
401            && $vars['renderer'] instanceof \phpbb\textformatter\s9e\renderer;
402    }
403
404    /**
405    * @testdox render() triggers a core.text_formatter_s9e_render_before and core.text_formatter_s9e_render_after events
406    */
407    public function test_render_event()
408    {
409        $container = $this->get_test_case_helpers()->set_s9e_services();
410        $dispatcher = $this->createMock('phpbb\\event\\dispatcher_interface');
411        $dispatcher
412            ->expects($this->any())
413            ->method('trigger_event')
414            ->will($this->returnArgument(1));
415
416        $renderer = new \phpbb\textformatter\s9e\renderer(
417            $container->get('cache.driver'),
418            $container->getParameter('cache.dir'),
419            '_foo_renderer',
420            $container->get('text_formatter.s9e.factory'),
421            $dispatcher
422        );
423
424        $matcher = $this->exactly(2);
425        $dispatcher
426            ->expects($matcher)
427            ->method('trigger_event')
428            ->willReturnCallback(function($event, $vars) use ($matcher) {
429                $callNr = $matcher->numberOfInvocations();
430                match($callNr) {
431                    1 => $this->assertEquals('core.text_formatter_s9e_render_before', $event),
432                    2 => $this->assertEquals('core.text_formatter_s9e_render_after', $event),
433                };
434                match($callNr) {
435                    1 => $this->assertTrue($this->render_before_event_callback($vars)),
436                    2 => $this->assertTrue($this->render_after_event_callback($vars)),
437                };
438                return $vars;
439            });
440        $renderer->render('<t>...</t>');
441    }
442
443    public function render_before_event_callback($vars)
444    {
445        return isset($vars['renderer'])
446            && $vars['renderer'] instanceof \phpbb\textformatter\s9e\renderer
447            && isset($vars['text'])
448            && $vars['text'] === '<t>...</t>';
449    }
450
451    public function render_after_event_callback($vars)
452    {
453        return isset($vars['html'])
454            && $vars['html'] === '...'
455            && isset($vars['renderer'])
456            && $vars['renderer'] instanceof \phpbb\textformatter\s9e\renderer;
457    }
458
459    public function test_get_renderer()
460    {
461        $container = $this->get_test_case_helpers()->set_s9e_services();
462        $renderer = $container->get('text_formatter.renderer');
463        $this->assertInstanceOf('s9e\\TextFormatter\\Renderer', $renderer->get_renderer());
464    }
465}