Completed
Push — 3.x ( f37b5a...b37d45 )
by Christian
26:43
created

AddDependencyCallsCompilerPassTest::getContainer()   B

Complexity

Conditions 2
Paths 2

Size

Total Lines 152

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 152
rs 8
c 0
b 0
f 0
cc 2
nc 2
nop 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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\Compiler;
15
16
use Knp\Menu\Matcher\MatcherInterface;
17
use Knp\Menu\Provider\MenuProviderInterface;
18
use Knp\Menu\Silex\RouterAwareFactory;
19
use PHPUnit\Framework\TestCase;
20
use Sonata\AdminBundle\Controller\CRUDController;
21
use Sonata\AdminBundle\DependencyInjection\Compiler\AddDependencyCallsCompilerPass;
22
use Sonata\AdminBundle\DependencyInjection\SonataAdminExtension;
23
use Sonata\AdminBundle\Route\RoutesCache;
24
use Sonata\BlockBundle\DependencyInjection\SonataBlockExtension;
25
use Sonata\DoctrinePHPCRAdminBundle\Route\PathInfoBuilderSlashes;
26
use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface;
27
use Symfony\Bundle\FrameworkBundle\Translation\Translator;
28
use Symfony\Bundle\FrameworkBundle\Translation\TranslatorInterface;
29
use Symfony\Bundle\FrameworkBundle\Validator\Validator;
30
use Symfony\Component\Config\FileLocatorInterface;
31
use Symfony\Component\DependencyInjection\ChildDefinition;
32
use Symfony\Component\DependencyInjection\ContainerBuilder;
33
use Symfony\Component\DependencyInjection\Definition;
34
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
35
use Symfony\Component\Form\FormFactoryInterface;
36
use Symfony\Component\HttpFoundation\RequestStack;
37
use Symfony\Component\HttpFoundation\Session\Session;
38
use Symfony\Component\HttpKernel\KernelInterface;
39
use Symfony\Component\PropertyAccess\PropertyAccessor;
40
use Symfony\Component\Routing\RouterInterface;
41
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
42
use Symfony\Component\Validator\ContainerConstraintValidatorFactory;
43
44
/**
45
 * @author Tiago Garcia
46
 */
47
class AddDependencyCallsCompilerPassTest extends TestCase
48
{
49
    /** @var SonataAdminExtension $extension */
50
    private $extension;
51
52
    /** @var array $config */
53
    private $config;
54
55
    public function setUp(): void
56
    {
57
        parent::setUp();
58
59
        $this->extension = new SonataAdminExtension();
60
        $this->config = $this->getConfig();
61
    }
62
63
    public function testTranslatorDisabled(): void
64
    {
65
        $this->expectException(\RuntimeException::class);
66
        $this->expectExceptionMessage(
67
            'The "translator" service is not yet enabled.
68
                It\'s required by SonataAdmin to display all labels properly.
69
70
                To learn how to enable the translator service please visit:
71
                http://symfony.com/doc/current/translation.html#configuration
72
            '
73
        );
74
75
        $container = $this->getContainer();
76
        $container->removeAlias('translator');
77
        $container->removeDefinition('translator');
78
        $this->extension->load([$this->config], $container);
79
80
        $compilerPass = new AddDependencyCallsCompilerPass();
81
        $compilerPass->process($container);
82
        $container->compile();
83
    }
84
85
    /**
86
     * @covers \Sonata\AdminBundle\DependencyInjection\Compiler\AddDependencyCallsCompilerPass::process
87
     */
88
    public function testProcessParsingFullValidConfig(): void
89
    {
90
        $container = $this->getContainer();
91
        $this->extension->load([$this->config], $container);
92
93
        $compilerPass = new AddDependencyCallsCompilerPass();
94
        $compilerPass->process($container);
95
        $container->compile();
96
97
        $this->assertTrue($container->hasParameter('sonata.admin.configuration.dashboard_groups'));
98
99
        $dashboardGroupsSettings = $container->getParameter('sonata.admin.configuration.dashboard_groups');
100
101
        $this->assertArrayHasKey('sonata_group_one', $dashboardGroupsSettings);
102
103
        $this->assertArrayHasKey('label', $dashboardGroupsSettings['sonata_group_one']);
104
        $this->assertArrayHasKey('label_catalogue', $dashboardGroupsSettings['sonata_group_one']);
105
        $this->assertArrayHasKey('items', $dashboardGroupsSettings['sonata_group_one']);
106
        $this->assertArrayHasKey('item_adds', $dashboardGroupsSettings['sonata_group_one']);
107
        $this->assertArrayHasKey('roles', $dashboardGroupsSettings['sonata_group_one']);
108
        $this->assertSame('Group One Label', $dashboardGroupsSettings['sonata_group_one']['label']);
109
        $this->assertSame('SonataAdminBundle', $dashboardGroupsSettings['sonata_group_one']['label_catalogue']);
110
        $this->assertFalse($dashboardGroupsSettings['sonata_group_one']['on_top']);
111
        $this->assertTrue($dashboardGroupsSettings['sonata_group_three']['on_top']);
112
        $this->assertFalse($dashboardGroupsSettings['sonata_group_one']['keep_open']);
113
        $this->assertArrayHasKey('admin', $dashboardGroupsSettings['sonata_group_one']['items'][0]);
114
        $this->assertArrayHasKey('route', $dashboardGroupsSettings['sonata_group_one']['items'][0]);
115
        $this->assertArrayHasKey('label', $dashboardGroupsSettings['sonata_group_one']['items'][0]);
116
        $this->assertArrayHasKey('route_params', $dashboardGroupsSettings['sonata_group_one']['items'][0]);
117
        $this->assertContains('sonata_post_admin', $dashboardGroupsSettings['sonata_group_one']['items'][0]);
118
        $this->assertArrayHasKey('admin', $dashboardGroupsSettings['sonata_group_one']['items'][1]);
119
        $this->assertArrayHasKey('route', $dashboardGroupsSettings['sonata_group_one']['items'][1]);
120
        $this->assertArrayHasKey('label', $dashboardGroupsSettings['sonata_group_one']['items'][1]);
121
        $this->assertArrayHasKey('route_params', $dashboardGroupsSettings['sonata_group_one']['items'][1]);
122
        $this->assertContains('blog_name', $dashboardGroupsSettings['sonata_group_one']['items'][1]);
123
        $this->assertContains('Blog', $dashboardGroupsSettings['sonata_group_one']['items'][1]);
124
        $this->assertSame('', $dashboardGroupsSettings['sonata_group_one']['items'][1]['admin']);
125
        $this->assertSame('blog_name', $dashboardGroupsSettings['sonata_group_one']['items'][1]['route']);
126
        $this->assertSame('Blog', $dashboardGroupsSettings['sonata_group_one']['items'][1]['label']);
127
        $this->assertSame([], $dashboardGroupsSettings['sonata_group_one']['items'][1]['route_params']);
128
        $this->assertArrayHasKey('admin', $dashboardGroupsSettings['sonata_group_one']['items'][2]);
129
        $this->assertArrayHasKey('route', $dashboardGroupsSettings['sonata_group_one']['items'][2]);
130
        $this->assertArrayHasKey('label', $dashboardGroupsSettings['sonata_group_one']['items'][2]);
131
        $this->assertArrayHasKey('route_params', $dashboardGroupsSettings['sonata_group_one']['items'][2]);
132
        $this->assertContains('blog_article', $dashboardGroupsSettings['sonata_group_one']['items'][2]);
133
        $this->assertContains('Article', $dashboardGroupsSettings['sonata_group_one']['items'][2]);
134
        $this->assertSame('', $dashboardGroupsSettings['sonata_group_one']['items'][2]['admin']);
135
        $this->assertSame('blog_article', $dashboardGroupsSettings['sonata_group_one']['items'][2]['route']);
136
        $this->assertSame('Article', $dashboardGroupsSettings['sonata_group_one']['items'][2]['label']);
137
        $this->assertSame(['articleId' => 3], $dashboardGroupsSettings['sonata_group_one']['items'][2]['route_params']);
138
        $this->assertContains('sonata_news_admin', $dashboardGroupsSettings['sonata_group_one']['item_adds']);
139
        $this->assertContains('ROLE_ONE', $dashboardGroupsSettings['sonata_group_one']['roles']);
140
141
        $this->assertArrayHasKey('sonata_group_two', $dashboardGroupsSettings);
142
        $this->assertArrayHasKey('provider', $dashboardGroupsSettings['sonata_group_two']);
143
        $this->assertContains('my_menu', $dashboardGroupsSettings['sonata_group_two']['provider']);
144
145
        $this->assertArrayHasKey('sonata_group_five', $dashboardGroupsSettings);
146
        $this->assertTrue($dashboardGroupsSettings['sonata_group_five']['keep_open']);
147
    }
148
149
    /**
150
     * @covers \Sonata\AdminBundle\DependencyInjection\Compiler\AddDependencyCallsCompilerPass::process
151
     */
152
    public function testProcessResultingConfig(): void
153
    {
154
        $container = $this->getContainer();
155
        $this->extension->load([$this->config], $container);
156
157
        $compilerPass = new AddDependencyCallsCompilerPass();
158
        $compilerPass->process($container);
159
        $container->compile();
160
161
        $this->assertTrue($container->hasDefinition('sonata.admin.pool'));
162
        $this->assertTrue($container->hasDefinition('sonata_post_admin'));
163
        $this->assertTrue($container->hasDefinition('sonata_article_admin'));
164
        $this->assertTrue($container->hasDefinition('sonata_news_admin'));
165
166
        $pool = $container->get('sonata.admin.pool');
167
        $adminServiceIds = $pool->getAdminServiceIds();
168
        $adminGroups = $pool->getAdminGroups();
169
        $adminClasses = $pool->getAdminClasses();
170
171
        $this->assertContains('sonata_post_admin', $adminServiceIds);
172
        $this->assertContains('sonata_article_admin', $adminServiceIds);
173
        $this->assertContains('sonata_news_admin', $adminServiceIds);
174
175
        $this->assertArrayHasKey('sonata_group_one', $adminGroups);
176
        $this->assertArrayHasKey('label', $adminGroups['sonata_group_one']);
177
        $this->assertArrayHasKey('label_catalogue', $adminGroups['sonata_group_one']);
178
        $this->assertArrayHasKey('items', $adminGroups['sonata_group_one']);
179
        $this->assertArrayHasKey('item_adds', $adminGroups['sonata_group_one']);
180
        $this->assertArrayHasKey('roles', $adminGroups['sonata_group_one']);
181
        $this->assertSame('Group One Label', $adminGroups['sonata_group_one']['label']);
182
        $this->assertSame('SonataAdminBundle', $adminGroups['sonata_group_one']['label_catalogue']);
183
        $this->assertFalse($adminGroups['sonata_group_one']['on_top']);
184
        $this->assertTrue($adminGroups['sonata_group_three']['on_top']);
185
        $this->assertFalse($adminGroups['sonata_group_one']['keep_open']);
186
        $this->assertContains('sonata_post_admin', $adminGroups['sonata_group_one']['items'][0]['admin']);
187
        $this->assertContains('sonata_news_admin', $adminGroups['sonata_group_one']['items']);
188
        $this->assertContains('sonata_news_admin', $adminGroups['sonata_group_one']['item_adds']);
189
        $this->assertNotContains('sonata_article_admin', $adminGroups['sonata_group_one']['items']);
190
        $this->assertContains('ROLE_ONE', $adminGroups['sonata_group_one']['roles']);
191
192
        $this->assertArrayHasKey('sonata_group_two', $adminGroups);
193
        $this->assertArrayHasKey('provider', $adminGroups['sonata_group_two']);
194
        $this->assertContains('my_menu', $adminGroups['sonata_group_two']['provider']);
195
196
        $this->assertArrayHasKey('sonata_group_five', $adminGroups);
197
        $this->assertTrue($adminGroups['sonata_group_five']['keep_open']);
198
199
        $this->assertArrayHasKey(Post::class, $adminClasses);
200
        $this->assertContains('sonata_post_admin', $adminClasses[Post::class]);
201
        $this->assertArrayHasKey(Article::class, $adminClasses);
202
        $this->assertContains('sonata_article_admin', $adminClasses[Article::class]);
203
        $this->assertArrayHasKey(News::class, $adminClasses);
204
        $this->assertContains('sonata_news_admin', $adminClasses[News::class]);
205
        $newsRouteBuilderMethodCall = current(array_filter(
206
            $container->getDefinition('sonata_news_admin')->getMethodCalls(),
207
            static function ($element) {
208
                return 'setRouteBuilder' === $element[0];
209
            }
210
        ));
211
        $this->assertSame(
212
            'sonata.admin.route.path_info',
213
            (string) $newsRouteBuilderMethodCall[1][0],
214
            'The news admin uses the orm, and should therefore use the path_info router.'
215
        );
216
        $articleRouteBuilderMethodCall = current(array_filter(
217
            $container->getDefinition('sonata_article_admin')->getMethodCalls(),
218
            static function ($element) {
219
                return 'setRouteBuilder' === $element[0];
220
            }
221
        ));
222
        $definitionOrReference = $articleRouteBuilderMethodCall[1][0];
223
        if ($definitionOrReference instanceof Definition) {
224
            $this->assertSame(
225
                PathInfoBuilderSlashes::class,
226
                $articleRouteBuilderMethodCall[1][0]->getClass(),
227
                'The article admin uses the odm, and should therefore use the path_info_slashes router.'
228
            );
229
        } else {
230
            $this->assertSame(
231
                'sonata.admin.route.path_info_slashes',
232
                (string) $articleRouteBuilderMethodCall[1][0],
233
                'The article admin uses the odm, and should therefore use the path_info_slashes router.'
234
            );
235
        }
236
    }
237
238
    public function testProcessSortAdmins(): void
239
    {
240
        $container = $this->getContainer();
241
242
        $config = $this->config;
243
        $config['options']['sort_admins'] = true;
244
        unset($config['dashboard']['groups']);
245
246
        $this->extension->load([$config], $container);
247
248
        $compilerPass = new AddDependencyCallsCompilerPass();
249
        $compilerPass->process($container);
250
        $container->compile();
251
252
        // use array_values to check groups position
253
        $adminGroups = array_values($container->get('sonata.admin.pool')->getAdminGroups());
254
255
        $this->assertSame('sonata_group_one', $adminGroups['0']['label'], 'second group in configuration, first in list');
256
        $this->assertSame('1 Entry', $adminGroups[0]['items'][0]['label'], 'second entry for group in configuration, first in list');
257
    }
258
259
    public function testProcessGroupNameAsParameter(): void
260
    {
261
        $config = [
262
            'dashboard' => [
263
                'groups' => [
264
                    '%sonata.admin.parameter.groupname%' => [],
265
                ],
266
            ],
267
        ];
268
269
        $container = $this->getContainer();
270
        $container->setParameter('sonata.admin.parameter.groupname', 'resolved_group_name');
271
272
        $this->extension->load([$config], $container);
273
274
        $compilerPass = new AddDependencyCallsCompilerPass();
275
        $compilerPass->process($container);
276
        $container->compile();
277
278
        $adminGroups = $container->get('sonata.admin.pool')->getAdminGroups();
279
280
        $this->assertArrayHasKey('resolved_group_name', $adminGroups);
281
        $this->assertArrayNotHasKey('%sonata.admin.parameter.groupname%', $adminGroups);
282
    }
283
284
    public function testApplyTemplatesConfiguration(): void
285
    {
286
        $container = $this->getContainer();
287
288
        $this->extension->load([$this->getConfig()], $container);
289
290
        $compilerPass = new AddDependencyCallsCompilerPass();
291
        $compilerPass->process($container);
292
293
        $callsPostAdmin = $container->getDefinition('sonata_post_admin')->getMethodCalls();
294
295
        foreach ($callsPostAdmin as $call) {
296
            list($name, $parameters) = $call;
297
298
            switch ($name) {
299
                case 'setTemplates':
300
                    $this->assertSame('foobar.twig.html', $parameters[0]['user_block']);
301
                    $this->assertSame('@SonataAdmin/Pager/results.html.twig', $parameters[0]['pager_results']);
302
                    $this->assertSame('@SonataAdmin/Button/create_button.html.twig', $parameters[0]['button_create']);
303
304
                    break;
305
306
                case 'setLabel':
307
                    $this->assertSame('-', $parameters[0]);
308
309
                    break;
310
311
                case 'setPagerType':
312
                    $this->assertSame('default', $parameters[0]);
313
314
                    break;
315
            }
316
        }
317
318
        $callsNewsAdmin = $container->getDefinition('sonata_news_admin')->getMethodCalls();
319
320
        foreach ($callsNewsAdmin as $call) {
321
            list($name, $parameters) = $call;
322
323
            switch ($name) {
324
                case 'setTemplates':
325
                    $this->assertSame('foo.twig.html', $parameters[0]['user_block']);
326
                    $this->assertSame('@SonataAdmin/Pager/simple_pager_results.html.twig', $parameters[0]['pager_results']);
327
328
                    break;
329
330
                case 'setLabel':
331
                    $this->assertSame('Foo', $parameters[0]);
332
333
                    break;
334
335
                case 'setPagerType':
336
                    $this->assertSame('simple', $parameters[0]);
337
338
                    break;
339
            }
340
        }
341
    }
342
343
    public function testApplyShowMosaicButtonConfiguration(): void
344
    {
345
        $container = $this->getContainer();
346
347
        $this->extension->load([$this->getConfig()], $container);
348
349
        $compilerPass = new AddDependencyCallsCompilerPass();
350
        $compilerPass->process($container);
351
352
        $callsReportOneAdmin = $container->getDefinition('sonata_report_one_admin')->getMethodCalls();
353
354
        foreach ($callsReportOneAdmin as $call) {
355
            list($name, $parameters) = $call;
356
357
            if ('showMosaicButton' === $name) {
358
                $this->assertFalse($parameters[0]);
359
            }
360
        }
361
362
        $callsReportTwoAdmin = $container->getDefinition('sonata_report_two_admin')->getMethodCalls();
363
364
        foreach ($callsReportTwoAdmin as $call) {
365
            list($name, $parameters) = $call;
366
367
            if ('showMosaicButton' === $name) {
368
                $this->assertTrue($parameters[0]);
369
            }
370
        }
371
    }
372
373
    public function testProcessMultipleOnTopOptions(): void
374
    {
375
        $container = $this->getContainer();
376
377
        $config = $this->config;
378
        $this->assertArrayHasKey('sonata_group_four', $config['dashboard']['groups']);
379
380
        $config['dashboard']['groups']['sonata_group_four']['items'][] = [
381
            'route' => 'blog_article',
382
            'label' => 'Article',
383
            'route_params' => ['articleId' => 3],
384
        ];
385
386
        $this->extension->load([$config], $container);
387
388
        $compilerPass = new AddDependencyCallsCompilerPass();
389
390
        $this->expectException(\RuntimeException::class);
391
        $this->expectExceptionMessage('You can\'t use "on_top" option with multiple same name groups.');
392
393
        $compilerPass->process($container);
394
    }
395
396
    public function testProcessMultipleOnTopOptionsAdditionalGroup(): void
397
    {
398
        $container = $this->getContainer();
399
400
        $config = $this->config;
401
        $config['dashboard']['groups']['sonata_group_five'] = [
402
            'label' => 'Group One Label',
403
            'label_catalogue' => 'SonataAdminBundle',
404
            'on_top' => true,
405
            'items' => [
406
                'sonata_post_admin',
407
                [
408
                    'route' => 'blog_name',
409
                    'label' => 'Blog',
410
                ],
411
                [
412
                    'route' => 'blog_article',
413
                    'label' => 'Article',
414
                    'route_params' => ['articleId' => 3],
415
                ],
416
            ],
417
            'item_adds' => [
418
                'sonata_news_admin',
419
            ],
420
            'roles' => ['ROLE_ONE'],
421
        ];
422
423
        $this->extension->load([$config], $container);
424
425
        $compilerPass = new AddDependencyCallsCompilerPass();
426
427
        $this->expectException(\RuntimeException::class);
428
        $this->expectExceptionMessage('You can\'t use "on_top" option with multiple same name groups.');
429
430
        $compilerPass->process($container);
431
    }
432
433
    public function testProcessMultipleOnTopOptionsInServiceDefinition(): void
434
    {
435
        $container = $this->getContainer();
436
437
        $config = $this->config;
438
        $config['dashboard']['groups'] = [];
439
440
        $this->extension->load([$config], $container);
441
442
        $compilerPass = new AddDependencyCallsCompilerPass();
443
        $container
444
            ->register('sonata_report_one_admin')
445
            ->setClass(MockAdmin::class)
446
            ->setArguments(['', ReportOne::class, CRUDController::class])
447
            ->addTag('sonata.admin', ['group' => 'sonata_report_group', 'manager_type' => 'orm', 'on_top' => true]);
448
449
        $this->expectException(\RuntimeException::class);
450
        $this->expectExceptionMessage('You can\'t use "on_top" option with multiple same name groups.');
451
452
        $compilerPass->process($container);
453
    }
454
455
    public function testProcessMultipleOnTopOptionsInServiceDefinition1(): void
456
    {
457
        $container = $this->getContainer();
458
459
        $config = $this->config;
460
        $config['dashboard']['groups'] = [];
461
462
        $this->extension->load([$config], $container);
463
464
        $compilerPass = new AddDependencyCallsCompilerPass();
465
        $container
466
            ->register('sonata_report_two_admin')
467
            ->setClass(MockAdmin::class)
468
            ->setArguments(['', ReportOne::class, CRUDController::class])
469
            ->addTag('sonata.admin', ['group' => 'sonata_report_group', 'manager_type' => 'orm', 'on_top' => false]);
470
471
        $this->expectException(\RuntimeException::class);
472
        $this->expectExceptionMessage('You can\'t use "on_top" option with multiple same name groups.');
473
474
        $compilerPass->process($container);
475
    }
476
477
    /**
478
     * @doesNotPerformAssertions
479
     */
480
    public function testProcessMultipleOnTopOptionsInServiceDefinition2(): void
481
    {
482
        $container = $this->getContainer();
483
484
        $config = $this->config;
485
        $config['dashboard']['groups'] = [];
486
487
        $this->extension->load([$config], $container);
488
489
        $compilerPass = new AddDependencyCallsCompilerPass();
490
        $container
491
            ->register('sonata_document_one_admin')
492
            ->setClass(MockAdmin::class)
493
            ->setArguments(['', ReportOne::class, CRUDController::class])
494
            ->addTag('sonata.admin', ['group' => 'sonata_document_group', 'manager_type' => 'orm', 'on_top' => false]);
495
        $container
496
            ->register('sonata_document_two_admin')
497
            ->setClass(MockAdmin::class)
498
            ->setArguments(['', ReportOne::class, CRUDController::class])
499
            ->addTag('sonata.admin', ['group' => 'sonata_document_group', 'manager_type' => 'orm', 'on_top' => false]);
500
501
        try {
502
            $compilerPass->process($container);
503
        } catch (\RuntimeException $e) {
504
            $this->fail('An expected exception has been raised.');
505
        }
506
    }
507
508
    public function testProcessAbstractAdminServiceInServiceDefinition(): void
509
    {
510
        $container = $this->getContainer();
511
512
        $config = $this->config;
513
        $config['dashboard']['groups'] = [];
514
515
        $this->extension->load([$config], $container);
516
517
        $compilerPass = new AddDependencyCallsCompilerPass();
518
        $container
519
            ->register('sonata_abstract_post_admin')
520
            ->setArguments(['', Post::class, ''])
521
            ->setAbstract(true);
522
523
        $adminDefinition = new ChildDefinition('sonata_abstract_post_admin');
524
        $adminDefinition
525
            ->setPublic(true)
526
            ->setClass(MockAbstractServiceAdmin::class)
527
            ->setArguments([0 => 'extra_argument_1'])
528
            ->addTag('sonata.admin', ['group' => 'sonata_post_one_group', 'manager_type' => 'orm']);
529
530
        $adminTwoDefinition = new ChildDefinition('sonata_abstract_post_admin');
531
        $adminTwoDefinition
532
            ->setPublic(true)
533
            ->setClass(MockAbstractServiceAdmin::class)
534
            ->setArguments([0 => 'extra_argument_2', 'index_0' => 'should_not_override'])
535
            ->addTag('sonata.admin', ['group' => 'sonata_post_two_group', 'manager_type' => 'orm']);
536
537
        $container->addDefinitions([
538
            'sonata_post_one_admin' => $adminDefinition,
539
            'sonata_post_two_admin' => $adminTwoDefinition,
540
        ]);
541
542
        $compilerPass->process($container);
543
        $container->compile();
544
545
        $pool = $container->get('sonata.admin.pool');
546
        $adminServiceIds = $pool->getAdminServiceIds();
547
548
        $this->assertContains('sonata_post_one_admin', $adminServiceIds);
549
        $this->assertContains('sonata_post_two_admin', $adminServiceIds);
550
551
        $this->assertTrue($container->hasDefinition('sonata_post_one_admin'));
552
        $this->assertTrue($container->hasDefinition('sonata_post_two_admin'));
553
554
        $definition = $container->getDefinition('sonata_post_one_admin');
555
        $this->assertSame('sonata_post_one_admin', $definition->getArgument(0));
556
        $this->assertSame(Post::class, $definition->getArgument(1));
557
        $this->assertSame(CRUDController::class, $definition->getArgument(2));
558
        $this->assertSame('extra_argument_1', $definition->getArgument(3));
559
560
        $definition = $container->getDefinition('sonata_post_two_admin');
561
        $this->assertSame('sonata_post_two_admin', $definition->getArgument(0));
562
        $this->assertSame(Post::class, $definition->getArgument(1));
563
        $this->assertSame(CRUDController::class, $definition->getArgument(2));
564
        $this->assertSame('extra_argument_2', $definition->getArgument(3));
565
    }
566
567
    /**
568
     * @return array
569
     */
570
    protected function getConfig()
571
    {
572
        return [
573
            'dashboard' => [
574
                'groups' => [
575
                    'sonata_group_one' => [
576
                        'label' => 'Group One Label',
577
                        'label_catalogue' => 'SonataAdminBundle',
578
                        'items' => [
579
                            'sonata_post_admin',
580
                            [
581
                                'route' => 'blog_name',
582
                                'label' => 'Blog',
583
                            ],
584
                            [
585
                                'route' => 'blog_article',
586
                                'label' => 'Article',
587
                                'route_params' => ['articleId' => 3],
588
                            ],
589
                        ],
590
                        'item_adds' => [
591
                            'sonata_news_admin',
592
                        ],
593
                        'roles' => ['ROLE_ONE'],
594
                    ],
595
                    'sonata_group_two' => [
596
                        'provider' => 'my_menu',
597
                    ],
598
                    'sonata_group_three' => [
599
                        'on_top' => true,
600
                    ],
601
                    'sonata_group_four' => [
602
                        'on_top' => true,
603
                        'label' => 'Group Four Label',
604
                        'label_catalogue' => 'SonataAdminBundle',
605
                        'items' => [
606
                            'sonata_post_admin',
607
                        ],
608
                    ],
609
                    'sonata_group_five' => [
610
                        'keep_open' => true,
611
                    ],
612
                ],
613
            ],
614
            'admin_services' => [
615
                'sonata_post_admin' => [
616
                    'templates' => [
617
                        'view' => ['user_block' => 'foobar.twig.html'],
618
                    ],
619
                ],
620
                'sonata_news_admin' => [
621
                    'label' => 'Foo',
622
                    'pager_type' => 'simple',
623
                    'templates' => [
624
                        'view' => ['user_block' => 'foo.twig.html'],
625
                    ],
626
                ],
627
            ],
628
        ];
629
    }
630
631
    private function getContainer(): ContainerBuilder
632
    {
633
        $container = new ContainerBuilder();
634
        $container->setParameter('kernel.bundles', [
635
            'SonataCoreBundle' => true,
636
            'KnpMenuBundle' => true,
637
        ]);
638
        $container->setParameter('kernel.cache_dir', '/tmp');
639
        $container->setParameter('kernel.debug', true);
640
641
        // Add dependencies for SonataAdminBundle (these services will never get called so dummy classes will do)
642
        $container
643
            ->register('twig')
644
            ->setClass(EngineInterface::class);
645
        $container
646
            ->register('templating')
647
            ->setClass(EngineInterface::class);
648
        $container
649
            ->register('translator')
650
            ->setClass(TranslatorInterface::class);
651
        $container
652
            ->register('validator')
653
            ->setClass(Validator::class);
654
        $container
655
            ->register('validator.validator_factory')
656
            ->setClass(ContainerConstraintValidatorFactory::class);
657
        $container
658
            ->register('router')
659
            ->setClass(RouterInterface::class);
660
        $container
661
            ->register('property_accessor')
662
            ->setClass(PropertyAccessor::class);
663
        $container
664
            ->register('form.factory')
665
            ->setClass(FormFactoryInterface::class);
666
        $container
667
            ->register('request_stack')
668
            ->setClass(RequestStack::class);
669
        $container
670
            ->register('session')
671
            ->setClass(Session::class);
672
        $container
673
            ->register('security.authorization_checker')
674
            ->setClass(AuthorizationCheckerInterface::class);
675
        foreach ([
676
            'doctrine_phpcr' => 'PHPCR',
677
            'orm' => 'ORM', ] as $key => $bundleSubstring) {
678
            $container
679
                ->register(sprintf('sonata.admin.manager.%s', $key))
680
                ->setClass(sprintf(
681
                    'Sonata\Doctrine%sAdminBundle\Model\ModelManager',
682
                    $bundleSubstring
683
                ));
684
            $container
685
                ->register(sprintf('sonata.admin.builder.%s_form', $key))
686
                ->setClass(sprintf(
687
                    'Sonata\Doctrine%sAdminBundle\Builder\FormContractor',
688
                    $bundleSubstring
689
                ));
690
            $container
691
                ->register(sprintf('sonata.admin.builder.%s_show', $key))
692
                ->setClass(sprintf(
693
                    'Sonata\Doctrine%sAdminBundle\Builder\ShowBuilder',
694
                    $bundleSubstring
695
                ));
696
            $container
697
                ->register(sprintf('sonata.admin.builder.%s_list', $key))
698
                ->setClass(sprintf(
699
                    'Sonata\Doctrine%sAdminBundle\Builder\ListBuilder',
700
                    $bundleSubstring
701
                ));
702
            $container
703
                ->register(sprintf('sonata.admin.builder.%s_datagrid', $key))
704
                ->setClass(sprintf(
705
                    'Sonata\Doctrine%sAdminBundle\Builder\DatagridBuilder',
706
                    $bundleSubstring
707
                ));
708
        }
709
        $container
710
            ->register('sonata.admin.route.path_info_slashes')
711
            ->setClass(PathInfoBuilderSlashes::class);
712
        $container
713
            ->register('sonata.admin.route.cache')
714
            ->setClass(RoutesCache::class);
715
        $container
716
            ->register('knp_menu.factory')
717
            ->setClass(RouterAwareFactory::class);
718
        $container
719
            ->register('knp_menu.menu_provider')
720
            ->setClass(MenuProviderInterface::class);
721
        $container
722
            ->register('knp_menu.matcher')
723
            ->setClass(MatcherInterface::class);
724
        $container
725
            ->register('event_dispatcher')
726
            ->setClass(EventDispatcherInterface::class);
727
728
        // Add admin definition's
729
        $container
730
            ->register('sonata_news_admin')
731
            ->setPublic(true)
732
            ->setClass(MockAdmin::class)
733
            ->setArguments(['', News::class, CRUDController::class])
734
            ->addTag('sonata.admin', ['group' => 'sonata_group_two', 'label' => '5 Entry', 'manager_type' => 'orm']);
735
        $container
736
            ->register('sonata_post_admin')
737
            ->setClass(MockAdmin::class)
738
            ->setPublic(true)
739
            ->setArguments(['', Post::class, CRUDController::class])
740
            ->addTag('sonata.admin', ['group' => 'sonata_group_one', 'manager_type' => 'orm']);
741
        $container
742
            ->register('sonata_article_admin')
743
            ->setPublic(true)
744
            ->setClass(MockAdmin::class)
745
            ->setArguments(['', Article::class, CRUDController::class])
746
            ->addTag('sonata.admin', ['group' => 'sonata_group_one', 'label' => '1 Entry', 'manager_type' => 'doctrine_phpcr']);
747
        $container
748
            ->register('sonata_report_admin')
749
            ->setPublic(true)
750
            ->setClass(MockAdmin::class)
751
            ->setArguments(['', Report::class, CRUDController::class])
752
            ->addTag('sonata.admin', ['group' => 'sonata_report_group', 'manager_type' => 'orm', 'on_top' => true]);
753
        $container
754
            ->register('sonata_report_one_admin')
755
            ->setClass(MockAdmin::class)
756
            ->setArguments(['', ReportOne::class, CRUDController::class])
757
            ->addTag('sonata.admin', ['group' => 'sonata_report_one_group', 'manager_type' => 'orm', 'show_mosaic_button' => false]);
758
        $container
759
            ->register('sonata_report_two_admin')
760
            ->setClass(MockAdmin::class)
761
            ->setArguments(['', ReportTwo::class, CRUDController::class])
762
            ->addTag('sonata.admin', ['group' => 'sonata_report_two_group', 'manager_type' => 'orm', 'show_mosaic_button' => true]);
763
764
        // translator
765
        $container
766
            ->register('translator.default')
767
            ->setClass(Translator::class);
768
        $container->setAlias('translator', 'translator.default');
769
770
        // Add definitions for sonata.templating service
771
        $container
772
            ->register('kernel')
773
            ->setClass(KernelInterface::class);
774
        $container
775
            ->register('file_locator')
776
            ->setClass(FileLocatorInterface::class);
777
778
        $blockExtension = new SonataBlockExtension();
779
        $blockExtension->load([], $container);
780
781
        return $container;
782
    }
783
}
784