diff --git a/src/Symfony/Component/Messenger/Bridge/AmazonSqs/CHANGELOG.md b/src/Symfony/Component/Messenger/Bridge/AmazonSqs/CHANGELOG.md index 03a7df3723..5955073088 100644 --- a/src/Symfony/Component/Messenger/Bridge/AmazonSqs/CHANGELOG.md +++ b/src/Symfony/Component/Messenger/Bridge/AmazonSqs/CHANGELOG.md @@ -5,6 +5,7 @@ CHANGELOG ----- * Added new `debug` option to log HTTP requests and responses. + * Allowed for receiver & sender injection into AmazonSqsTransport 5.2.0 ----- diff --git a/src/Symfony/Component/Messenger/Bridge/AmazonSqs/Tests/Transport/AmazonSqsTransportTest.php b/src/Symfony/Component/Messenger/Bridge/AmazonSqs/Tests/Transport/AmazonSqsTransportTest.php index 34e0bf1502..80e53b9164 100644 --- a/src/Symfony/Component/Messenger/Bridge/AmazonSqs/Tests/Transport/AmazonSqsTransportTest.php +++ b/src/Symfony/Component/Messenger/Bridge/AmazonSqs/Tests/Transport/AmazonSqsTransportTest.php @@ -11,17 +11,55 @@ namespace Symfony\Component\Messenger\Bridge\AmazonSqs\Tests\Transport; +use AsyncAws\Core\Exception\Http\HttpException; +use AsyncAws\Core\Exception\Http\ServerException; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Symfony\Component\Messenger\Bridge\AmazonSqs\Tests\Fixtures\DummyMessage; +use Symfony\Component\Messenger\Bridge\AmazonSqs\Transport\AmazonSqsReceiver; use Symfony\Component\Messenger\Bridge\AmazonSqs\Transport\AmazonSqsTransport; use Symfony\Component\Messenger\Bridge\AmazonSqs\Transport\Connection; use Symfony\Component\Messenger\Envelope; +use Symfony\Component\Messenger\Exception\TransportException; use Symfony\Component\Messenger\Transport\Receiver\MessageCountAwareInterface; +use Symfony\Component\Messenger\Transport\Receiver\ReceiverInterface; +use Symfony\Component\Messenger\Transport\Sender\SenderInterface; use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface; use Symfony\Component\Messenger\Transport\TransportInterface; +use Symfony\Contracts\HttpClient\ResponseInterface; class AmazonSqsTransportTest extends TestCase { + /** + * @var MockObject|Connection + */ + private $connection; + + /** + * @var MockObject|ReceiverInterface + */ + private $receiver; + + /** + * @var MockObject|SenderInterface|MessageCountAwareInterface + */ + private $sender; + + /** + * @var AmazonSqsTransport + */ + private $transport; + + protected function setUp(): void + { + $this->connection = $this->createMock(Connection::class); + // Mocking the concrete receiver class because mocking multiple interfaces is deprecated + $this->receiver = $this->createMock(AmazonSqsReceiver::class); + $this->sender = $this->createMock(SenderInterface::class); + + $this->transport = new AmazonSqsTransport($this->connection, null, $this->receiver, $this->sender); + } + public function testItIsATransport() { $transport = $this->getTransport(); @@ -58,6 +96,77 @@ class AmazonSqsTransportTest extends TestCase $this->assertInstanceOf(MessageCountAwareInterface::class, $transport); } + public function testItCanGetMessagesViaTheReceiver(): void + { + $envelopes = [new Envelope(new \stdClass()), new Envelope(new \stdClass())]; + $this->receiver->expects($this->once())->method('get')->willReturn($envelopes); + $this->assertSame($envelopes, $this->transport->get()); + } + + public function testItCanAcknowledgeAMessageViaTheReceiver(): void + { + $envelope = new Envelope(new \stdClass()); + $this->receiver->expects($this->once())->method('ack')->with($envelope); + $this->transport->ack($envelope); + } + + public function testItCanRejectAMessageViaTheReceiver(): void + { + $envelope = new Envelope(new \stdClass()); + $this->receiver->expects($this->once())->method('reject')->with($envelope); + $this->transport->reject($envelope); + } + + public function testItCanGetMessageCountViaTheReceiver(): void + { + $messageCount = 15; + $this->receiver->expects($this->once())->method('getMessageCount')->willReturn($messageCount); + $this->assertSame($messageCount, $this->transport->getMessageCount()); + } + + public function testItCanSendAMessageViaTheSender(): void + { + $envelope = new Envelope(new \stdClass()); + $this->sender->expects($this->once())->method('send')->with($envelope)->willReturn($envelope); + $this->assertSame($envelope, $this->transport->send($envelope)); + } + + public function testItCanSetUpTheConnection(): void + { + $this->connection->expects($this->once())->method('setup'); + $this->transport->setup(); + } + + public function testItConvertsHttpExceptionDuringSetupIntoTransportException(): void + { + $this->connection + ->expects($this->once()) + ->method('setup') + ->willThrowException($this->createHttpException()); + + $this->expectException(TransportException::class); + + $this->transport->setup(); + } + + public function testItCanResetTheConnection(): void + { + $this->connection->expects($this->once())->method('reset'); + $this->transport->reset(); + } + + public function testItConvertsHttpExceptionDuringResetIntoTransportException(): void + { + $this->connection + ->expects($this->once()) + ->method('reset') + ->willThrowException($this->createHttpException()); + + $this->expectException(TransportException::class); + + $this->transport->reset(); + } + private function getTransport(SerializerInterface $serializer = null, Connection $connection = null) { $serializer = $serializer ?: $this->getMockBuilder(SerializerInterface::class)->getMock(); @@ -65,4 +174,9 @@ class AmazonSqsTransportTest extends TestCase return new AmazonSqsTransport($connection, $serializer); } + + private function createHttpException(): HttpException + { + return new ServerException($this->createMock(ResponseInterface::class)); + } } diff --git a/src/Symfony/Component/Messenger/Bridge/AmazonSqs/Transport/AmazonSqsTransport.php b/src/Symfony/Component/Messenger/Bridge/AmazonSqs/Transport/AmazonSqsTransport.php index cf84fce11c..50c7b8ff9a 100644 --- a/src/Symfony/Component/Messenger/Bridge/AmazonSqs/Transport/AmazonSqsTransport.php +++ b/src/Symfony/Component/Messenger/Bridge/AmazonSqs/Transport/AmazonSqsTransport.php @@ -15,6 +15,8 @@ use AsyncAws\Core\Exception\Http\HttpException; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Exception\TransportException; use Symfony\Component\Messenger\Transport\Receiver\MessageCountAwareInterface; +use Symfony\Component\Messenger\Transport\Receiver\ReceiverInterface; +use Symfony\Component\Messenger\Transport\Sender\SenderInterface; use Symfony\Component\Messenger\Transport\Serialization\PhpSerializer; use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface; use Symfony\Component\Messenger\Transport\SetupableTransportInterface; @@ -31,10 +33,12 @@ class AmazonSqsTransport implements TransportInterface, SetupableTransportInterf private $receiver; private $sender; - public function __construct(Connection $connection, SerializerInterface $serializer = null) + public function __construct(Connection $connection, SerializerInterface $serializer = null, ReceiverInterface $receiver = null, SenderInterface $sender = null) { $this->connection = $connection; $this->serializer = $serializer ?? new PhpSerializer(); + $this->receiver = $receiver; + $this->sender = $sender; } /**