123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- <?php
- namespace Illuminate\Tests\Queue;
- use Aws\Result;
- use Aws\Sqs\SqsClient;
- use Illuminate\Container\Container;
- use Illuminate\Queue\Jobs\SqsJob;
- use Illuminate\Queue\SqsQueue;
- use Illuminate\Support\Carbon;
- use Mockery as m;
- use PHPUnit\Framework\TestCase;
- class QueueSqsQueueTest extends TestCase
- {
- protected function tearDown(): void
- {
- m::close();
- }
- protected function setUp(): void
- {
- // Use Mockery to mock the SqsClient
- $this->sqs = m::mock(SqsClient::class);
- $this->account = '1234567891011';
- $this->queueName = 'emails';
- $this->baseUrl = 'https://sqs.someregion.amazonaws.com';
- // This is how the modified getQueue builds the queueUrl
- $this->prefix = $this->baseUrl.'/'.$this->account.'/';
- $this->queueUrl = $this->prefix.$this->queueName;
- $this->mockedJob = 'foo';
- $this->mockedData = ['data'];
- $this->mockedPayload = json_encode(['job' => $this->mockedJob, 'data' => $this->mockedData]);
- $this->mockedDelay = 10;
- $this->mockedMessageId = 'e3cd03ee-59a3-4ad8-b0aa-ee2e3808ac81';
- $this->mockedReceiptHandle = '0NNAq8PwvXuWv5gMtS9DJ8qEdyiUwbAjpp45w2m6M4SJ1Y+PxCh7R930NRB8ylSacEmoSnW18bgd4nK\/O6ctE+VFVul4eD23mA07vVoSnPI4F\/voI1eNCp6Iax0ktGmhlNVzBwaZHEr91BRtqTRM3QKd2ASF8u+IQaSwyl\/DGK+P1+dqUOodvOVtExJwdyDLy1glZVgm85Yw9Jf5yZEEErqRwzYz\/qSigdvW4sm2l7e4phRol\/+IjMtovOyH\/ukueYdlVbQ4OshQLENhUKe7RNN5i6bE\/e5x9bnPhfj2gbM';
- $this->mockedSendMessageResponseModel = new Result([
- 'Body' => $this->mockedPayload,
- 'MD5OfBody' => md5($this->mockedPayload),
- 'ReceiptHandle' => $this->mockedReceiptHandle,
- 'MessageId' => $this->mockedMessageId,
- 'Attributes' => ['ApproximateReceiveCount' => 1],
- ]);
- $this->mockedReceiveMessageResponseModel = new Result([
- 'Messages' => [
- 0 => [
- 'Body' => $this->mockedPayload,
- 'MD5OfBody' => md5($this->mockedPayload),
- 'ReceiptHandle' => $this->mockedReceiptHandle,
- 'MessageId' => $this->mockedMessageId,
- ],
- ],
- ]);
- $this->mockedReceiveEmptyMessageResponseModel = new Result([
- 'Messages' => null,
- ]);
- $this->mockedQueueAttributesResponseModel = new Result([
- 'Attributes' => [
- 'ApproximateNumberOfMessages' => 1,
- ],
- ]);
- }
- public function testPopProperlyPopsJobOffOfSqs()
- {
- $queue = $this->getMockBuilder(SqsQueue::class)->onlyMethods(['getQueue'])->setConstructorArgs([$this->sqs, $this->queueName, $this->account])->getMock();
- $queue->setContainer(m::mock(Container::class));
- $queue->expects($this->once())->method('getQueue')->with($this->queueName)->willReturn($this->queueUrl);
- $this->sqs->shouldReceive('receiveMessage')->once()->with(['QueueUrl' => $this->queueUrl, 'AttributeNames' => ['ApproximateReceiveCount']])->andReturn($this->mockedReceiveMessageResponseModel);
- $result = $queue->pop($this->queueName);
- $this->assertInstanceOf(SqsJob::class, $result);
- }
- public function testPopProperlyHandlesEmptyMessage()
- {
- $queue = $this->getMockBuilder(SqsQueue::class)->onlyMethods(['getQueue'])->setConstructorArgs([$this->sqs, $this->queueName, $this->account])->getMock();
- $queue->setContainer(m::mock(Container::class));
- $queue->expects($this->once())->method('getQueue')->with($this->queueName)->willReturn($this->queueUrl);
- $this->sqs->shouldReceive('receiveMessage')->once()->with(['QueueUrl' => $this->queueUrl, 'AttributeNames' => ['ApproximateReceiveCount']])->andReturn($this->mockedReceiveEmptyMessageResponseModel);
- $result = $queue->pop($this->queueName);
- $this->assertNull($result);
- }
- public function testDelayedPushWithDateTimeProperlyPushesJobOntoSqs()
- {
- $now = Carbon::now();
- $queue = $this->getMockBuilder(SqsQueue::class)->onlyMethods(['createPayload', 'secondsUntil', 'getQueue'])->setConstructorArgs([$this->sqs, $this->queueName, $this->account])->getMock();
- $queue->setContainer($container = m::spy(Container::class));
- $queue->expects($this->once())->method('createPayload')->with($this->mockedJob, $this->queueName, $this->mockedData)->willReturn($this->mockedPayload);
- $queue->expects($this->once())->method('secondsUntil')->with($now)->willReturn(5);
- $queue->expects($this->once())->method('getQueue')->with($this->queueName)->willReturn($this->queueUrl);
- $this->sqs->shouldReceive('sendMessage')->once()->with(['QueueUrl' => $this->queueUrl, 'MessageBody' => $this->mockedPayload, 'DelaySeconds' => 5])->andReturn($this->mockedSendMessageResponseModel);
- $id = $queue->later($now->addSeconds(5), $this->mockedJob, $this->mockedData, $this->queueName);
- $this->assertEquals($this->mockedMessageId, $id);
- $container->shouldHaveReceived('bound')->with('events')->once();
- }
- public function testDelayedPushProperlyPushesJobOntoSqs()
- {
- $queue = $this->getMockBuilder(SqsQueue::class)->onlyMethods(['createPayload', 'secondsUntil', 'getQueue'])->setConstructorArgs([$this->sqs, $this->queueName, $this->account])->getMock();
- $queue->setContainer($container = m::spy(Container::class));
- $queue->expects($this->once())->method('createPayload')->with($this->mockedJob, $this->queueName, $this->mockedData)->willReturn($this->mockedPayload);
- $queue->expects($this->once())->method('secondsUntil')->with($this->mockedDelay)->willReturn($this->mockedDelay);
- $queue->expects($this->once())->method('getQueue')->with($this->queueName)->willReturn($this->queueUrl);
- $this->sqs->shouldReceive('sendMessage')->once()->with(['QueueUrl' => $this->queueUrl, 'MessageBody' => $this->mockedPayload, 'DelaySeconds' => $this->mockedDelay])->andReturn($this->mockedSendMessageResponseModel);
- $id = $queue->later($this->mockedDelay, $this->mockedJob, $this->mockedData, $this->queueName);
- $this->assertEquals($this->mockedMessageId, $id);
- $container->shouldHaveReceived('bound')->with('events')->once();
- }
- public function testPushProperlyPushesJobOntoSqs()
- {
- $queue = $this->getMockBuilder(SqsQueue::class)->onlyMethods(['createPayload', 'getQueue'])->setConstructorArgs([$this->sqs, $this->queueName, $this->account])->getMock();
- $queue->setContainer($container = m::spy(Container::class));
- $queue->expects($this->once())->method('createPayload')->with($this->mockedJob, $this->queueName, $this->mockedData)->willReturn($this->mockedPayload);
- $queue->expects($this->once())->method('getQueue')->with($this->queueName)->willReturn($this->queueUrl);
- $this->sqs->shouldReceive('sendMessage')->once()->with(['QueueUrl' => $this->queueUrl, 'MessageBody' => $this->mockedPayload])->andReturn($this->mockedSendMessageResponseModel);
- $id = $queue->push($this->mockedJob, $this->mockedData, $this->queueName);
- $this->assertEquals($this->mockedMessageId, $id);
- $container->shouldHaveReceived('bound')->with('events')->once();
- }
- public function testSizeProperlyReadsSqsQueueSize()
- {
- $queue = $this->getMockBuilder(SqsQueue::class)->onlyMethods(['getQueue'])->setConstructorArgs([$this->sqs, $this->queueName, $this->account])->getMock();
- $queue->expects($this->once())->method('getQueue')->with($this->queueName)->willReturn($this->queueUrl);
- $this->sqs->shouldReceive('getQueueAttributes')->once()->with(['QueueUrl' => $this->queueUrl, 'AttributeNames' => ['ApproximateNumberOfMessages']])->andReturn($this->mockedQueueAttributesResponseModel);
- $size = $queue->size($this->queueName);
- $this->assertEquals(1, $size);
- }
- public function testGetQueueProperlyResolvesUrlWithPrefix()
- {
- $queue = new SqsQueue($this->sqs, $this->queueName, $this->prefix);
- $this->assertEquals($this->queueUrl, $queue->getQueue(null));
- $queueUrl = $this->baseUrl.'/'.$this->account.'/test';
- $this->assertEquals($queueUrl, $queue->getQueue('test'));
- }
- public function testGetQueueProperlyResolvesFifoUrlWithPrefix()
- {
- $this->queueName = 'emails.fifo';
- $this->queueUrl = $this->prefix.$this->queueName;
- $queue = new SqsQueue($this->sqs, $this->queueName, $this->prefix);
- $this->assertEquals($this->queueUrl, $queue->getQueue(null));
- $queueUrl = $this->baseUrl.'/'.$this->account.'/test.fifo';
- $this->assertEquals($queueUrl, $queue->getQueue('test.fifo'));
- }
- public function testGetQueueProperlyResolvesUrlWithoutPrefix()
- {
- $queue = new SqsQueue($this->sqs, $this->queueUrl);
- $this->assertEquals($this->queueUrl, $queue->getQueue(null));
- $queueUrl = $this->baseUrl.'/'.$this->account.'/test';
- $this->assertEquals($queueUrl, $queue->getQueue($queueUrl));
- }
- public function testGetQueueProperlyResolvesFifoUrlWithoutPrefix()
- {
- $this->queueName = 'emails.fifo';
- $this->queueUrl = $this->prefix.$this->queueName;
- $queue = new SqsQueue($this->sqs, $this->queueUrl);
- $this->assertEquals($this->queueUrl, $queue->getQueue(null));
- $fifoQueueUrl = $this->baseUrl.'/'.$this->account.'/test.fifo';
- $this->assertEquals($fifoQueueUrl, $queue->getQueue($fifoQueueUrl));
- }
- public function testGetQueueProperlyResolvesUrlWithSuffix()
- {
- $queue = new SqsQueue($this->sqs, $this->queueName, $this->prefix, $suffix = '-staging');
- $this->assertEquals($this->queueUrl.$suffix, $queue->getQueue(null));
- $queueUrl = $this->baseUrl.'/'.$this->account.'/test'.$suffix;
- $this->assertEquals($queueUrl, $queue->getQueue('test'));
- }
- public function testGetQueueProperlyResolvesFifoUrlWithSuffix()
- {
- $this->queueName = 'emails.fifo';
- $queue = new SqsQueue($this->sqs, $this->queueName, $this->prefix, $suffix = '-staging');
- $this->assertEquals("{$this->prefix}emails-staging.fifo", $queue->getQueue(null));
- $queueUrl = $this->baseUrl.'/'.$this->account.'/test'.$suffix.'.fifo';
- $this->assertEquals($queueUrl, $queue->getQueue('test.fifo'));
- }
- public function testGetQueueEnsuresTheQueueIsOnlySuffixedOnce()
- {
- $queue = new SqsQueue($this->sqs, "{$this->queueName}-staging", $this->prefix, $suffix = '-staging');
- $this->assertEquals($this->queueUrl.$suffix, $queue->getQueue(null));
- $queueUrl = $this->baseUrl.'/'.$this->account.'/test'.$suffix;
- $this->assertEquals($queueUrl, $queue->getQueue('test-staging'));
- }
- public function testGetFifoQueueEnsuresTheQueueIsOnlySuffixedOnce()
- {
- $queue = new SqsQueue($this->sqs, "{$this->queueName}-staging.fifo", $this->prefix, $suffix = '-staging');
- $this->assertEquals("{$this->prefix}{$this->queueName}{$suffix}.fifo", $queue->getQueue(null));
- $queueUrl = $this->baseUrl.'/'.$this->account.'/test'.$suffix.'.fifo';
- $this->assertEquals($queueUrl, $queue->getQueue('test-staging.fifo'));
- }
- }
|