Completed
Pull Request — master (#6210)
by Jordi Sala
03:12
created

testTranslatorDisabled()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

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