QueueBeanstalkdQueueTest.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <?php
  2. namespace Illuminate\Tests\Queue;
  3. use Illuminate\Container\Container;
  4. use Illuminate\Queue\BeanstalkdQueue;
  5. use Illuminate\Queue\Jobs\BeanstalkdJob;
  6. use Illuminate\Support\Str;
  7. use Mockery as m;
  8. use Pheanstalk\Job;
  9. use Pheanstalk\Pheanstalk;
  10. use PHPUnit\Framework\TestCase;
  11. class QueueBeanstalkdQueueTest extends TestCase
  12. {
  13. /**
  14. * @var BeanstalkdQueue
  15. */
  16. private $queue;
  17. /**
  18. * @var Container|m\LegacyMockInterface|m\MockInterface
  19. */
  20. private $container;
  21. protected function tearDown(): void
  22. {
  23. m::close();
  24. }
  25. public function testPushProperlyPushesJobOntoBeanstalkd()
  26. {
  27. $uuid = Str::uuid();
  28. Str::createUuidsUsing(function () use ($uuid) {
  29. return $uuid;
  30. });
  31. $this->setQueue('default', 60);
  32. $pheanstalk = $this->queue->getPheanstalk();
  33. $pheanstalk->shouldReceive('useTube')->once()->with('stack')->andReturn($pheanstalk);
  34. $pheanstalk->shouldReceive('useTube')->once()->with('default')->andReturn($pheanstalk);
  35. $pheanstalk->shouldReceive('put')->twice()->with(json_encode(['uuid' => $uuid, 'displayName' => 'foo', 'job' => 'foo', 'maxTries' => null, 'maxExceptions' => null, 'failOnTimeout' => false, 'backoff' => null, 'timeout' => null, 'data' => ['data']]), 1024, 0, 60);
  36. $this->queue->push('foo', ['data'], 'stack');
  37. $this->queue->push('foo', ['data']);
  38. $this->container->shouldHaveReceived('bound')->with('events')->times(2);
  39. Str::createUuidsNormally();
  40. }
  41. public function testDelayedPushProperlyPushesJobOntoBeanstalkd()
  42. {
  43. $uuid = Str::uuid();
  44. Str::createUuidsUsing(function () use ($uuid) {
  45. return $uuid;
  46. });
  47. $this->setQueue('default', 60);
  48. $pheanstalk = $this->queue->getPheanstalk();
  49. $pheanstalk->shouldReceive('useTube')->once()->with('stack')->andReturn($pheanstalk);
  50. $pheanstalk->shouldReceive('useTube')->once()->with('default')->andReturn($pheanstalk);
  51. $pheanstalk->shouldReceive('put')->twice()->with(json_encode(['uuid' => $uuid, 'displayName' => 'foo', 'job' => 'foo', 'maxTries' => null, 'maxExceptions' => null, 'failOnTimeout' => false, 'backoff' => null, 'timeout' => null, 'data' => ['data']]), Pheanstalk::DEFAULT_PRIORITY, 5, Pheanstalk::DEFAULT_TTR);
  52. $this->queue->later(5, 'foo', ['data'], 'stack');
  53. $this->queue->later(5, 'foo', ['data']);
  54. $this->container->shouldHaveReceived('bound')->with('events')->times(2);
  55. Str::createUuidsNormally();
  56. }
  57. public function testPopProperlyPopsJobOffOfBeanstalkd()
  58. {
  59. $this->setQueue('default', 60);
  60. $pheanstalk = $this->queue->getPheanstalk();
  61. $pheanstalk->shouldReceive('watchOnly')->once()->with('default')->andReturn($pheanstalk);
  62. $job = m::mock(Job::class);
  63. $pheanstalk->shouldReceive('reserveWithTimeout')->once()->with(0)->andReturn($job);
  64. $result = $this->queue->pop();
  65. $this->assertInstanceOf(BeanstalkdJob::class, $result);
  66. }
  67. public function testBlockingPopProperlyPopsJobOffOfBeanstalkd()
  68. {
  69. $this->setQueue('default', 60, 60);
  70. $pheanstalk = $this->queue->getPheanstalk();
  71. $pheanstalk->shouldReceive('watchOnly')->once()->with('default')->andReturn($pheanstalk);
  72. $job = m::mock(Job::class);
  73. $pheanstalk->shouldReceive('reserveWithTimeout')->once()->with(60)->andReturn($job);
  74. $result = $this->queue->pop();
  75. $this->assertInstanceOf(BeanstalkdJob::class, $result);
  76. }
  77. public function testDeleteProperlyRemoveJobsOffBeanstalkd()
  78. {
  79. $this->setQueue('default', 60);
  80. $pheanstalk = $this->queue->getPheanstalk();
  81. $pheanstalk->shouldReceive('useTube')->once()->with('default')->andReturn($pheanstalk);
  82. $pheanstalk->shouldReceive('delete')->once()->with(m::type(Job::class));
  83. $this->queue->deleteMessage('default', 1);
  84. }
  85. /**
  86. * @param string $default
  87. * @param int $timeToRun
  88. * @param int $blockFor
  89. */
  90. private function setQueue($default, $timeToRun, $blockFor = 0)
  91. {
  92. $this->queue = new BeanstalkdQueue(m::mock(Pheanstalk::class), $default, $timeToRun, $blockFor);
  93. $this->container = m::spy(Container::class);
  94. $this->queue->setContainer($this->container);
  95. }
  96. }