RegisterEventListenersAndSubscribersPassTest.php 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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\Bridge\Doctrine\Tests\DependencyInjection\Compiler;
  11. use Symfony\Bridge\Doctrine\DependencyInjection\CompilerPass\RegisterEventListenersAndSubscribersPass;
  12. use Symfony\Component\DependencyInjection\ContainerBuilder;
  13. class RegisterEventListenersAndSubscribersPassTest extends \PHPUnit_Framework_TestCase
  14. {
  15. protected function setUp()
  16. {
  17. if (!class_exists('Symfony\Component\DependencyInjection\Container')) {
  18. $this->markTestSkipped('The "DependencyInjection" component is not available');
  19. }
  20. }
  21. public function testProcessEventListenersWithPriorities()
  22. {
  23. $container = $this->createBuilder();
  24. $container
  25. ->register('a', 'stdClass')
  26. ->addTag('doctrine.event_listener', array(
  27. 'event' => 'foo',
  28. 'priority' => -5,
  29. ))
  30. ->addTag('doctrine.event_listener', array(
  31. 'event' => 'bar',
  32. ))
  33. ;
  34. $container
  35. ->register('b', 'stdClass')
  36. ->addTag('doctrine.event_listener', array(
  37. 'event' => 'foo',
  38. ))
  39. ;
  40. $this->process($container);
  41. $this->assertEquals(array('b', 'a'), $this->getServiceOrder($container, 'addEventListener'));
  42. $calls = $container->getDefinition('doctrine.dbal.default_connection.event_manager')->getMethodCalls();
  43. $this->assertEquals(array('foo', 'bar'), $calls[1][1][0]);
  44. }
  45. public function testProcessEventListenersWithMultipleConnections()
  46. {
  47. $container = $this->createBuilder(true);
  48. $container
  49. ->register('a', 'stdClass')
  50. ->addTag('doctrine.event_listener', array(
  51. 'event' => 'onFlush',
  52. ))
  53. ;
  54. $this->process($container);
  55. $callsDefault = $container->getDefinition('doctrine.dbal.default_connection.event_manager')->getMethodCalls();
  56. $this->assertEquals('addEventListener', $callsDefault[0][0]);
  57. $this->assertEquals(array('onFlush'), $callsDefault[0][1][0]);
  58. $callsSecond = $container->getDefinition('doctrine.dbal.second_connection.event_manager')->getMethodCalls();
  59. $this->assertEquals($callsDefault, $callsSecond);
  60. }
  61. public function testProcessEventSubscribersWithPriorities()
  62. {
  63. $container = $this->createBuilder();
  64. $container
  65. ->register('a', 'stdClass')
  66. ->addTag('doctrine.event_subscriber')
  67. ;
  68. $container
  69. ->register('b', 'stdClass')
  70. ->addTag('doctrine.event_subscriber', array(
  71. 'priority' => 5,
  72. ))
  73. ;
  74. $container
  75. ->register('c', 'stdClass')
  76. ->addTag('doctrine.event_subscriber', array(
  77. 'priority' => 10,
  78. ))
  79. ;
  80. $container
  81. ->register('d', 'stdClass')
  82. ->addTag('doctrine.event_subscriber', array(
  83. 'priority' => 10,
  84. ))
  85. ;
  86. $container
  87. ->register('e', 'stdClass')
  88. ->addTag('doctrine.event_subscriber', array(
  89. 'priority' => 10,
  90. ))
  91. ;
  92. $this->process($container);
  93. $this->assertEquals(array('c', 'd', 'e', 'b', 'a'), $this->getServiceOrder($container, 'addEventSubscriber'));
  94. }
  95. private function process(ContainerBuilder $container)
  96. {
  97. $pass = new RegisterEventListenersAndSubscribersPass('doctrine.connections', 'doctrine.dbal.%s_connection.event_manager', 'doctrine');
  98. $pass->process($container);
  99. }
  100. private function getServiceOrder(ContainerBuilder $container, $method)
  101. {
  102. $order = array();
  103. foreach ($container->getDefinition('doctrine.dbal.default_connection.event_manager')->getMethodCalls() as $call) {
  104. list($name, $arguments) = $call;
  105. if ($method !== $name) {
  106. continue;
  107. }
  108. if ('addEventListener' === $name) {
  109. $order[] = (string) $arguments[1];
  110. continue;
  111. }
  112. $order[] = (string) $arguments[0];
  113. }
  114. return $order;
  115. }
  116. private function createBuilder($multipleConnections = false)
  117. {
  118. $container = new ContainerBuilder();
  119. $connections = array('default' => 'doctrine.dbal.default_connection');
  120. $container->register('doctrine.dbal.default_connection.event_manager', 'stdClass');
  121. $container->register('doctrine.dbal.default_connection', 'stdClass');
  122. if ($multipleConnections) {
  123. $container->register('doctrine.dbal.second_connection.event_manager', 'stdClass');
  124. $container->register('doctrine.dbal.second_connection', 'stdClass');
  125. $connections['second'] = 'doctrine.dbal.second_connection';
  126. }
  127. $container->setParameter('doctrine.connections', $connections);
  128. return $container;
  129. }
  130. }