Completed
Push — 3.x ( a8d0da...6f21ce )
by Oskar
03:13 queued 15s
created

SonataAdminExtensionTest::testLoadIntlTemplate()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 8
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Sonata Project package.
7
 *
8
 * (c) Thomas Rabaix <[email protected]>
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Sonata\AdminBundle\Tests\DependencyInjection;
15
16
use Matthias\SymfonyDependencyInjectionTest\PhpUnit\AbstractExtensionTestCase;
17
use Sonata\AdminBundle\Admin\AdminHelper;
18
use Sonata\AdminBundle\Admin\BreadcrumbsBuilder;
19
use Sonata\AdminBundle\Admin\BreadcrumbsBuilderInterface;
20
use Sonata\AdminBundle\Admin\Pool;
21
use Sonata\AdminBundle\Bridge\Exporter\AdminExporter;
22
use Sonata\AdminBundle\DependencyInjection\SonataAdminExtension;
23
use Sonata\AdminBundle\Event\AdminEventExtension;
24
use Sonata\AdminBundle\Filter\FilterFactory;
25
use Sonata\AdminBundle\Filter\FilterFactoryInterface;
26
use Sonata\AdminBundle\Filter\Persister\FilterPersisterInterface;
27
use Sonata\AdminBundle\Filter\Persister\SessionFilterPersister;
28
use Sonata\AdminBundle\Model\AuditManager;
29
use Sonata\AdminBundle\Model\AuditManagerInterface;
30
use Sonata\AdminBundle\Route\AdminPoolLoader;
31
use Sonata\AdminBundle\Search\SearchHandler;
32
use Sonata\AdminBundle\Templating\MutableTemplateRegistryInterface;
33
use Sonata\AdminBundle\Templating\TemplateRegistry;
34
use Sonata\AdminBundle\Translator\BCLabelTranslatorStrategy;
35
use Sonata\AdminBundle\Translator\FormLabelTranslatorStrategy;
36
use Sonata\AdminBundle\Translator\LabelTranslatorStrategyInterface;
37
use Sonata\AdminBundle\Translator\NativeLabelTranslatorStrategy;
38
use Sonata\AdminBundle\Translator\NoopLabelTranslatorStrategy;
39
use Sonata\AdminBundle\Translator\UnderscoreLabelTranslatorStrategy;
40
use Sonata\AdminBundle\Twig\GlobalVariables;
41
42
class SonataAdminExtensionTest extends AbstractExtensionTestCase
43
{
44
    /**
45
     * @var string[]
46
     */
47
    private $defaultStylesheets = [];
48
49
    /**
50
     * @var string[]
51
     */
52
    private $defaultJavascripts = [];
53
54
    protected function setUp(): void
55
    {
56
        parent::setUp();
57
        $this->container->setParameter('kernel.bundles', []);
58
        $this->load();
59
        $this->defaultStylesheets = $this->container
60
            ->getDefinition('sonata.admin.pool')->getArgument(3)['stylesheets']
61
        ;
62
        $this->defaultJavascripts = $this->container
63
            ->getDefinition('sonata.admin.pool')->getArgument(3)['javascripts']
64
        ;
65
    }
66
67
    public function testHasCoreServicesAlias(): void
68
    {
69
        $this->assertContainerBuilderHasService(Pool::class);
70
        $this->assertContainerBuilderHasService(AdminPoolLoader::class);
71
        $this->assertContainerBuilderHasService(AdminHelper::class);
72
        $this->assertContainerBuilderHasService(FilterFactory::class);
73
        $this->assertContainerBuilderHasService(
74
            FilterFactoryInterface::class,
75
            FilterFactory::class
76
        );
77
        $this->assertContainerBuilderHasService(BreadcrumbsBuilder::class);
78
        $this->assertContainerBuilderHasService(
79
            BreadcrumbsBuilderInterface::class,
80
            BreadcrumbsBuilder::class
81
        );
82
        $this->assertContainerBuilderHasService(BCLabelTranslatorStrategy::class);
83
        $this->assertContainerBuilderHasService(NativeLabelTranslatorStrategy::class);
84
        $this->assertContainerBuilderHasService(
85
            LabelTranslatorStrategyInterface::class,
86
            NativeLabelTranslatorStrategy::class
87
        );
88
        $this->assertContainerBuilderHasService(NoopLabelTranslatorStrategy::class);
89
        $this->assertContainerBuilderHasService(UnderscoreLabelTranslatorStrategy::class);
90
        $this->assertContainerBuilderHasService(FormLabelTranslatorStrategy::class);
91
        $this->assertContainerBuilderHasService(AuditManager::class);
92
        $this->assertContainerBuilderHasService(AuditManagerInterface::class, AuditManager::class);
93
        $this->assertContainerBuilderHasService(SearchHandler::class);
94
        $this->assertContainerBuilderHasService(AdminEventExtension::class);
95
        $this->assertContainerBuilderHasService(GlobalVariables::class);
96
        $this->assertContainerBuilderHasService(SessionFilterPersister::class);
97
        $this->assertContainerBuilderHasService(
98
            FilterPersisterInterface::class,
99
            SessionFilterPersister::class
100
        );
101
        $this->assertContainerBuilderHasService(TemplateRegistry::class);
102
        $this->assertContainerBuilderHasService(
103
            MutableTemplateRegistryInterface::class,
104
            TemplateRegistry::class
105
        );
106
    }
107
108
    /**
109
     * @doesNotPerformAssertions
110
     * @group legacy
111
     */
112
    public function testContainerCompileWithJMSDiExtraBundle(): void
113
    {
114
        $this->markTestSkipped();
115
        $this->container->setParameter('kernel.bundles', [
116
            'JMSDiExtraBundle' => true,
117
        ]);
118
119
        $this->container->compile();
120
    }
121
122
    public function testHasServiceDefinitionForLockExtension(): void
123
    {
124
        $this->container->setParameter('kernel.bundles', []);
125
        $this->load(['options' => ['lock_protection' => true]]);
126
        $this->assertContainerBuilderHasService('sonata.admin.lock.extension');
127
    }
128
129
    public function testNotHasServiceDefinitionForLockExtension(): void
130
    {
131
        $this->container->setParameter('kernel.bundles', []);
132
        $this->load(['options' => ['lock_protection' => false]]);
133
        $this->assertContainerBuilderNotHasService('sonata.admin.lock.extension');
134
    }
135
136
    public function testLoadsExporterServiceDefinitionWhenExporterBundleIsRegistered(): void
137
    {
138
        $this->container->setParameter('kernel.bundles', ['SonataExporterBundle' => 'whatever']);
139
        $this->load();
140
        $this->assertContainerBuilderHasService(
141
            'sonata.admin.admin_exporter',
142
            AdminExporter::class
143
        );
144
    }
145
146
    public function testHasSecurityRoleParameters(): void
147
    {
148
        $this->container->setParameter('kernel.bundles', []);
149
        $this->load();
150
151
        $this->assertContainerBuilderHasParameter('sonata.admin.configuration.security.role_admin');
152
        $this->assertContainerBuilderHasParameter('sonata.admin.configuration.security.role_super_admin');
153
    }
154
155
    public function testHasDefaultServiceParameters(): void
156
    {
157
        $this->container->setParameter('kernel.bundles', []);
158
        $this->load();
159
160
        $this->assertContainerBuilderHasParameter('sonata.admin.configuration.default_group');
161
        $this->assertContainerBuilderHasParameter('sonata.admin.configuration.default_label_catalogue');
162
        $this->assertContainerBuilderHasParameter('sonata.admin.configuration.default_icon');
163
    }
164
165
    public function testExtraStylesheetsGetAdded(): void
166
    {
167
        $this->container->setParameter('kernel.bundles', []);
168
        $extraStylesheets = ['foo/bar.css', 'bar/quux.css'];
169
        $this->load([
170
            'assets' => [
171
                'extra_stylesheets' => $extraStylesheets,
172
            ],
173
        ]);
174
        $stylesheets = $this->container->getDefinition('sonata.admin.pool')->getArgument(3)['stylesheets'];
175
176
        $this->assertSame(array_merge($this->defaultStylesheets, $extraStylesheets), $stylesheets);
177
    }
178
179
    public function testRemoveStylesheetsGetRemoved(): void
180
    {
181
        $this->container->setParameter('kernel.bundles', []);
182
        $removeStylesheets = [
183
            'bundles/sonataadmin/vendor/admin-lte/dist/css/skins/skin-black.min.css',
184
            'bundles/sonataadmin/vendor/jqueryui/themes/base/jquery-ui.css',
185
        ];
186
        $this->load([
187
            'assets' => [
188
                'remove_stylesheets' => $removeStylesheets,
189
            ],
190
        ]);
191
        $stylesheets = $this->container->getDefinition('sonata.admin.pool')->getArgument(3)['stylesheets'];
192
193
        $this->assertSame(array_values(array_diff($this->defaultStylesheets, $removeStylesheets)), $stylesheets);
194
    }
195
196
    public function testExtraJavascriptsGetAdded(): void
197
    {
198
        $this->container->setParameter('kernel.bundles', []);
199
        $extraJavascripts = ['foo/bar.js', 'bar/quux.js'];
200
        $this->load([
201
            'assets' => [
202
                'extra_javascripts' => $extraJavascripts,
203
            ],
204
        ]);
205
        $javascripts = $this->container->getDefinition('sonata.admin.pool')->getArgument(3)['javascripts'];
206
207
        $this->assertSame(array_merge($this->defaultJavascripts, $extraJavascripts), $javascripts);
208
    }
209
210
    public function testRemoveJavascriptsGetRemoved(): void
211
    {
212
        $this->container->setParameter('kernel.bundles', []);
213
        $removeJavascripts = [
214
            'bundles/sonataadmin/vendor/readmore-js/readmore.min.js',
215
            'bundles/sonataadmin/jquery/jquery.confirmExit.js',
216
        ];
217
        $this->load([
218
            'assets' => [
219
                'remove_javascripts' => $removeJavascripts,
220
            ],
221
        ]);
222
        $javascripts = $this->container->getDefinition('sonata.admin.pool')->getArgument(3)['javascripts'];
223
224
        $this->assertSame(array_values(array_diff($this->defaultJavascripts, $removeJavascripts)), $javascripts);
225
    }
226
227
    public function testAssetsCanBeAddedAndRemoved(): void
228
    {
229
        $this->container->setParameter('kernel.bundles', []);
230
        $extraStylesheets = ['foo/bar.css', 'bar/quux.css'];
231
        $extraJavascripts = ['foo/bar.js', 'bar/quux.js'];
232
        $removeStylesheets = [
233
            'bundles/sonataadmin/vendor/admin-lte/dist/css/skins/skin-black.min.css',
234
            'bundles/sonataadmin/vendor/jqueryui/themes/base/jquery-ui.css',
235
        ];
236
        $removeJavascripts = [
237
            'bundles/sonataadmin/vendor/readmore-js/readmore.min.js',
238
            'bundles/sonataadmin/jquery/jquery.confirmExit.js',
239
        ];
240
        $this->load([
241
            'assets' => [
242
                'extra_stylesheets' => $extraStylesheets,
243
                'remove_stylesheets' => $removeStylesheets,
244
                'extra_javascripts' => $extraJavascripts,
245
                'remove_javascripts' => $removeJavascripts,
246
            ],
247
        ]);
248
        $stylesheets = $this->container
249
            ->getDefinition('sonata.admin.pool')->getArgument(3)['stylesheets']
250
        ;
251
252
        $this->assertSame(
253
            array_merge(array_diff($this->defaultStylesheets, $removeStylesheets), $extraStylesheets),
254
            $stylesheets
255
        );
256
257
        $javascripts = $this->container->getDefinition('sonata.admin.pool')->getArgument(3)['javascripts'];
258
259
        $this->assertSame(
260
            array_merge(array_diff($this->defaultJavascripts, $removeJavascripts), $extraJavascripts),
261
            $javascripts
262
        );
263
    }
264
265
    public function testDefaultTemplates(): void
266
    {
267
        $this->assertSame([
268
            'user_block' => '@SonataAdmin/Core/user_block.html.twig',
269
            'add_block' => '@SonataAdmin/Core/add_block.html.twig',
270
            'layout' => '@SonataAdmin/standard_layout.html.twig',
271
            'ajax' => '@SonataAdmin/ajax_layout.html.twig',
272
            'dashboard' => '@SonataAdmin/Core/dashboard.html.twig',
273
            'search' => '@SonataAdmin/Core/search.html.twig',
274
            'list' => '@SonataAdmin/CRUD/list.html.twig',
275
            'filter' => '@SonataAdmin/Form/filter_admin_fields.html.twig',
276
            'show' => '@SonataAdmin/CRUD/show.html.twig',
277
            'show_compare' => '@SonataAdmin/CRUD/show_compare.html.twig',
278
            'edit' => '@SonataAdmin/CRUD/edit.html.twig',
279
            'preview' => '@SonataAdmin/CRUD/preview.html.twig',
280
            'history' => '@SonataAdmin/CRUD/history.html.twig',
281
            'acl' => '@SonataAdmin/CRUD/acl.html.twig',
282
            'history_revision_timestamp' => '@SonataAdmin/CRUD/history_revision_timestamp.html.twig',
283
            'action' => '@SonataAdmin/CRUD/action.html.twig',
284
            'select' => '@SonataAdmin/CRUD/list__select.html.twig',
285
            'list_block' => '@SonataAdmin/Block/block_admin_list.html.twig',
286
            'search_result_block' => '@SonataAdmin/Block/block_search_result.html.twig',
287
            'short_object_description' => '@SonataAdmin/Helper/short-object-description.html.twig',
288
            'delete' => '@SonataAdmin/CRUD/delete.html.twig',
289
            'batch' => '@SonataAdmin/CRUD/list__batch.html.twig',
290
            'batch_confirmation' => '@SonataAdmin/CRUD/batch_confirmation.html.twig',
291
            'inner_list_row' => '@SonataAdmin/CRUD/list_inner_row.html.twig',
292
            'outer_list_rows_mosaic' => '@SonataAdmin/CRUD/list_outer_rows_mosaic.html.twig',
293
            'outer_list_rows_list' => '@SonataAdmin/CRUD/list_outer_rows_list.html.twig',
294
            'outer_list_rows_tree' => '@SonataAdmin/CRUD/list_outer_rows_tree.html.twig',
295
            'base_list_field' => '@SonataAdmin/CRUD/base_list_field.html.twig',
296
            'pager_links' => '@SonataAdmin/Pager/links.html.twig',
297
            'pager_results' => '@SonataAdmin/Pager/results.html.twig',
298
            'tab_menu_template' => '@SonataAdmin/Core/tab_menu_template.html.twig',
299
            'knp_menu_template' => '@SonataAdmin/Menu/sonata_menu.html.twig',
300
            'action_create' => '@SonataAdmin/CRUD/dashboard__action_create.html.twig',
301
            'button_acl' => '@SonataAdmin/Button/acl_button.html.twig',
302
            'button_create' => '@SonataAdmin/Button/create_button.html.twig',
303
            'button_edit' => '@SonataAdmin/Button/edit_button.html.twig',
304
            'button_history' => '@SonataAdmin/Button/history_button.html.twig',
305
            'button_list' => '@SonataAdmin/Button/list_button.html.twig',
306
            'button_show' => '@SonataAdmin/Button/show_button.html.twig',
307
        ], $this->container->getParameter('sonata.admin.configuration.templates'));
308
    }
309
310
    public function testLoadIntlTemplate(): void
311
    {
312
        $bundlesWithSonataIntlBundle = array_merge($this->container->getParameter('kernel.bundles'), ['SonataIntlBundle' => true]);
313
        $this->container->setParameter('kernel.bundles', $bundlesWithSonataIntlBundle);
314
        $this->load();
315
        $templates = $this->container->getParameter('sonata.admin.configuration.templates');
316
        $this->assertSame('@SonataIntl/CRUD/history_revision_timestamp.html.twig', $templates['history_revision_timestamp']);
317
    }
318
319
    protected function getContainerExtensions(): array
320
    {
321
        return [new SonataAdminExtension()];
322
    }
323
}
324