Tiago Garcia 11 年 前
コミット
3e0ff89b00

+ 206 - 0
Tests/DependencyInjection/Compiler/AddDependencyCallsCompilerPassTest.php

@@ -0,0 +1,206 @@
+<?php
+
+/*
+ * This file is part of the Sonata package.
+ *
+ * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Sonata\AdminBundle\Tests\DependencyInjection;
+
+use Sonata\AdminBundle\DependencyInjection\SonataAdminExtension;
+use Sonata\AdminBundle\DependencyInjection\Compiler\AddDependencyCallsCompilerPass;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * @author     Tiago Garcia
+ */
+class AddDependencyCallsCompilerPassTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var SonataAdminExtension $extension */
+    private $extension;
+    
+    /** @var array $config */
+    private $config;
+
+    public function setUp()
+    {
+        parent::setUp();
+
+        $this->extension = new SonataAdminExtension();
+        $this->config    = $this->getConfig();
+    }
+
+    /**
+     * @covers Sonata\AdminBundle\DependencyInjection\Compiler\AddDependencyCallsCompilerPass::process
+     */
+    public function testProcessParsingFullValidConfig()
+    {
+        $container = $this->getContainer();
+        $this->extension->load(array($this->config), $container);
+
+        $compilerPass = new AddDependencyCallsCompilerPass();
+        $compilerPass->process($container);
+        $container->compile();
+        
+        $this->assertTrue($container->hasParameter('sonata.admin.configuration.dashboard_groups'));
+        
+        $dashboardGroupsSettings = $container->getParameter('sonata.admin.configuration.dashboard_groups');
+
+        $this->assertArrayHasKey('sonata_group_one', $dashboardGroupsSettings);
+
+        $this->assertArrayHasKey('label', $dashboardGroupsSettings['sonata_group_one']);
+        $this->assertArrayHasKey('label_catalogue', $dashboardGroupsSettings['sonata_group_one']);
+        $this->assertArrayHasKey('items', $dashboardGroupsSettings['sonata_group_one']);
+        $this->assertArrayHasKey('item_adds', $dashboardGroupsSettings['sonata_group_one']);
+        $this->assertArrayHasKey('roles', $dashboardGroupsSettings['sonata_group_one']);
+
+        $this->assertEquals('Group One Label', $dashboardGroupsSettings['sonata_group_one']['label']);
+        $this->assertEquals('SonataAdminBundle', $dashboardGroupsSettings['sonata_group_one']['label_catalogue']);
+        $this->assertContains('sonata_post_admin', $dashboardGroupsSettings['sonata_group_one']['items']);
+        $this->assertContains('sonata_news_admin', $dashboardGroupsSettings['sonata_group_one']['item_adds']);
+        $this->assertContains('ROLE_ONE', $dashboardGroupsSettings['sonata_group_one']['roles']);
+    }
+
+    /**
+     * @covers Sonata\AdminBundle\DependencyInjection\Compiler\AddDependencyCallsCompilerPass::process
+     */
+    public function testProcessResultingConfig()
+    {
+        $container = $this->getContainer();
+        $this->extension->load(array($this->config), $container);
+
+        $compilerPass = new AddDependencyCallsCompilerPass();
+        $compilerPass->process($container);
+        $container->compile();
+        
+        $this->assertTrue($container->hasDefinition('sonata.admin.pool'));
+        $this->assertTrue($container->hasDefinition('sonata_post_admin'));
+        $this->assertTrue($container->hasDefinition('sonata_article_admin'));
+        $this->assertTrue($container->hasDefinition('sonata_news_admin'));
+        
+        $pool = $container->get('sonata.admin.pool');
+        $adminServiceIds = $pool->getAdminServiceIds();
+        $adminGroups = $pool->getAdminGroups();
+        $adminClasses = $pool->getAdminClasses();
+
+        $this->assertContains('sonata_post_admin', $adminServiceIds);
+        $this->assertContains('sonata_article_admin', $adminServiceIds);
+        $this->assertContains('sonata_news_admin', $adminServiceIds);
+        
+        $this->assertArrayHasKey('sonata_group_one', $adminGroups);
+        $this->assertArrayHasKey('label', $adminGroups['sonata_group_one']);
+        $this->assertArrayHasKey('label_catalogue', $adminGroups['sonata_group_one']);
+        $this->assertArrayHasKey('items', $adminGroups['sonata_group_one']);
+        $this->assertArrayHasKey('item_adds', $adminGroups['sonata_group_one']);
+        $this->assertArrayHasKey('roles', $adminGroups['sonata_group_one']);
+        $this->assertEquals('Group One Label', $adminGroups['sonata_group_one']['label']);
+        $this->assertEquals('SonataAdminBundle', $adminGroups['sonata_group_one']['label_catalogue']);
+        $this->assertContains('sonata_post_admin', $adminGroups['sonata_group_one']['items']);
+        $this->assertContains('sonata_news_admin', $adminGroups['sonata_group_one']['items']);
+        $this->assertContains('sonata_news_admin', $adminGroups['sonata_group_one']['item_adds']);
+        $this->assertFalse(in_array('sonata_article_admin', $adminGroups['sonata_group_one']['items']));
+        $this->assertContains('ROLE_ONE', $adminGroups['sonata_group_one']['roles']);
+
+        $this->assertArrayHasKey('Sonata\AdminBundle\Tests\DependencyInjection\Post', $adminClasses);
+        $this->assertContains('sonata_post_admin', $adminClasses['Sonata\AdminBundle\Tests\DependencyInjection\Post']);
+        $this->assertArrayHasKey('Sonata\AdminBundle\Tests\DependencyInjection\Article', $adminClasses);
+        $this->assertContains('sonata_article_admin', $adminClasses['Sonata\AdminBundle\Tests\DependencyInjection\Article']);
+        $this->assertArrayHasKey('Sonata\AdminBundle\Tests\DependencyInjection\News', $adminClasses);
+        $this->assertContains('sonata_news_admin', $adminClasses['Sonata\AdminBundle\Tests\DependencyInjection\News']);
+    }
+
+    /**
+     * @return array
+     */
+    protected function getConfig()
+    {
+        $config = array(
+            'dashboard' => array(
+                'groups' => array(
+                    'sonata_group_one' => array(
+                        'label' => 'Group One Label',
+                        'label_catalogue' => 'SonataAdminBundle',
+                        'items' => array(
+                            'sonata_post_admin'
+                        ),
+                        'item_adds' => array(
+                            'sonata_news_admin'
+                        ),
+                        'roles' => array('ROLE_ONE'),
+                    ),
+                )
+            )
+        );
+        return $config;
+    }
+    
+    private function getContainer()
+    {
+        $container = new ContainerBuilder();
+        $container->setParameter('kernel.bundles', array());
+
+        // Add dependencies for SonataAdminBundle (these services will never get called so dummy classes will do)
+        $container
+            ->register('twig')
+            ->setClass('Symfony\Bundle\FrameworkBundle\Templating\EngineInterface');
+        $container
+            ->register('templating')
+            ->setClass('Symfony\Bundle\FrameworkBundle\Templating\EngineInterface');
+        $container
+            ->register('translator')
+            ->setClass('Symfony\Bundle\FrameworkBundle\Translation\TranslatorInterface');
+        $container
+            ->register('validator')
+            ->setClass('Symfony\Bundle\FrameworkBundle\Validator\Validator');
+        $container
+            ->register('validator.validator_factory')
+            ->setClass('Symfony\Bundle\FrameworkBundle\Validator\ConstraintValidatorFactory');
+        $container
+            ->register('router')
+            ->setClass('Symfony\Component\Routing\RouterInterface');
+        $container
+            ->register('form.factory')
+            ->setClass('Symfony\Component\Form\FormFactoryInterface');
+        $container
+            ->register('sonata.admin.manager.orm')
+            ->setClass('Sonata\DoctrineORMAdminBundle\Model\ModelManager');
+        $container
+            ->register('sonata.admin.builder.orm_form')
+            ->setClass('Sonata\DoctrineORMAdminBundle\Builder\FormContractor');
+        $container
+            ->register('sonata.admin.builder.orm_show')
+            ->setClass('Sonata\DoctrineORMAdminBundle\Builder\ShowBuilder');
+        $container
+            ->register('sonata.admin.builder.orm_list')
+            ->setClass('Sonata\DoctrineORMAdminBundle\Builder\ListBuilder');
+        $container
+            ->register('sonata.admin.builder.orm_datagrid')
+            ->setClass('Sonata\DoctrineORMAdminBundle\Builder\DatagridBuilder');
+        $container
+            ->register('knp_menu.factory')
+            ->setClass('Knp\Menu\Silex\RouterAwareFactory');
+
+        // Add admin definition's
+        $container
+            ->register('sonata_post_admin')
+            ->setClass('Sonata\AdminBundle\Tests\DependencyInjection\MockAdmin')
+            ->setArguments(array('', 'Sonata\AdminBundle\Tests\DependencyInjection\Post', 'SonataAdminBundle:CRUD'))
+            ->addTag('sonata.admin', array('group' => 'sonata_group_one', 'manager_type' => 'orm'));
+        $container
+            ->register('sonata_news_admin')
+            ->setClass('Sonata\AdminBundle\Tests\DependencyInjection\MockAdmin')
+            ->setArguments(array('', 'Sonata\AdminBundle\Tests\DependencyInjection\News', 'SonataAdminBundle:CRUD'))
+            ->addTag('sonata.admin', array('group' => 'sonata_group_two', 'manager_type' => 'orm'));
+        $container
+            ->register('sonata_article_admin')
+            ->setClass('Sonata\AdminBundle\Tests\DependencyInjection\MockAdmin')
+            ->setArguments(array('', 'Sonata\AdminBundle\Tests\DependencyInjection\Article', 'SonataAdminBundle:CRUD'))
+            ->addTag('sonata.admin', array('group' => 'sonata_group_one', 'manager_type' => 'orm'));
+
+        return $container;
+    }
+}