AbstractDoctrineExtensionTest.php 37 KB

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