QueueSqsJobTest.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <?php
  2. namespace Illuminate\Tests\Queue;
  3. use Aws\Sqs\SqsClient;
  4. use Illuminate\Container\Container;
  5. use Illuminate\Queue\Jobs\SqsJob;
  6. use Illuminate\Queue\SqsQueue;
  7. use Mockery as m;
  8. use PHPUnit\Framework\TestCase;
  9. use stdClass;
  10. class QueueSqsJobTest extends TestCase
  11. {
  12. protected function setUp(): void
  13. {
  14. $this->key = 'AMAZONSQSKEY';
  15. $this->secret = 'AmAz0n+SqSsEcReT+aLpHaNuM3R1CsTr1nG';
  16. $this->service = 'sqs';
  17. $this->region = 'someregion';
  18. $this->account = '1234567891011';
  19. $this->queueName = 'emails';
  20. $this->baseUrl = 'https://sqs.someregion.amazonaws.com';
  21. $this->releaseDelay = 0;
  22. // This is how the modified getQueue builds the queueUrl
  23. $this->queueUrl = $this->baseUrl.'/'.$this->account.'/'.$this->queueName;
  24. // Get a mock of the SqsClient
  25. $this->mockedSqsClient = $this->getMockBuilder(SqsClient::class)
  26. ->addMethods(['deleteMessage'])
  27. ->disableOriginalConstructor()
  28. ->getMock();
  29. // Use Mockery to mock the IoC Container
  30. $this->mockedContainer = m::mock(Container::class);
  31. $this->mockedJob = 'foo';
  32. $this->mockedData = ['data'];
  33. $this->mockedPayload = json_encode(['job' => $this->mockedJob, 'data' => $this->mockedData, 'attempts' => 1]);
  34. $this->mockedMessageId = 'e3cd03ee-59a3-4ad8-b0aa-ee2e3808ac81';
  35. $this->mockedReceiptHandle = '0NNAq8PwvXuWv5gMtS9DJ8qEdyiUwbAjpp45w2m6M4SJ1Y+PxCh7R930NRB8ylSacEmoSnW18bgd4nK\/O6ctE+VFVul4eD23mA07vVoSnPI4F\/voI1eNCp6Iax0ktGmhlNVzBwaZHEr91BRtqTRM3QKd2ASF8u+IQaSwyl\/DGK+P1+dqUOodvOVtExJwdyDLy1glZVgm85Yw9Jf5yZEEErqRwzYz\/qSigdvW4sm2l7e4phRol\/+IjMtovOyH\/ukueYdlVbQ4OshQLENhUKe7RNN5i6bE\/e5x9bnPhfj2gbM';
  36. $this->mockedJobData = [
  37. 'Body' => $this->mockedPayload,
  38. 'MD5OfBody' => md5($this->mockedPayload),
  39. 'ReceiptHandle' => $this->mockedReceiptHandle,
  40. 'MessageId' => $this->mockedMessageId,
  41. 'Attributes' => ['ApproximateReceiveCount' => 1],
  42. ];
  43. }
  44. protected function tearDown(): void
  45. {
  46. m::close();
  47. }
  48. public function testFireProperlyCallsTheJobHandler()
  49. {
  50. $job = $this->getJob();
  51. $job->getContainer()->shouldReceive('make')->once()->with('foo')->andReturn($handler = m::mock(stdClass::class));
  52. $handler->shouldReceive('fire')->once()->with($job, ['data']);
  53. $job->fire();
  54. }
  55. public function testDeleteRemovesTheJobFromSqs()
  56. {
  57. $this->mockedSqsClient = $this->getMockBuilder(SqsClient::class)
  58. ->addMethods(['deleteMessage'])
  59. ->disableOriginalConstructor()
  60. ->getMock();
  61. $queue = $this->getMockBuilder(SqsQueue::class)->onlyMethods(['getQueue'])->setConstructorArgs([$this->mockedSqsClient, $this->queueName, $this->account])->getMock();
  62. $queue->setContainer($this->mockedContainer);
  63. $job = $this->getJob();
  64. $job->getSqs()->expects($this->once())->method('deleteMessage')->with(['QueueUrl' => $this->queueUrl, 'ReceiptHandle' => $this->mockedReceiptHandle]);
  65. $job->delete();
  66. }
  67. public function testReleaseProperlyReleasesTheJobOntoSqs()
  68. {
  69. $this->mockedSqsClient = $this->getMockBuilder(SqsClient::class)
  70. ->addMethods(['changeMessageVisibility'])
  71. ->disableOriginalConstructor()
  72. ->getMock();
  73. $queue = $this->getMockBuilder(SqsQueue::class)->onlyMethods(['getQueue'])->setConstructorArgs([$this->mockedSqsClient, $this->queueName, $this->account])->getMock();
  74. $queue->setContainer($this->mockedContainer);
  75. $job = $this->getJob();
  76. $job->getSqs()->expects($this->once())->method('changeMessageVisibility')->with(['QueueUrl' => $this->queueUrl, 'ReceiptHandle' => $this->mockedReceiptHandle, 'VisibilityTimeout' => $this->releaseDelay]);
  77. $job->release($this->releaseDelay);
  78. $this->assertTrue($job->isReleased());
  79. }
  80. protected function getJob()
  81. {
  82. return new SqsJob(
  83. $this->mockedContainer,
  84. $this->mockedSqsClient,
  85. $this->mockedJobData,
  86. 'connection-name',
  87. $this->queueUrl
  88. );
  89. }
  90. }