QueueRedisQueueTest.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <?php
  2. namespace Illuminate\Tests\Queue;
  3. use Illuminate\Container\Container;
  4. use Illuminate\Contracts\Redis\Factory;
  5. use Illuminate\Queue\LuaScripts;
  6. use Illuminate\Queue\Queue;
  7. use Illuminate\Queue\RedisQueue;
  8. use Illuminate\Support\Carbon;
  9. use Illuminate\Support\Str;
  10. use Mockery as m;
  11. use PHPUnit\Framework\TestCase;
  12. class QueueRedisQueueTest extends TestCase
  13. {
  14. protected function tearDown(): void
  15. {
  16. m::close();
  17. }
  18. public function testPushProperlyPushesJobOntoRedis()
  19. {
  20. $uuid = Str::uuid();
  21. Str::createUuidsUsing(function () use ($uuid) {
  22. return $uuid;
  23. });
  24. $queue = $this->getMockBuilder(RedisQueue::class)->onlyMethods(['getRandomId'])->setConstructorArgs([$redis = m::mock(Factory::class), 'default'])->getMock();
  25. $queue->expects($this->once())->method('getRandomId')->willReturn('foo');
  26. $queue->setContainer($container = m::spy(Container::class));
  27. $redis->shouldReceive('connection')->once()->andReturn($redis);
  28. $redis->shouldReceive('eval')->once()->with(LuaScripts::push(), 2, 'queues:default', 'queues:default:notify', json_encode(['uuid' => $uuid, 'displayName' => 'foo', 'job' => 'foo', 'maxTries' => null, 'maxExceptions' => null, 'failOnTimeout' => false, 'backoff' => null, 'timeout' => null, 'data' => ['data'], 'id' => 'foo', 'attempts' => 0]));
  29. $id = $queue->push('foo', ['data']);
  30. $this->assertSame('foo', $id);
  31. $container->shouldHaveReceived('bound')->with('events')->once();
  32. Str::createUuidsNormally();
  33. }
  34. public function testPushProperlyPushesJobOntoRedisWithCustomPayloadHook()
  35. {
  36. $uuid = Str::uuid();
  37. Str::createUuidsUsing(function () use ($uuid) {
  38. return $uuid;
  39. });
  40. $queue = $this->getMockBuilder(RedisQueue::class)->onlyMethods(['getRandomId'])->setConstructorArgs([$redis = m::mock(Factory::class), 'default'])->getMock();
  41. $queue->expects($this->once())->method('getRandomId')->willReturn('foo');
  42. $queue->setContainer($container = m::spy(Container::class));
  43. $redis->shouldReceive('connection')->once()->andReturn($redis);
  44. $redis->shouldReceive('eval')->once()->with(LuaScripts::push(), 2, 'queues:default', 'queues:default:notify', json_encode(['uuid' => $uuid, 'displayName' => 'foo', 'job' => 'foo', 'maxTries' => null, 'maxExceptions' => null, 'failOnTimeout' => false, 'backoff' => null, 'timeout' => null, 'data' => ['data'], 'custom' => 'taylor', 'id' => 'foo', 'attempts' => 0]));
  45. Queue::createPayloadUsing(function ($connection, $queue, $payload) {
  46. return ['custom' => 'taylor'];
  47. });
  48. $id = $queue->push('foo', ['data']);
  49. $this->assertSame('foo', $id);
  50. $container->shouldHaveReceived('bound')->with('events')->once();
  51. Queue::createPayloadUsing(null);
  52. Str::createUuidsNormally();
  53. }
  54. public function testPushProperlyPushesJobOntoRedisWithTwoCustomPayloadHook()
  55. {
  56. $uuid = Str::uuid();
  57. Str::createUuidsUsing(function () use ($uuid) {
  58. return $uuid;
  59. });
  60. $queue = $this->getMockBuilder(RedisQueue::class)->onlyMethods(['getRandomId'])->setConstructorArgs([$redis = m::mock(Factory::class), 'default'])->getMock();
  61. $queue->expects($this->once())->method('getRandomId')->willReturn('foo');
  62. $queue->setContainer($container = m::spy(Container::class));
  63. $redis->shouldReceive('connection')->once()->andReturn($redis);
  64. $redis->shouldReceive('eval')->once()->with(LuaScripts::push(), 2, 'queues:default', 'queues:default:notify', json_encode(['uuid' => $uuid, 'displayName' => 'foo', 'job' => 'foo', 'maxTries' => null, 'maxExceptions' => null, 'failOnTimeout' => false, 'backoff' => null, 'timeout' => null, 'data' => ['data'], 'custom' => 'taylor', 'bar' => 'foo', 'id' => 'foo', 'attempts' => 0]));
  65. Queue::createPayloadUsing(function ($connection, $queue, $payload) {
  66. return ['custom' => 'taylor'];
  67. });
  68. Queue::createPayloadUsing(function ($connection, $queue, $payload) {
  69. return ['bar' => 'foo'];
  70. });
  71. $id = $queue->push('foo', ['data']);
  72. $this->assertSame('foo', $id);
  73. $container->shouldHaveReceived('bound')->with('events')->once();
  74. Queue::createPayloadUsing(null);
  75. Str::createUuidsNormally();
  76. }
  77. public function testDelayedPushProperlyPushesJobOntoRedis()
  78. {
  79. $uuid = Str::uuid();
  80. Str::createUuidsUsing(function () use ($uuid) {
  81. return $uuid;
  82. });
  83. $queue = $this->getMockBuilder(RedisQueue::class)->onlyMethods(['availableAt', 'getRandomId'])->setConstructorArgs([$redis = m::mock(Factory::class), 'default'])->getMock();
  84. $queue->setContainer($container = m::spy(Container::class));
  85. $queue->expects($this->once())->method('getRandomId')->willReturn('foo');
  86. $queue->expects($this->once())->method('availableAt')->with(1)->willReturn(2);
  87. $redis->shouldReceive('connection')->once()->andReturn($redis);
  88. $redis->shouldReceive('zadd')->once()->with(
  89. 'queues:default:delayed',
  90. 2,
  91. json_encode(['uuid' => $uuid, 'displayName' => 'foo', 'job' => 'foo', 'maxTries' => null, 'maxExceptions' => null, 'failOnTimeout' => false, 'backoff' => null, 'timeout' => null, 'data' => ['data'], 'id' => 'foo', 'attempts' => 0])
  92. );
  93. $id = $queue->later(1, 'foo', ['data']);
  94. $this->assertSame('foo', $id);
  95. $container->shouldHaveReceived('bound')->with('events')->once();
  96. Str::createUuidsNormally();
  97. }
  98. public function testDelayedPushWithDateTimeProperlyPushesJobOntoRedis()
  99. {
  100. $uuid = Str::uuid();
  101. Str::createUuidsUsing(function () use ($uuid) {
  102. return $uuid;
  103. });
  104. $date = Carbon::now();
  105. $queue = $this->getMockBuilder(RedisQueue::class)->onlyMethods(['availableAt', 'getRandomId'])->setConstructorArgs([$redis = m::mock(Factory::class), 'default'])->getMock();
  106. $queue->setContainer($container = m::spy(Container::class));
  107. $queue->expects($this->once())->method('getRandomId')->willReturn('foo');
  108. $queue->expects($this->once())->method('availableAt')->with($date)->willReturn(2);
  109. $redis->shouldReceive('connection')->once()->andReturn($redis);
  110. $redis->shouldReceive('zadd')->once()->with(
  111. 'queues:default:delayed',
  112. 2,
  113. json_encode(['uuid' => $uuid, 'displayName' => 'foo', 'job' => 'foo', 'maxTries' => null, 'maxExceptions' => null, 'failOnTimeout' => false, 'backoff' => null, 'timeout' => null, 'data' => ['data'], 'id' => 'foo', 'attempts' => 0])
  114. );
  115. $queue->later($date, 'foo', ['data']);
  116. $container->shouldHaveReceived('bound')->with('events')->once();
  117. Str::createUuidsNormally();
  118. }
  119. }