Completed
Pull Request — master (#40)
by Marko
116:46 queued 51:48
created

AbstractTemplateTest   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 290
Duplicated Lines 5.17 %

Coupling/Cohesion

Components 1
Dependencies 5

Importance

Changes 0
Metric Value
wmc 11
lcom 1
cbo 5
dl 15
loc 290
rs 10
c 0
b 0
f 0

12 Methods

Rating   Name   Duplication   Size   Complexity  
A setUp() 15 15 1
A testDefaultState() 0 4 1
A testRenderWithSimpleWidget() 0 21 1
A testRenderWithFullWidget() 0 72 1
A testRenderWithJQuery() 0 23 1
A testRenderWithRequireJs() 0 22 1
A testRenderWithNotAutoloadedWidget() 0 16 1
A testRenderWithDisableWidget() 0 7 1
renderTemplate() 0 1 ?
B getContext() 0 24 1
A assertTemplate() 0 4 1
A normalizeOutput() 0 12 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
3
/*
4
 * This file is part of the Ivory CKEditor package.
5
 *
6
 * (c) Eric GELOEN <[email protected]>
7
 *
8
 * For the full copyright and license information, please read the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace FOS\CKEditorBundle\Tests\Template;
13
14
use FOS\CKEditorBundle\Renderer\CKEditorRenderer;
15
use FOS\CKEditorBundle\Renderer\CKEditorRendererInterface;
16
use FOS\CKEditorBundle\Tests\AbstractTestCase;
17
use Ivory\JsonBuilder\JsonBuilder;
18
use Symfony\Component\Asset\Packages;
19
use Symfony\Component\DependencyInjection\ContainerInterface;
20
use Symfony\Component\Form\FormView;
21
use Symfony\Component\HttpFoundation\Request;
22
use Symfony\Component\HttpFoundation\RequestStack;
23
use Symfony\Component\Routing\RouterInterface;
24
use Symfony\Component\Templating\EngineInterface;
25
26
/**
27
 * @author GeLo <[email protected]>
28
 * @author Adam Misiorny <[email protected]>
29
 */
30
abstract class AbstractTemplateTest extends AbstractTestCase
31
{
32
    /**
33
     * @var CKEditorRenderer
34
     */
35
    protected $renderer;
36
37
    /**
38
     * @var ContainerInterface|\PHPUnit_Framework_MockObject_MockObject
39
     */
40
    private $container;
0 ignored issues
show
Unused Code introduced by
The property $container is not used and could be removed.

This check marks private properties in classes that are never used. Those properties can be removed.

Loading history...
41
42
    /**
43
     * @var Packages|\PHPUnit_Framework_MockObject_MockObject
44
     */
45
    private $packages;
46
47
    /**
48
     * @var RequestStack|\PHPUnit_Framework_MockObject_MockObject
49
     */
50
    private $requestStack;
51
52
    /**
53
     * @var RouterInterface|\PHPUnit_Framework_MockObject_MockObject
54
     */
55
    private $router;
56
57
    /**
58
     * @var EngineInterface|\PHPUnit_Framework_MockObject_MockObject
59
     */
60
    private $templating;
61
62
    /**
63
     * @var Request|\PHPUnit_Framework_MockObject_MockObject
64
     */
65
    private $request;
66
67
    /**
68
     * {@inheritdoc}
69
     */
70 View Code Duplication
    protected function setUp()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
71
    {
72
        $this->requestStack = $this->createMock(RequestStack::class);
73
        $this->request = $this->createMock(Request::class);
74
        $this->requestStack->expects($this->any())->method('getCurrentRequest')->will($this->returnValue($this->request));
75
        $this->router = $this->createMock(RouterInterface::class);
76
        $this->packages = $this->createMock(Packages::class);
77
        $this->packages
78
            ->expects($this->any())
79
            ->method('getUrl')
80
            ->will($this->returnArgument(0));
81
        $this->templating = $this->createMock(EngineInterface::class);
82
83
        $this->renderer = new CKEditorRenderer(new JsonBuilder(), $this->router, $this->packages, $this->requestStack, $this->templating);
84
    }
85
86
    public function testDefaultState()
87
    {
88
        $this->assertInstanceOf(CKEditorRendererInterface::class, $this->renderer);
89
    }
90
91
    public function testRenderWithSimpleWidget()
92
    {
93
        $expected = <<<'EOF'
94
<textarea >&lt;p&gt;value&lt;/p&gt;</textarea>
95
<script type="text/javascript">
96
    var CKEDITOR_BASEPATH = "base_path";
97
</script>
98
<script type="text/javascript" src="js_path"></script>
99
<script type="text/javascript">
100
    if (CKEDITOR.instances["id"]) {
101
        CKEDITOR.instances["id"].destroy(true);
102
        delete CKEDITOR.instances["id"];
103
    }
104
105
    CKEDITOR.replace("id", []);
106
</script>
107
108
EOF;
109
110
        $this->assertTemplate($expected, $this->getContext());
111
    }
112
113
    public function testRenderWithFullWidget()
114
    {
115
        $context = [
116
            'auto_inline' => false,
117
            'inline' => true,
118
            'input_sync' => true,
119
            'config' => ['foo' => 'bar'],
120
            'plugins' => [
121
                'foo' => ['path' => 'path', 'filename' => 'filename'],
122
            ],
123
            'styles' => [
124
                'default' => [
125
                    ['name' => 'Blue Title', 'element' => 'h2', 'styles' => ['color' => 'Blue']],
126
                ],
127
            ],
128
            'templates' => [
129
                'foo' => [
130
                    'imagesPath' => 'path',
131
                    'templates' => [
132
                        [
133
                            'title' => 'My Template',
134
                            'html' => '<h1>Template</h1>',
135
                        ],
136
                    ],
137
                ],
138
            ],
139
        ];
140
141
        $expected = <<<EOF
142
<textarea >&lt;p&gt;value&lt;/p&gt;</textarea>
143
<script type="text/javascript">
144
    var CKEDITOR_BASEPATH = "base_path";
145
</script>
146
<script type="text/javascript" src="js_path"></script>
147
<script type="text/javascript">
148
    if (CKEDITOR.instances["id"]) {
149
        CKEDITOR.instances["id"].destroy(true);
150
        delete CKEDITOR.instances["id"];
151
    }
152
153
    CKEDITOR.plugins.addExternal("foo", "path", "filename");
154
155
    if (CKEDITOR.stylesSet.get("default") === null) {
156
        CKEDITOR.stylesSet.add("default", [{
157
            "name": "Blue Title",
158
            "element": "h2",
159
            "styles": {
160
                "color": "Blue"
161
            }
162
        }]);
163
    }
164
165
    CKEDITOR.addTemplates("foo", {
166
        "imagesPath": "path",
167
        "templates": [{
168
            "title": "My Template",
169
            "html": "<h1>Template<\/h1>"
170
        }]
171
    });
172
173
    CKEDITOR.disableAutoInline = true;
174
175
    var ivory_ckeditor_id = CKEDITOR.inline("id", {"foo": "bar"});
176
177
    ivory_ckeditor_id.on('change', function() {
178
        ivory_ckeditor_id.updateElement();
179
    });
180
</script>
181
EOF;
182
183
        $this->assertTemplate($expected, array_merge($this->getContext(), $context));
184
    }
185
186
    public function testRenderWithJQuery()
187
    {
188
        $expected = <<<'EOF'
189
<textarea >&lt;p&gt;value&lt;/p&gt;</textarea>
190
<script type="text/javascript">
191
    var CKEDITOR_BASEPATH = "base_path";
192
</script>
193
<script type="text/javascript" src="js_path"></script>
194
<script type="text/javascript" src="jquery_path"></script>
195
<script type="text/javascript">
196
    $(function () {
197
        if (CKEDITOR.instances["id"]) {
198
            CKEDITOR.instances["id"].destroy(true);
199
            delete CKEDITOR.instances["id"];
200
        }
201
202
        CKEDITOR.replace("id", []);
203
    });
204
</script>
205
EOF;
206
207
        $this->assertTemplate($expected, array_merge($this->getContext(), ['jquery' => true]));
208
    }
209
210
    public function testRenderWithRequireJs()
211
    {
212
        $expected = <<<'EOF'
213
<textarea >&lt;p&gt;value&lt;/p&gt;</textarea>
214
<script type="text/javascript">
215
    var CKEDITOR_BASEPATH = "base_path";
216
</script>
217
<script type="text/javascript" src="js_path"></script>
218
<script type="text/javascript">
219
    require(['ckeditor'], function() {
220
        if (CKEDITOR.instances["id"]) {
221
            CKEDITOR.instances["id"].destroy(true);
222
            delete CKEDITOR.instances["id"];
223
        }
224
225
        CKEDITOR.replace("id", []);
226
    });
227
</script>
228
EOF;
229
230
        $this->assertTemplate($expected, array_merge($this->getContext(), ['require_js' => true]));
231
    }
232
233
    public function testRenderWithNotAutoloadedWidget()
234
    {
235
        $expected = <<<'EOF'
236
<textarea >&lt;p&gt;value&lt;/p&gt;</textarea>
237
<script type="text/javascript">
238
    if (CKEDITOR.instances["id"]) {
239
        CKEDITOR.instances["id"].destroy(true);
240
        delete CKEDITOR.instances["id"];
241
    }
242
243
    CKEDITOR.replace("id", []);
244
</script>
245
EOF;
246
247
        $this->assertTemplate($expected, array_merge($this->getContext(), ['autoload' => false]));
248
    }
249
250
    public function testRenderWithDisableWidget()
251
    {
252
        $this->assertTemplate(
253
            '<textarea >&lt;p&gt;value&lt;/p&gt;</textarea>',
254
            array_merge($this->getContext(), ['enable' => false])
255
        );
256
    }
257
258
    /**
259
     * @param array $context
260
     *
261
     * @return string
262
     */
263
    abstract protected function renderTemplate(array $context = []);
264
265
    /**
266
     * @return array
267
     */
268
    private function getContext()
269
    {
270
        return [
271
            'form' => $this->createMock(FormView::class),
272
            'id' => 'id',
273
            'value' => '<p>value</p>',
274
            'enable' => true,
275
            'async' => false,
276
            'autoload' => true,
277
            'auto_inline' => true,
278
            'inline' => false,
279
            'jquery' => false,
280
            'input_sync' => false,
281
            'require_js' => false,
282
            'base_path' => 'base_path',
283
            'js_path' => 'js_path',
284
            'jquery_path' => 'jquery_path',
285
            'filebrowsers' => [],
286
            'config' => [],
287
            'plugins' => [],
288
            'styles' => [],
289
            'templates' => [],
290
        ];
291
    }
292
293
    /**
294
     * @param string $expected
295
     * @param array  $context
296
     */
297
    private function assertTemplate($expected, array $context)
298
    {
299
        $this->assertSame($this->normalizeOutput($expected), $this->normalizeOutput($this->renderTemplate($context)));
300
    }
301
302
    /**
303
     * @param string $output
304
     *
305
     * @return string
306
     */
307
    private function normalizeOutput($output)
308
    {
309
        $mapping = [
310
            "\n" => '',
311
            '  ' => '',
312
            '{ ' => '{',
313
            ': ' => ':',
314
            '; ' => ';',
315
        ];
316
317
        return str_replace(array_keys($mapping), array_values($mapping), $output);
318
    }
319
}
320