* * 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; } }