vendor/symfony/src/Symfony/Bundle/DoctrineBundle/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php
changeset 0 7f95f8617b0b
equal deleted inserted replaced
-1:000000000000 0:7f95f8617b0b
       
     1 <?php
       
     2 
       
     3 /*
       
     4  * This file is part of the Symfony package.
       
     5  *
       
     6  * (c) Fabien Potencier <fabien@symfony.com>
       
     7  *
       
     8  * For the full copyright and license information, please view the LICENSE
       
     9  * file that was distributed with this source code.
       
    10  */
       
    11 
       
    12 namespace Symfony\Bundle\DoctrineBundle\Tests\DependencyInjection;
       
    13 
       
    14 use Symfony\Bundle\DoctrineBundle\Tests\TestCase;
       
    15 use Symfony\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension;
       
    16 use Symfony\Component\DependencyInjection\ContainerBuilder;
       
    17 use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
       
    18 use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
       
    19 use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
       
    20 use Symfony\Component\DependencyInjection\Reference;
       
    21 use Symfony\Component\DependencyInjection\Compiler\ResolveDefinitionTemplatesPass;
       
    22 use Symfony\Component\Config\FileLocator;
       
    23 
       
    24 abstract class AbstractDoctrineExtensionTest extends TestCase
       
    25 {
       
    26     abstract protected function loadFromFile(ContainerBuilder $container, $file);
       
    27 
       
    28     public function testDbalOverrideDefaultConnection()
       
    29     {
       
    30         $container = $this->getContainer();
       
    31         $loader = new DoctrineExtension();
       
    32 
       
    33         $loader->load(array(array(), array('dbal' => array('default_connection' => 'foo')), array()), $container);
       
    34 
       
    35         // doctrine.dbal.default_connection
       
    36         $this->assertEquals('%doctrine.default_connection%', $container->getDefinition('doctrine')->getArgument(3), '->load() overrides existing configuration options');
       
    37         $this->assertEquals('foo', $container->getParameter('doctrine.default_connection'), '->load() overrides existing configuration options');
       
    38 
       
    39     }
       
    40 
       
    41     public function testDbalLoad()
       
    42     {
       
    43         $container = $this->getContainer();
       
    44         $loader = new DoctrineExtension();
       
    45 
       
    46         $loader->load(array(array('dbal' => array('connections' => array('default' => array('password' => 'foo')))), array(), array('dbal' => array('default_connection' => 'foo')), array()), $container);
       
    47 
       
    48         $config = $container->getDefinition('doctrine.dbal.default_connection')->getArgument(0);
       
    49 
       
    50         $this->assertEquals('foo', $config['password']);
       
    51         $this->assertEquals('root', $config['user']);
       
    52     }
       
    53 
       
    54     public function testDbalLoadFromXmlMultipleConnections()
       
    55     {
       
    56         $container = $this->getContainer();
       
    57         $loader = new DoctrineExtension();
       
    58         $container->registerExtension($loader);
       
    59 
       
    60         $loadXml = new XmlFileLoader($container, new FileLocator(__DIR__.'/Fixtures/config/xml'));
       
    61         $loadXml->load('dbal_service_multiple_connections.xml');
       
    62         $loader->load(array(array()), $container);
       
    63 
       
    64         $this->compileContainer($container);
       
    65 
       
    66         // doctrine.dbal.mysql_connection
       
    67         $config = $container->getDefinition('doctrine.dbal.mysql_connection')->getArgument(0);
       
    68 
       
    69         $this->assertEquals('mysql_s3cr3t', $config['password']);
       
    70         $this->assertEquals('mysql_user', $config['user']);
       
    71         $this->assertEquals('mysql_db', $config['dbname']);
       
    72         $this->assertEquals('/path/to/mysqld.sock', $config['unix_socket']);
       
    73 
       
    74         // doctrine.dbal.sqlite_connection
       
    75         $config = $container->getDefinition('doctrine.dbal.sqlite_connection')->getArgument(0);
       
    76         $this->assertArrayHasKey('memory', $config);
       
    77 
       
    78         // doctrine.dbal.oci8_connection
       
    79         $config = $container->getDefinition('doctrine.dbal.oci_connection')->getArgument(0);
       
    80         $this->assertArrayHasKey('charset', $config);
       
    81     }
       
    82 
       
    83     public function testDbalLoadFromXmlSingleConnections()
       
    84     {
       
    85         $container = $this->getContainer();
       
    86         $loader = new DoctrineExtension();
       
    87         $container->registerExtension($loader);
       
    88 
       
    89         $loadXml = new XmlFileLoader($container, new FileLocator(__DIR__.'/Fixtures/config/xml'));
       
    90         $loadXml->load('dbal_service_single_connection.xml');
       
    91         $loader->load(array(array()), $container);
       
    92 
       
    93         $this->compileContainer($container);
       
    94 
       
    95         // doctrine.dbal.mysql_connection
       
    96         $config = $container->getDefinition('doctrine.dbal.default_connection')->getArgument(0);
       
    97 
       
    98         $this->assertEquals('mysql_s3cr3t', $config['password']);
       
    99         $this->assertEquals('mysql_user', $config['user']);
       
   100         $this->assertEquals('mysql_db', $config['dbname']);
       
   101         $this->assertEquals('/path/to/mysqld.sock', $config['unix_socket']);
       
   102     }
       
   103 
       
   104     public function testDependencyInjectionConfigurationDefaults()
       
   105     {
       
   106         $container = $this->getContainer();
       
   107         $loader = new DoctrineExtension();
       
   108 
       
   109         $loader->load(array(array('dbal' => array('connections' => array('default' => array('password' => 'foo'))), 'orm' => array('default_entity_manager' => 'default', 'entity_managers' => array('default' => array('mappings' => array('YamlBundle' => array())))))), $container);
       
   110 
       
   111         $this->assertFalse($container->getParameter('doctrine.orm.auto_generate_proxy_classes'));
       
   112         $this->assertEquals('Doctrine\ORM\Configuration', $container->getParameter('doctrine.orm.configuration.class'));
       
   113         $this->assertEquals('Doctrine\ORM\EntityManager', $container->getParameter('doctrine.orm.entity_manager.class'));
       
   114         $this->assertEquals('Proxies', $container->getParameter('doctrine.orm.proxy_namespace'));
       
   115         $this->assertEquals('Doctrine\Common\Cache\ArrayCache', $container->getParameter('doctrine.orm.cache.array.class'));
       
   116         $this->assertEquals('Doctrine\Common\Cache\ApcCache', $container->getParameter('doctrine.orm.cache.apc.class'));
       
   117         $this->assertEquals('Doctrine\Common\Cache\MemcacheCache', $container->getParameter('doctrine.orm.cache.memcache.class'));
       
   118         $this->assertEquals('localhost', $container->getParameter('doctrine.orm.cache.memcache_host'));
       
   119         $this->assertEquals('11211', $container->getParameter('doctrine.orm.cache.memcache_port'));
       
   120         $this->assertEquals('Memcache', $container->getParameter('doctrine.orm.cache.memcache_instance.class'));
       
   121         $this->assertEquals('Doctrine\Common\Cache\XcacheCache', $container->getParameter('doctrine.orm.cache.xcache.class'));
       
   122         $this->assertEquals('Doctrine\ORM\Mapping\Driver\DriverChain', $container->getParameter('doctrine.orm.metadata.driver_chain.class'));
       
   123         $this->assertEquals('Doctrine\ORM\Mapping\Driver\AnnotationDriver', $container->getParameter('doctrine.orm.metadata.annotation.class'));
       
   124         $this->assertEquals('Symfony\Bridge\Doctrine\Mapping\Driver\XmlDriver', $container->getParameter('doctrine.orm.metadata.xml.class'));
       
   125         $this->assertEquals('Symfony\Bridge\Doctrine\Mapping\Driver\YamlDriver', $container->getParameter('doctrine.orm.metadata.yml.class'));
       
   126 
       
   127         $config = array(
       
   128             'proxy_namespace' => 'MyProxies',
       
   129             'auto_generate_proxy_classes' => true,
       
   130             'default_entity_manager' => 'default',
       
   131             'entity_managers' => array(
       
   132                 'default' => array(
       
   133                     'mappings' => array('YamlBundle' => array()),
       
   134                     )
       
   135                 )
       
   136         );
       
   137 
       
   138         $container = $this->getContainer();
       
   139         $loader->load(array(array('dbal' => array('connections' => array('default' => array('password' => 'foo'))), 'orm' => $config)), $container);
       
   140         $this->compileContainer($container);
       
   141 
       
   142         $definition = $container->getDefinition('doctrine.dbal.default_connection');
       
   143 
       
   144         $args = $definition->getArguments();
       
   145         $this->assertEquals('pdo_mysql', $args[0]['driver']);
       
   146         $this->assertEquals('localhost', $args[0]['host']);
       
   147         $this->assertEquals('root', $args[0]['user']);
       
   148         $this->assertEquals('doctrine.dbal.default_connection.configuration', (string) $args[1]);
       
   149         $this->assertEquals('doctrine.dbal.default_connection.event_manager', (string) $args[2]);
       
   150 
       
   151         $definition = $container->getDefinition('doctrine.orm.default_entity_manager');
       
   152         $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getClass());
       
   153         $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getFactoryClass());
       
   154         $this->assertEquals('create', $definition->getFactoryMethod());
       
   155 
       
   156         $this->assertEquals(array('default' => 'doctrine.orm.default_entity_manager'), $container->getParameter('doctrine.entity_managers'), "Set of the existing EntityManagers names is incorrect.");
       
   157         $this->assertEquals('%doctrine.entity_managers%', $container->getDefinition('doctrine')->getArgument(2), "Set of the existing EntityManagers names is incorrect.");
       
   158 
       
   159         $arguments = $definition->getArguments();
       
   160         $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $arguments[0]);
       
   161         $this->assertEquals('doctrine.dbal.default_connection', (string) $arguments[0]);
       
   162         $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $arguments[1]);
       
   163         $this->assertEquals('doctrine.orm.default_configuration', (string) $arguments[1]);
       
   164 
       
   165         $definition = $container->getDefinition('doctrine.orm.default_configuration');
       
   166         $calls = array_values($definition->getMethodCalls());
       
   167         $this->assertEquals(array('YamlBundle' => 'Fixtures\Bundles\YamlBundle\Entity'), $calls[0][1][0]);
       
   168         $this->assertEquals('doctrine.orm.default_metadata_cache', (string) $calls[1][1][0]);
       
   169         $this->assertEquals('doctrine.orm.default_query_cache', (string) $calls[2][1][0]);
       
   170         $this->assertEquals('doctrine.orm.default_result_cache', (string) $calls[3][1][0]);
       
   171 
       
   172         $definition = $container->getDefinition('doctrine.orm.default_metadata_cache');
       
   173         $this->assertEquals('%doctrine.orm.cache.array.class%', $definition->getClass());
       
   174 
       
   175         $definition = $container->getDefinition('doctrine.orm.default_query_cache');
       
   176         $this->assertEquals('%doctrine.orm.cache.array.class%', $definition->getClass());
       
   177 
       
   178         $definition = $container->getDefinition('doctrine.orm.default_result_cache');
       
   179         $this->assertEquals('%doctrine.orm.cache.array.class%', $definition->getClass());
       
   180     }
       
   181 
       
   182     public function testSingleEntityManagerConfiguration()
       
   183     {
       
   184         $container = $this->getContainer();
       
   185         $loader = new DoctrineExtension();
       
   186 
       
   187         $loader->load(array(array('dbal' => array('connections' => array('default' => array('password' => 'foo'))), 'orm' => array('default_entity_manager' => 'default', 'entity_managers' => array('default' => array('mappings' => array('YamlBundle' => array())))))), $container);
       
   188         $this->compileContainer($container);
       
   189 
       
   190         $definition = $container->getDefinition('doctrine.dbal.default_connection');
       
   191 
       
   192         $definition = $container->getDefinition('doctrine.orm.default_entity_manager');
       
   193         $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getClass());
       
   194         $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getFactoryClass());
       
   195         $this->assertEquals('create', $definition->getFactoryMethod());
       
   196 
       
   197         $this->assertDICConstructorArguments($definition, array(
       
   198             new Reference('doctrine.dbal.default_connection'), new Reference('doctrine.orm.default_configuration')
       
   199         ));
       
   200     }
       
   201 
       
   202     public function testLoadSimpleSingleConnection()
       
   203     {
       
   204         $container = $this->getContainer();
       
   205         $loader = new DoctrineExtension();
       
   206         $container->registerExtension($loader);
       
   207 
       
   208         $this->loadFromFile($container, 'orm_service_simple_single_entity_manager');
       
   209 
       
   210         $this->compileContainer($container);
       
   211 
       
   212         $definition = $container->getDefinition('doctrine.dbal.default_connection');
       
   213 
       
   214         $this->assertDICConstructorArguments($definition, array(
       
   215             array(
       
   216                 'dbname' => 'db',
       
   217                 'host' => 'localhost',
       
   218                 'port' => null,
       
   219                 'user' => 'root',
       
   220                 'password' => null,
       
   221                 'driver' => 'pdo_mysql',
       
   222                 'logging' => false,
       
   223                 'driverOptions' => array(),
       
   224             ),
       
   225             new Reference('doctrine.dbal.default_connection.configuration'),
       
   226             new Reference('doctrine.dbal.default_connection.event_manager'),
       
   227             array(),
       
   228         ));
       
   229 
       
   230         $definition = $container->getDefinition('doctrine.orm.default_entity_manager');
       
   231         $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getClass());
       
   232         $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getFactoryClass());
       
   233         $this->assertEquals('create', $definition->getFactoryMethod());
       
   234 
       
   235         $this->assertDICConstructorArguments($definition, array(
       
   236             new Reference('doctrine.dbal.default_connection'), new Reference('doctrine.orm.default_configuration')
       
   237         ));
       
   238     }
       
   239 
       
   240     public function testLoadSingleConnection()
       
   241     {
       
   242         $container = $this->getContainer();
       
   243         $loader = new DoctrineExtension();
       
   244         $container->registerExtension($loader);
       
   245 
       
   246         $this->loadFromFile($container, 'orm_service_single_entity_manager');
       
   247 
       
   248         $this->compileContainer($container);
       
   249 
       
   250         $definition = $container->getDefinition('doctrine.dbal.default_connection');
       
   251 
       
   252         $this->assertDICConstructorArguments($definition, array(
       
   253             array(
       
   254                 'host' => 'localhost',
       
   255                 'driver' => 'pdo_sqlite',
       
   256                 'driverOptions' => array(),
       
   257                 'user' => 'sqlite_user',
       
   258                 'port' => null,
       
   259                 'password' => 'sqlite_s3cr3t',
       
   260                 'dbname' => 'sqlite_db',
       
   261                 'memory' => true,
       
   262                 'logging' => false,
       
   263             ),
       
   264             new Reference('doctrine.dbal.default_connection.configuration'),
       
   265             new Reference('doctrine.dbal.default_connection.event_manager'),
       
   266             array(),
       
   267         ));
       
   268 
       
   269         $definition = $container->getDefinition('doctrine.orm.default_entity_manager');
       
   270         $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getClass());
       
   271         $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getFactoryClass());
       
   272         $this->assertEquals('create', $definition->getFactoryMethod());
       
   273 
       
   274         $this->assertDICConstructorArguments($definition, array(
       
   275             new Reference('doctrine.dbal.default_connection'), new Reference('doctrine.orm.default_configuration')
       
   276         ));
       
   277     }
       
   278 
       
   279     public function testLoadMultipleConnections()
       
   280     {
       
   281         $container = $this->getContainer();
       
   282         $loader = new DoctrineExtension();
       
   283         $container->registerExtension($loader);
       
   284 
       
   285         $this->loadFromFile($container, 'orm_service_multiple_entity_managers');
       
   286 
       
   287         $this->compileContainer($container);
       
   288 
       
   289         $definition = $container->getDefinition('doctrine.dbal.conn1_connection');
       
   290 
       
   291         $args = $definition->getArguments();
       
   292         $this->assertEquals('pdo_sqlite', $args[0]['driver']);
       
   293         $this->assertEquals('localhost', $args[0]['host']);
       
   294         $this->assertEquals('sqlite_user', $args[0]['user']);
       
   295         $this->assertEquals('doctrine.dbal.conn1_connection.configuration', (string) $args[1]);
       
   296         $this->assertEquals('doctrine.dbal.conn1_connection.event_manager', (string) $args[2]);
       
   297 
       
   298         $this->assertEquals('doctrine.orm.em2_entity_manager', (string) $container->getAlias('doctrine.orm.entity_manager'));
       
   299 
       
   300         $definition = $container->getDefinition('doctrine.orm.em1_entity_manager');
       
   301         $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getClass());
       
   302         $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getFactoryClass());
       
   303         $this->assertEquals('create', $definition->getFactoryMethod());
       
   304 
       
   305         $arguments = $definition->getArguments();
       
   306         $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $arguments[0]);
       
   307         $this->assertEquals('doctrine.dbal.conn1_connection', (string) $arguments[0]);
       
   308         $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $arguments[1]);
       
   309         $this->assertEquals('doctrine.orm.em1_configuration', (string) $arguments[1]);
       
   310 
       
   311         $definition = $container->getDefinition('doctrine.dbal.conn2_connection');
       
   312 
       
   313         $args = $definition->getArguments();
       
   314         $this->assertEquals('pdo_sqlite', $args[0]['driver']);
       
   315         $this->assertEquals('localhost', $args[0]['host']);
       
   316         $this->assertEquals('sqlite_user', $args[0]['user']);
       
   317         $this->assertEquals('doctrine.dbal.conn2_connection.configuration', (string) $args[1]);
       
   318         $this->assertEquals('doctrine.dbal.conn2_connection.event_manager', (string) $args[2]);
       
   319 
       
   320         $definition = $container->getDefinition('doctrine.orm.em2_entity_manager');
       
   321         $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getClass());
       
   322         $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getFactoryClass());
       
   323         $this->assertEquals('create', $definition->getFactoryMethod());
       
   324 
       
   325         $arguments = $definition->getArguments();
       
   326         $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $arguments[0]);
       
   327         $this->assertEquals('doctrine.dbal.conn2_connection', (string) $arguments[0]);
       
   328         $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $arguments[1]);
       
   329         $this->assertEquals('doctrine.orm.em2_configuration', (string) $arguments[1]);
       
   330 
       
   331         $definition = $container->getDefinition('doctrine.orm.em1_metadata_cache');
       
   332         $this->assertEquals('%doctrine.orm.cache.xcache.class%', $definition->getClass());
       
   333 
       
   334         $definition = $container->getDefinition('doctrine.orm.em1_query_cache');
       
   335         $this->assertEquals('%doctrine.orm.cache.array.class%', $definition->getClass());
       
   336 
       
   337         $definition = $container->getDefinition('doctrine.orm.em1_result_cache');
       
   338         $this->assertEquals('%doctrine.orm.cache.array.class%', $definition->getClass());
       
   339     }
       
   340 
       
   341     public function testBundleEntityAliases()
       
   342     {
       
   343         $container = $this->getContainer();
       
   344         $loader = new DoctrineExtension();
       
   345 
       
   346         $config = $this->getConnectionConfig();
       
   347         $config['orm'] = array('default_entity_manager' => 'default', 'entity_managers' => array('default' => array('mappings' => array('YamlBundle' => array()))));
       
   348         $loader->load(array($config), $container);
       
   349 
       
   350         $definition = $container->getDefinition('doctrine.orm.default_configuration');
       
   351         $this->assertDICDefinitionMethodCallOnce($definition, 'setEntityNamespaces',
       
   352             array(array('YamlBundle' => 'Fixtures\Bundles\YamlBundle\Entity'))
       
   353         );
       
   354     }
       
   355 
       
   356     public function testOverwriteEntityAliases()
       
   357     {
       
   358         $container = $this->getContainer();
       
   359         $loader = new DoctrineExtension();
       
   360 
       
   361         $config = $this->getConnectionConfig();
       
   362         $config['orm'] = array('default_entity_manager' => 'default', 'entity_managers' => array('default' => array('mappings' => array('YamlBundle' => array('alias' => 'yml')))));
       
   363         $loader->load(array($config), $container);
       
   364 
       
   365         $definition = $container->getDefinition('doctrine.orm.default_configuration');
       
   366         $this->assertDICDefinitionMethodCallOnce($definition, 'setEntityNamespaces',
       
   367             array(array('yml' => 'Fixtures\Bundles\YamlBundle\Entity'))
       
   368         );
       
   369     }
       
   370 
       
   371     public function testYamlBundleMappingDetection()
       
   372     {
       
   373         $container = $this->getContainer('YamlBundle');
       
   374         $loader = new DoctrineExtension();
       
   375 
       
   376         $config = $this->getConnectionConfig();
       
   377         $config['orm'] = array('default_entity_manager' => 'default', 'entity_managers' => array('default' => array('mappings' => array('YamlBundle' => array()))));
       
   378         $loader->load(array($config), $container);
       
   379 
       
   380         $definition = $container->getDefinition('doctrine.orm.default_metadata_driver');
       
   381         $this->assertDICDefinitionMethodCallOnce($definition, 'addDriver', array(
       
   382             new Reference('doctrine.orm.default_yml_metadata_driver'),
       
   383             'Fixtures\Bundles\YamlBundle\Entity'
       
   384         ));
       
   385     }
       
   386 
       
   387     public function testXmlBundleMappingDetection()
       
   388     {
       
   389         $container = $this->getContainer('XmlBundle');
       
   390         $loader = new DoctrineExtension();
       
   391 
       
   392         $config = $this->getConnectionConfig();
       
   393         $config['orm'] = array('default_entity_manager' => 'default', 'entity_managers' => array('default' => array('mappings' => array('XmlBundle' => array()))));
       
   394         $loader->load(array($config), $container);
       
   395 
       
   396         $definition = $container->getDefinition('doctrine.orm.default_metadata_driver');
       
   397         $this->assertDICDefinitionMethodCallOnce($definition, 'addDriver', array(
       
   398             new Reference('doctrine.orm.default_xml_metadata_driver'),
       
   399             'Fixtures\Bundles\XmlBundle\Entity'
       
   400         ));
       
   401     }
       
   402 
       
   403     public function testAnnotationsBundleMappingDetection()
       
   404     {
       
   405         $container = $this->getContainer('AnnotationsBundle');
       
   406         $loader = new DoctrineExtension();
       
   407 
       
   408         $config = $this->getConnectionConfig();
       
   409         $config['orm'] = array('default_entity_manager' => 'default', 'entity_managers' => array('default' => array('mappings' => array('AnnotationsBundle' => array()))));
       
   410         $loader->load(array($config), $container);
       
   411 
       
   412         $definition = $container->getDefinition('doctrine.orm.default_metadata_driver');
       
   413         $this->assertDICDefinitionMethodCallOnce($definition, 'addDriver', array(
       
   414             new Reference('doctrine.orm.default_annotation_metadata_driver'),
       
   415             'Fixtures\Bundles\AnnotationsBundle\Entity'
       
   416         ));
       
   417     }
       
   418 
       
   419     public function testOrmMergeConfigs()
       
   420     {
       
   421         $container = $this->getContainer(array('XmlBundle', 'AnnotationsBundle'));
       
   422         $loader = new DoctrineExtension();
       
   423 
       
   424         $config1 = $this->getConnectionConfig();
       
   425         $config1['orm'] = array(
       
   426             'auto_generate_proxy_classes' => true,
       
   427             'default_entity_manager' => 'default',
       
   428             'entity_managers' => array(
       
   429                 'default' => array('mappings' => array('AnnotationsBundle' => array()))
       
   430         ));
       
   431         $config2 = $this->getConnectionConfig();
       
   432         $config2['orm'] = array(
       
   433             'auto_generate_proxy_classes' => false,
       
   434             'default_entity_manager' => 'default',
       
   435             'entity_managers' => array(
       
   436                 'default' => array('mappings' => array('XmlBundle' => array()))
       
   437         ));
       
   438         $loader->load(array($config1, $config2), $container);
       
   439 
       
   440         $definition = $container->getDefinition('doctrine.orm.default_metadata_driver');
       
   441         $this->assertDICDefinitionMethodCallAt(0, $definition, 'addDriver', array(
       
   442             new Reference('doctrine.orm.default_annotation_metadata_driver'),
       
   443             'Fixtures\Bundles\AnnotationsBundle\Entity'
       
   444         ));
       
   445         $this->assertDICDefinitionMethodCallAt(1, $definition, 'addDriver', array(
       
   446             new Reference('doctrine.orm.default_xml_metadata_driver'),
       
   447             'Fixtures\Bundles\XmlBundle\Entity'
       
   448         ));
       
   449 
       
   450         $configDef = $container->getDefinition('doctrine.orm.default_configuration');
       
   451         $this->assertDICDefinitionMethodCallOnce($configDef, 'setAutoGenerateProxyClasses');
       
   452 
       
   453         $calls = $configDef->getMethodCalls();
       
   454         foreach ($calls as $call) {
       
   455             if ($call[0] == 'setAutoGenerateProxyClasses') {
       
   456                 $this->assertFalse($container->getParameterBag()->resolveValue($call[1][0]));
       
   457                 break;
       
   458             }
       
   459         }
       
   460     }
       
   461 
       
   462     public function testEntityManagerMetadataCacheDriverConfiguration()
       
   463     {
       
   464         $container = $this->getContainer();
       
   465         $loader = new DoctrineExtension();
       
   466         $container->registerExtension($loader);
       
   467 
       
   468         $this->loadFromFile($container, 'orm_service_multiple_entity_managers');
       
   469 
       
   470         $this->compileContainer($container);
       
   471 
       
   472         $definition = $container->getDefinition('doctrine.orm.em1_metadata_cache');
       
   473         $this->assertDICDefinitionClass($definition, '%doctrine.orm.cache.xcache.class%');
       
   474 
       
   475         $definition = $container->getDefinition('doctrine.orm.em2_metadata_cache');
       
   476         $this->assertDICDefinitionClass($definition, '%doctrine.orm.cache.apc.class%');
       
   477     }
       
   478 
       
   479     public function testEntityManagerMemcacheMetadataCacheDriverConfiguration()
       
   480     {
       
   481         $container = $this->getContainer();
       
   482         $loader = new DoctrineExtension();
       
   483         $container->registerExtension($loader);
       
   484 
       
   485         $this->loadFromFile($container, 'orm_service_simple_single_entity_manager');
       
   486 
       
   487         $this->compileContainer($container);
       
   488 
       
   489         $definition = $container->getDefinition('doctrine.orm.default_metadata_cache');
       
   490         $this->assertDICDefinitionClass($definition, 'Doctrine\Common\Cache\MemcacheCache');
       
   491         $this->assertDICDefinitionMethodCallOnce($definition, 'setMemcache',
       
   492             array(new Reference('doctrine.orm.default_memcache_instance'))
       
   493         );
       
   494 
       
   495         $definition = $container->getDefinition('doctrine.orm.default_memcache_instance');
       
   496         $this->assertDICDefinitionClass($definition, 'Memcache');
       
   497         $this->assertDICDefinitionMethodCallOnce($definition, 'connect', array(
       
   498             'localhost', '11211'
       
   499         ));
       
   500     }
       
   501 
       
   502     public function testDependencyInjectionImportsOverrideDefaults()
       
   503     {
       
   504         $container = $this->getContainer();
       
   505         $loader = new DoctrineExtension();
       
   506         $container->registerExtension($loader);
       
   507 
       
   508         $this->loadFromFile($container, 'orm_imports');
       
   509 
       
   510         $this->compileContainer($container);
       
   511 
       
   512         $cacheDefinition = $container->getDefinition('doctrine.orm.default_metadata_cache');
       
   513         $this->assertEquals('%doctrine.orm.cache.apc.class%', $cacheDefinition->getClass());
       
   514 
       
   515         $configDefinition = $container->getDefinition('doctrine.orm.default_configuration');
       
   516         $this->assertDICDefinitionMethodCallOnce($configDefinition, 'setAutoGenerateProxyClasses', array(true));
       
   517     }
       
   518 
       
   519     public function testSingleEntityManagerMultipleMappingBundleDefinitions()
       
   520     {
       
   521         $container = $this->getContainer(array('YamlBundle', 'AnnotationsBundle', 'XmlBundle'));
       
   522 
       
   523         $loader = new DoctrineExtension();
       
   524         $container->registerExtension($loader);
       
   525 
       
   526         $this->loadFromFile($container, 'orm_single_em_bundle_mappings');
       
   527 
       
   528         $this->compileContainer($container);
       
   529 
       
   530         $definition = $container->getDefinition('doctrine.orm.default_metadata_driver');
       
   531 
       
   532         $this->assertDICDefinitionMethodCallAt(0, $definition, 'addDriver', array(
       
   533             new Reference('doctrine.orm.default_annotation_metadata_driver'),
       
   534             'Fixtures\Bundles\AnnotationsBundle\Entity'
       
   535         ));
       
   536 
       
   537         $this->assertDICDefinitionMethodCallAt(1, $definition, 'addDriver', array(
       
   538             new Reference('doctrine.orm.default_yml_metadata_driver'),
       
   539             'Fixtures\Bundles\YamlBundle\Entity'
       
   540         ));
       
   541 
       
   542         $this->assertDICDefinitionMethodCallAt(2, $definition, 'addDriver', array(
       
   543             new Reference('doctrine.orm.default_xml_metadata_driver'),
       
   544             'Fixtures\Bundles\XmlBundle'
       
   545         ));
       
   546 
       
   547         $annDef = $container->getDefinition('doctrine.orm.default_annotation_metadata_driver');
       
   548         $this->assertDICConstructorArguments($annDef, array(
       
   549             new Reference('doctrine.orm.metadata.annotation_reader'),
       
   550             array(__DIR__ .DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'Bundles'.DIRECTORY_SEPARATOR.'AnnotationsBundle'.DIRECTORY_SEPARATOR.'Entity')
       
   551         ));
       
   552 
       
   553         $ymlDef = $container->getDefinition('doctrine.orm.default_yml_metadata_driver');
       
   554         $this->assertDICConstructorArguments($ymlDef, array(
       
   555             array(__DIR__ .DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'Bundles'.DIRECTORY_SEPARATOR.'YamlBundle'.DIRECTORY_SEPARATOR.'Resources'.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'doctrine')
       
   556         ));
       
   557 
       
   558         $xmlDef = $container->getDefinition('doctrine.orm.default_xml_metadata_driver');
       
   559         $this->assertDICConstructorArguments($xmlDef, array(
       
   560             array(__DIR__ .DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'Bundles'.DIRECTORY_SEPARATOR.'XmlBundle'.DIRECTORY_SEPARATOR.'Resources'.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'doctrine')
       
   561         ));
       
   562     }
       
   563 
       
   564     public function testMultipleEntityManagersMappingBundleDefinitions()
       
   565     {
       
   566         $container = $this->getContainer(array('YamlBundle', 'AnnotationsBundle', 'XmlBundle'));
       
   567 
       
   568         $loader = new DoctrineExtension();
       
   569         $container->registerExtension($loader);
       
   570 
       
   571         $this->loadFromFile($container, 'orm_multiple_em_bundle_mappings');
       
   572 
       
   573         $this->compileContainer($container);
       
   574 
       
   575         $this->assertEquals(array('em1' => 'doctrine.orm.em1_entity_manager', 'em2' => 'doctrine.orm.em2_entity_manager'), $container->getParameter('doctrine.entity_managers'), "Set of the existing EntityManagers names is incorrect.");
       
   576         $this->assertEquals('%doctrine.entity_managers%', $container->getDefinition('doctrine')->getArgument(2), "Set of the existing EntityManagers names is incorrect.");
       
   577 
       
   578         $def1 = $container->getDefinition('doctrine.orm.em1_metadata_driver');
       
   579         $def2 = $container->getDefinition('doctrine.orm.em2_metadata_driver');
       
   580 
       
   581         $this->assertDICDefinitionMethodCallAt(0, $def1, 'addDriver', array(
       
   582             new Reference('doctrine.orm.em1_annotation_metadata_driver'),
       
   583             'Fixtures\Bundles\AnnotationsBundle\Entity'
       
   584         ));
       
   585 
       
   586         $this->assertDICDefinitionMethodCallAt(0, $def2, 'addDriver', array(
       
   587             new Reference('doctrine.orm.em2_yml_metadata_driver'),
       
   588             'Fixtures\Bundles\YamlBundle\Entity'
       
   589         ));
       
   590 
       
   591         $this->assertDICDefinitionMethodCallAt(1, $def2, 'addDriver', array(
       
   592             new Reference('doctrine.orm.em2_xml_metadata_driver'),
       
   593             'Fixtures\Bundles\XmlBundle'
       
   594         ));
       
   595 
       
   596         $annDef = $container->getDefinition('doctrine.orm.em1_annotation_metadata_driver');
       
   597         $this->assertDICConstructorArguments($annDef, array(
       
   598             new Reference('doctrine.orm.metadata.annotation_reader'),
       
   599             array(__DIR__ .DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'Bundles'.DIRECTORY_SEPARATOR.'AnnotationsBundle'.DIRECTORY_SEPARATOR.'Entity')
       
   600         ));
       
   601 
       
   602         $ymlDef = $container->getDefinition('doctrine.orm.em2_yml_metadata_driver');
       
   603         $this->assertDICConstructorArguments($ymlDef, array(
       
   604             array(__DIR__ .DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'Bundles'.DIRECTORY_SEPARATOR.'YamlBundle'.DIRECTORY_SEPARATOR.'Resources'.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'doctrine')
       
   605         ));
       
   606 
       
   607         $xmlDef = $container->getDefinition('doctrine.orm.em2_xml_metadata_driver');
       
   608         $this->assertDICConstructorArguments($xmlDef, array(
       
   609             array(__DIR__ .DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'Bundles'.DIRECTORY_SEPARATOR.'XmlBundle'.DIRECTORY_SEPARATOR.'Resources'.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'doctrine')
       
   610         ));
       
   611     }
       
   612 
       
   613     public function testAnnotationsBundleMappingDetectionWithVendorNamespace()
       
   614     {
       
   615         $container = $this->getContainer('AnnotationsBundle', 'Vendor');
       
   616         $loader = new DoctrineExtension();
       
   617 
       
   618         $config = $this->getConnectionConfig();
       
   619         $config['orm'] = array('default_entity_manager' => 'default', 'entity_managers' => array('default' => array('mappings' => array('AnnotationsBundle' => array()))));
       
   620         $loader->load(array($config), $container);
       
   621 
       
   622         $calls = $container->getDefinition('doctrine.orm.default_metadata_driver')->getMethodCalls();
       
   623         $this->assertEquals('doctrine.orm.default_annotation_metadata_driver', (string) $calls[0][1][0]);
       
   624         $this->assertEquals('Fixtures\Bundles\Vendor\AnnotationsBundle\Entity', $calls[0][1][1]);
       
   625     }
       
   626 
       
   627     public function testSetTypes()
       
   628     {
       
   629         $container = $this->getContainer(array('YamlBundle'));
       
   630 
       
   631         $loader = new DoctrineExtension();
       
   632         $container->registerExtension($loader);
       
   633         $this->loadFromFile($container, 'dbal_types');
       
   634         $this->compileContainer($container);
       
   635 
       
   636         $this->assertEquals(
       
   637             array('test' => 'Symfony\Bundle\DoctrineBundle\Tests\DependencyInjection\TestType'),
       
   638             $container->getParameter('doctrine.dbal.connection_factory.types')
       
   639         );
       
   640         $this->assertEquals('%doctrine.dbal.connection_factory.types%', $container->getDefinition('doctrine.dbal.connection_factory')->getArgument(0));
       
   641     }
       
   642 
       
   643     public function testSetCustomFunctions()
       
   644     {
       
   645         $container = $this->getContainer(array('YamlBundle'));
       
   646 
       
   647         $loader = new DoctrineExtension();
       
   648         $container->registerExtension($loader);
       
   649         $this->loadFromFile($container, 'orm_functions');
       
   650         $this->compileContainer($container);
       
   651 
       
   652         $definition = $container->getDefinition('doctrine.orm.default_configuration');
       
   653         $this->assertDICDefinitionMethodCallOnce($definition, 'addCustomStringFunction', array('test_string', 'Symfony\Bundle\DoctrineBundle\Tests\DependencyInjection\TestStringFunction'));
       
   654         $this->assertDICDefinitionMethodCallOnce($definition, 'addCustomNumericFunction', array('test_numeric', 'Symfony\Bundle\DoctrineBundle\Tests\DependencyInjection\TestNumericFunction'));
       
   655         $this->assertDICDefinitionMethodCallOnce($definition, 'addCustomDatetimeFunction', array('test_datetime', 'Symfony\Bundle\DoctrineBundle\Tests\DependencyInjection\TestDatetimeFunction'));
       
   656     }
       
   657 
       
   658     public function testSingleEMSetCustomFunctions()
       
   659     {
       
   660         $container = $this->getContainer(array('YamlBundle'));
       
   661 
       
   662         $loader = new DoctrineExtension();
       
   663         $container->registerExtension($loader);
       
   664         $this->loadFromFile($container, 'orm_single_em_dql_functions');
       
   665         $this->compileContainer($container);
       
   666 
       
   667         $definition = $container->getDefinition('doctrine.orm.default_configuration');
       
   668         $this->assertDICDefinitionMethodCallOnce($definition, 'addCustomStringFunction', array('test_string', 'Symfony\Bundle\DoctrineBundle\Tests\DependencyInjection\TestStringFunction'));
       
   669     }
       
   670 
       
   671     public function testAddCustomHydrationMode()
       
   672     {
       
   673         $container = $this->getContainer(array('YamlBundle'));
       
   674 
       
   675         $loader = new DoctrineExtension();
       
   676         $container->registerExtension($loader);
       
   677         $this->loadFromFile($container, 'orm_hydration_mode');
       
   678         $this->compileContainer($container);
       
   679 
       
   680         $definition = $container->getDefinition('doctrine.orm.default_configuration');
       
   681         $this->assertDICDefinitionMethodCallOnce($definition, 'addCustomHydrationMode', array('test_hydrator', 'Symfony\Bundle\DoctrineBundle\Tests\DependencyInjection\TestHydrator'));
       
   682     }
       
   683 
       
   684     protected function getContainer($bundles = 'YamlBundle', $vendor = null)
       
   685     {
       
   686         $bundles = (array) $bundles;
       
   687 
       
   688         $map = array();
       
   689         foreach ($bundles as $bundle) {
       
   690             require_once __DIR__.'/Fixtures/Bundles/'.($vendor ? $vendor.'/' : '').$bundle.'/'.$bundle.'.php';
       
   691 
       
   692             $map[$bundle] = 'Fixtures\\Bundles\\'.($vendor ? $vendor.'\\' : '').$bundle.'\\'.$bundle;
       
   693         }
       
   694 
       
   695         return new ContainerBuilder(new ParameterBag(array(
       
   696             'kernel.debug'       => false,
       
   697             'kernel.bundles'     => $map,
       
   698             'kernel.cache_dir'   => sys_get_temp_dir(),
       
   699             'kernel.environment' => 'test',
       
   700             'kernel.root_dir'    => __DIR__.'/../../../../../' // src dir
       
   701         )));
       
   702     }
       
   703 
       
   704     /**
       
   705      * Assertion on the Class of a DIC Service Definition.
       
   706      *
       
   707      * @param \Symfony\Component\DependencyInjection\Definition $definition
       
   708      * @param string $expectedClass
       
   709      */
       
   710     protected function assertDICDefinitionClass($definition, $expectedClass)
       
   711     {
       
   712         $this->assertEquals($expectedClass, $definition->getClass(), 'Expected Class of the DIC Container Service Definition is wrong.');
       
   713     }
       
   714 
       
   715     protected function assertDICConstructorArguments($definition, $args)
       
   716     {
       
   717         $this->assertEquals($args, $definition->getArguments(), "Expected and actual DIC Service constructor arguments of definition '".$definition->getClass()."' don't match.");
       
   718     }
       
   719 
       
   720     protected function assertDICDefinitionMethodCallAt($pos, $definition, $methodName, array $params = null)
       
   721     {
       
   722         $calls = $definition->getMethodCalls();
       
   723         if (isset($calls[$pos][0])) {
       
   724             $this->assertEquals($methodName, $calls[$pos][0], "Method '".$methodName."' is expected to be called at position $pos.");
       
   725 
       
   726             if ($params !== null) {
       
   727                 $this->assertEquals($params, $calls[$pos][1], "Expected parameters to methods '".$methodName."' do not match the actual parameters.");
       
   728             }
       
   729         }
       
   730     }
       
   731 
       
   732     /**
       
   733      * Assertion for the DI Container, check if the given definition contains a method call with the given parameters.
       
   734      *
       
   735      * @param \Symfony\Component\DependencyInjection\Definition $definition
       
   736      * @param string $methodName
       
   737      * @param array $params
       
   738      * @return void
       
   739      */
       
   740     protected function assertDICDefinitionMethodCallOnce($definition, $methodName, array $params = null)
       
   741     {
       
   742         $calls = $definition->getMethodCalls();
       
   743         $called = false;
       
   744         foreach ($calls as $call) {
       
   745             if ($call[0] == $methodName) {
       
   746                 if ($called) {
       
   747                     $this->fail("Method '".$methodName."' is expected to be called only once, a second call was registered though.");
       
   748                 } else {
       
   749                     $called = true;
       
   750                     if ($params !== null) {
       
   751                         $this->assertEquals($params, $call[1], "Expected parameters to methods '".$methodName."' do not match the actual parameters.");
       
   752                     }
       
   753                 }
       
   754             }
       
   755         }
       
   756         if (!$called) {
       
   757             $this->fail("Method '".$methodName."' is expected to be called once, definition does not contain a call though.");
       
   758         }
       
   759     }
       
   760 
       
   761     protected function compileContainer(ContainerBuilder $container)
       
   762     {
       
   763         $container->getCompilerPassConfig()->setOptimizationPasses(array(new ResolveDefinitionTemplatesPass()));
       
   764         $container->getCompilerPassConfig()->setRemovingPasses(array());
       
   765         $container->compile();
       
   766     }
       
   767 
       
   768     protected function getConnectionConfig()
       
   769     {
       
   770         return array('dbal' => array('connections' => array('default' => array('password' => 'foo'))));
       
   771     }
       
   772 }