QueuedEventsTest.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. <?php
  2. namespace Illuminate\Tests\Events;
  3. use Illuminate\Container\Container;
  4. use Illuminate\Contracts\Queue\Queue;
  5. use Illuminate\Contracts\Queue\ShouldQueue;
  6. use Illuminate\Events\CallQueuedListener;
  7. use Illuminate\Events\Dispatcher;
  8. use Illuminate\Support\Testing\Fakes\QueueFake;
  9. use Mockery as m;
  10. use PHPUnit\Framework\TestCase;
  11. class QueuedEventsTest extends TestCase
  12. {
  13. protected function tearDown(): void
  14. {
  15. m::close();
  16. }
  17. public function testQueuedEventHandlersAreQueued()
  18. {
  19. $d = new Dispatcher;
  20. $queue = m::mock(Queue::class);
  21. $queue->shouldReceive('connection')->once()->with(null)->andReturnSelf();
  22. $queue->shouldReceive('pushOn')->once()->with(null, m::type(CallQueuedListener::class));
  23. $d->setQueueResolver(function () use ($queue) {
  24. return $queue;
  25. });
  26. $d->listen('some.event', TestDispatcherQueuedHandler::class.'@someMethod');
  27. $d->dispatch('some.event', ['foo', 'bar']);
  28. }
  29. public function testCustomizedQueuedEventHandlersAreQueued()
  30. {
  31. $d = new Dispatcher;
  32. $fakeQueue = new QueueFake(new Container);
  33. $d->setQueueResolver(function () use ($fakeQueue) {
  34. return $fakeQueue;
  35. });
  36. $d->listen('some.event', TestDispatcherConnectionQueuedHandler::class.'@handle');
  37. $d->dispatch('some.event', ['foo', 'bar']);
  38. $fakeQueue->assertPushedOn('my_queue', CallQueuedListener::class);
  39. }
  40. public function testQueueIsSetByGetQueue()
  41. {
  42. $d = new Dispatcher;
  43. $fakeQueue = new QueueFake(new Container);
  44. $d->setQueueResolver(function () use ($fakeQueue) {
  45. return $fakeQueue;
  46. });
  47. $d->listen('some.event', TestDispatcherGetQueue::class.'@handle');
  48. $d->dispatch('some.event', ['foo', 'bar']);
  49. $fakeQueue->assertPushedOn('some_other_queue', CallQueuedListener::class);
  50. }
  51. public function testQueueIsSetByGetConnection()
  52. {
  53. $d = new Dispatcher;
  54. $queue = m::mock(Queue::class);
  55. $queue->shouldReceive('connection')->once()->with('some_other_connection')->andReturnSelf();
  56. $queue->shouldReceive('pushOn')->once()->with(null, m::type(CallQueuedListener::class));
  57. $d->setQueueResolver(function () use ($queue) {
  58. return $queue;
  59. });
  60. $d->listen('some.event', TestDispatcherGetConnection::class.'@handle');
  61. $d->dispatch('some.event', ['foo', 'bar']);
  62. }
  63. public function testQueuePropagateRetryUntilAndMaxExceptions()
  64. {
  65. $d = new Dispatcher;
  66. $fakeQueue = new QueueFake(new Container);
  67. $d->setQueueResolver(function () use ($fakeQueue) {
  68. return $fakeQueue;
  69. });
  70. $d->listen('some.event', TestDispatcherOptions::class.'@handle');
  71. $d->dispatch('some.event', ['foo', 'bar']);
  72. $fakeQueue->assertPushed(CallQueuedListener::class, function ($job) {
  73. return $job->maxExceptions === 1 && $job->retryUntil !== null;
  74. });
  75. }
  76. public function testQueuePropagateMiddleware()
  77. {
  78. $d = new Dispatcher;
  79. $fakeQueue = new QueueFake(new Container);
  80. $d->setQueueResolver(function () use ($fakeQueue) {
  81. return $fakeQueue;
  82. });
  83. $d->listen('some.event', TestDispatcherMiddleware::class.'@handle');
  84. $d->dispatch('some.event', ['foo', 'bar']);
  85. $fakeQueue->assertPushed(CallQueuedListener::class, function ($job) {
  86. return count($job->middleware) === 1 && $job->middleware[0] instanceof TestMiddleware;
  87. });
  88. }
  89. }
  90. class TestDispatcherQueuedHandler implements ShouldQueue
  91. {
  92. public function handle()
  93. {
  94. //
  95. }
  96. }
  97. class TestDispatcherConnectionQueuedHandler implements ShouldQueue
  98. {
  99. public $connection = 'redis';
  100. public $delay = 10;
  101. public $queue = 'my_queue';
  102. public function handle()
  103. {
  104. //
  105. }
  106. }
  107. class TestDispatcherGetQueue implements ShouldQueue
  108. {
  109. public $queue = 'my_queue';
  110. public function handle()
  111. {
  112. //
  113. }
  114. public function viaQueue()
  115. {
  116. return 'some_other_queue';
  117. }
  118. }
  119. class TestDispatcherGetConnection implements ShouldQueue
  120. {
  121. public $connection = 'my_connection';
  122. public function handle()
  123. {
  124. //
  125. }
  126. public function viaConnection()
  127. {
  128. return 'some_other_connection';
  129. }
  130. }
  131. class TestDispatcherOptions implements ShouldQueue
  132. {
  133. public $maxExceptions = 1;
  134. public function retryUntil()
  135. {
  136. return now()->addHour(1);
  137. }
  138. public function handle()
  139. {
  140. //
  141. }
  142. }
  143. class TestDispatcherMiddleware implements ShouldQueue
  144. {
  145. public function middleware()
  146. {
  147. return [new TestMiddleware()];
  148. }
  149. public function handle()
  150. {
  151. //
  152. }
  153. }
  154. class TestMiddleware
  155. {
  156. public function handle($job, $next)
  157. {
  158. $next($job);
  159. }
  160. }