Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 159de19

Browse files
committed
snsqs tests
1 parent a35a323 commit 159de19

18 files changed

+451
-30
lines changed

bin/subtree-split

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ split 'pkg/redis' redis
8484
split 'pkg/dbal' dbal
8585
split 'pkg/null' null
8686
split 'pkg/sqs' sqs
87+
split 'pkg/sns' sns
88+
split 'pkg/snsqs' snsqs
8789
split 'pkg/gps' gps
8890
split 'pkg/enqueue-bundle' enqueue-bundle
8991
split 'pkg/job-queue' job-queue

pkg/sns/SnsClient.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ public function createTopic(array $args): Result
3838
return $this->callApi('createTopic', $args);
3939
}
4040

41+
public function deleteTopic(string $topicArn): Result
42+
{
43+
return $this->callApi('DeleteTopic', [
44+
'TopicArn' => $topicArn,
45+
]);
46+
}
47+
4148
public function publish(array $args): Result
4249
{
4350
return $this->callApi('publish', $args);

pkg/sns/SnsContext.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,13 @@ public function declareTopic(SnsDestination $destination): void
7777
$this->topicArns[$destination->getTopicName()] = (string) $result->get('TopicArn');
7878
}
7979

80+
public function deleteTopic(SnsDestination $destination): void
81+
{
82+
$this->client->deleteTopic($this->getTopicArn($destination));
83+
84+
unset($this->topicArns[$destination->getTopicName()]);
85+
}
86+
8087
public function subscribe(SnsSubscribe $subscribe): void
8188
{
8289
foreach ($this->getSubscriptions($subscribe->getTopic()) as $subscription) {

pkg/snsqs/SnsQsConsumer.php

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,19 +84,31 @@ private function convertMessage(SqsMessage $sqsMessage): SnsQsMessage
8484
$message->setRedelivered($sqsMessage->isRedelivered());
8585
$message->setSqsMessage($sqsMessage);
8686

87-
$data = json_decode($sqsMessage->getBody(), true);
87+
$body = $sqsMessage->getBody();
8888

89-
if (isset($data['Message'])) {
90-
$message->setBody((string) $data['Message']);
91-
}
89+
if (isset($body[0]) && $body[0] === '{') {
90+
$data = json_decode($sqsMessage->getBody(), true);
91+
92+
if (isset($data['TopicArn']) && isset($data['Type']) && $data['Type'] === 'Notification') {
93+
// SNS message conversion
94+
if (isset($data['Message'])) {
95+
$message->setBody((string) $data['Message']);
96+
}
9297

93-
if (isset($data['MessageAttributes']['Headers'])) {
94-
$headersData = json_decode($data['MessageAttributes']['Headers']['Value'], true);
98+
if (isset($data['MessageAttributes']['Headers'])) {
99+
$headersData = json_decode($data['MessageAttributes']['Headers']['Value'], true);
95100

96-
$message->setHeaders($headersData[0]);
97-
$message->setProperties($headersData[1]);
101+
$message->setHeaders($headersData[0]);
102+
$message->setProperties($headersData[1]);
103+
}
104+
105+
return $message;
106+
}
98107
}
99108

109+
$message->setBody($sqsMessage->getBody());
110+
$message->setProperties($sqsMessage->getProperties());
111+
100112
return $message;
101113
}
102114
}

pkg/snsqs/SnsQsContext.php

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public function createTemporaryQueue(): Queue
104104

105105
public function createProducer(): Producer
106106
{
107-
return new SnsQsProducer($this->getSnsContext());
107+
return new SnsQsProducer($this->getSnsContext(), $this->getSqsContext());
108108
}
109109

110110
/**
@@ -134,18 +134,24 @@ public function createSubscriptionConsumer(): SubscriptionConsumer
134134

135135
public function declareTopic(SnsQsTopic $topic): void
136136
{
137-
InvalidDestinationException::assertDestinationInstanceOf($topic, SnsQsTopic::class);
138-
139137
$this->getSnsContext()->declareTopic($topic);
140138
}
141139

142-
public function declareQueue(SnsQsQueue $queue): void
140+
public function deleteTopic(SnsQsTopic $topic): void
143141
{
144-
InvalidDestinationException::assertDestinationInstanceOf($queue, SnsQsQueue::class);
142+
$this->getSnsContext()->deleteTopic($topic);
143+
}
145144

145+
public function declareQueue(SnsQsQueue $queue): void
146+
{
146147
$this->getSqsContext()->declareQueue($queue);
147148
}
148149

150+
public function deleteQueue(SnsQsQueue $queue): void
151+
{
152+
$this->getSqsContext()->deleteQueue($queue);
153+
}
154+
149155
public function bind(SnsQsTopic $topic, SnsQsQueue $queue): void
150156
{
151157
$this->getSnsContext()->subscribe(new SnsSubscribe(

pkg/snsqs/SnsQsProducer.php

Lines changed: 63 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
use Enqueue\Sns\SnsContext;
88
use Enqueue\Sns\SnsProducer;
9+
use Enqueue\Sqs\SqsContext;
10+
use Enqueue\Sqs\SqsProducer;
911
use Interop\Queue\Destination;
1012
use Interop\Queue\Exception\InvalidDestinationException;
1113
use Interop\Queue\Exception\InvalidMessageException;
@@ -17,16 +19,27 @@ class SnsQsProducer implements Producer
1719
/**
1820
* @var SnsContext
1921
*/
20-
private $context;
22+
private $snsContext;
2123

2224
/**
2325
* @var SnsProducer
2426
*/
25-
private $producer;
27+
private $snsProducer;
2628

27-
public function __construct(SnsContext $context)
29+
/**
30+
* @var SqsContext
31+
*/
32+
private $sqsContext;
33+
34+
/**
35+
* @var SqsProducer
36+
*/
37+
private $sqsProducer;
38+
39+
public function __construct(SnsContext $snsContext, SqsContext $sqsContext)
2840
{
29-
$this->context = $context;
41+
$this->snsContext = $snsContext;
42+
$this->sqsContext = $sqsContext;
3043
}
3144

3245
/**
@@ -35,56 +48,89 @@ public function __construct(SnsContext $context)
3548
*/
3649
public function send(Destination $destination, Message $message): void
3750
{
38-
InvalidDestinationException::assertDestinationInstanceOf($destination, SnsQsTopic::class);
3951
InvalidMessageException::assertMessageInstanceOf($message, SnsQsMessage::class);
4052

41-
$snsMessage = $this->context->createMessage($message->getBody(), $message->getProperties(), $message->getHeaders());
53+
if (false == $destination instanceof SnsQsTopic && false == $destination instanceof SnsQsQueue) {
54+
throw new InvalidDestinationException(sprintf(
55+
'The destination must be an instance of [%s|%s] but got %s.',
56+
SnsQsTopic::class, SnsQsQueue::class,
57+
is_object($destination) ? get_class($destination) : gettype($destination)
58+
));
59+
}
4260

43-
$this->getProducer()->send($destination, $snsMessage);
61+
if ($destination instanceof SnsQsTopic) {
62+
$snsMessage = $this->snsContext->createMessage(
63+
$message->getBody(),
64+
$message->getProperties(),
65+
$message->getHeaders()
66+
);
67+
68+
$this->getSnsProducer()->send($destination, $snsMessage);
69+
} else {
70+
$sqsMessage = $this->sqsContext->createMessage(
71+
$message->getBody(),
72+
$message->getProperties(),
73+
$message->getHeaders()
74+
);
75+
76+
$this->getSqsProducer()->send($destination, $sqsMessage);
77+
}
4478
}
4579

4680
public function setDeliveryDelay(int $deliveryDelay = null): Producer
4781
{
48-
$this->getProducer()->setDeliveryDelay($deliveryDelay);
82+
$this->getSnsProducer()->setDeliveryDelay($deliveryDelay);
83+
$this->getSqsProducer()->setDeliveryDelay($deliveryDelay);
4984

5085
return $this;
5186
}
5287

5388
public function getDeliveryDelay(): ?int
5489
{
55-
return $this->getProducer()->getDeliveryDelay();
90+
return $this->getSnsProducer()->getDeliveryDelay();
5691
}
5792

5893
public function setPriority(int $priority = null): Producer
5994
{
60-
$this->getProducer()->setPriority($priority);
95+
$this->getSnsProducer()->setPriority($priority);
96+
$this->getSqsProducer()->setPriority($priority);
6197

6298
return $this;
6399
}
64100

65101
public function getPriority(): ?int
66102
{
67-
return $this->getProducer()->getPriority();
103+
return $this->getSnsProducer()->getPriority();
68104
}
69105

70106
public function setTimeToLive(int $timeToLive = null): Producer
71107
{
72-
$this->getProducer()->setTimeToLive($timeToLive);
108+
$this->getSnsProducer()->setTimeToLive($timeToLive);
109+
$this->getSqsProducer()->setTimeToLive($timeToLive);
73110

74111
return $this;
75112
}
76113

77114
public function getTimeToLive(): ?int
78115
{
79-
return $this->getProducer()->getTimeToLive();
116+
return $this->getSnsProducer()->getTimeToLive();
117+
}
118+
119+
private function getSnsProducer(): SnsProducer
120+
{
121+
if (null === $this->snsProducer) {
122+
$this->snsProducer = $this->snsContext->createProducer();
123+
}
124+
125+
return $this->snsProducer;
80126
}
81127

82-
private function getProducer(): SnsProducer
128+
private function getSqsProducer(): SqsProducer
83129
{
84-
if (null === $this->producer) {
85-
$this->producer = $this->context->createProducer();
130+
if (null === $this->sqsProducer) {
131+
$this->sqsProducer = $this->sqsContext->createProducer();
86132
}
87133

88-
return $this->producer;
134+
return $this->sqsProducer;
89135
}
90136
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace Enqueue\SnsQs\Tests\Spec;
4+
5+
use Enqueue\SnsQs\SnsQsConnectionFactory;
6+
use Interop\Queue\ConnectionFactory;
7+
use Interop\Queue\Spec\ConnectionFactorySpec;
8+
9+
class SnsQsConnectionFactoryTest extends ConnectionFactorySpec
10+
{
11+
/**
12+
* @return ConnectionFactory
13+
*/
14+
protected function createConnectionFactory()
15+
{
16+
return new SnsQsConnectionFactory('snsqs:');
17+
}
18+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace Enqueue\SnsQs\Tests\Spec;
4+
5+
use Enqueue\Sns\SnsContext;
6+
use Enqueue\SnsQs\SnsQsContext;
7+
use Enqueue\Sqs\SqsConsumer;
8+
use Enqueue\Sqs\SqsContext;
9+
use Interop\Queue\Spec\ContextSpec;
10+
11+
class SnsQsContextTest extends ContextSpec
12+
{
13+
protected function createContext()
14+
{
15+
$sqsContext = $this->createMock(SqsContext::class);
16+
$sqsContext
17+
->expects($this->any())
18+
->method('createConsumer')
19+
->willReturn($this->createMock(SqsConsumer::class))
20+
;
21+
22+
return new SnsQsContext(
23+
$this->createMock(SnsContext::class),
24+
$sqsContext
25+
);
26+
}
27+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<?php
2+
3+
namespace Enqueue\SnsQs\Tests\Spec;
4+
5+
use Enqueue\SnsQs\SnsQsContext;
6+
use Enqueue\SnsQs\SnsQsQueue;
7+
use Enqueue\SnsQs\SnsQsTopic;
8+
use Enqueue\Test\SnsQsExtension;
9+
10+
trait SnsQsFactoryTrait
11+
{
12+
use SnsQsExtension;
13+
14+
/**
15+
* @var SnsQsContext
16+
*/
17+
private $snsQsContext;
18+
19+
/**
20+
* @var SnsQsTopic
21+
*/
22+
private $snsQsTopic;
23+
24+
/**
25+
* @var SnsQsQueue
26+
*/
27+
private $snsQsQueue;
28+
29+
protected function createSnsQsContext(): SnsQsContext
30+
{
31+
return $this->snsQsContext = $this->buildSnsQsContext();
32+
}
33+
34+
protected function createSnsQsQueue(string $queueName): SnsQsQueue
35+
{
36+
$queueName = $queueName.time();
37+
38+
$this->snsQsQueue = $this->snsQsContext->createQueue($queueName);
39+
$this->snsQsContext->declareQueue($this->snsQsQueue);
40+
41+
if ($this->snsQsTopic) {
42+
$this->snsQsContext->bind($this->snsQsTopic, $this->snsQsQueue);
43+
}
44+
45+
return $this->snsQsQueue;
46+
}
47+
48+
protected function createSnsQsTopic(string $topicName): SnsQsTopic
49+
{
50+
$topicName = $topicName.time();
51+
52+
$this->snsQsTopic = $this->snsQsContext->createTopic($topicName);
53+
$this->snsQsContext->declareTopic($this->snsQsTopic);
54+
55+
return $this->snsQsTopic;
56+
}
57+
58+
protected function cleanUpSnsQs(): void
59+
{
60+
if ($this->snsQsTopic) {
61+
$this->snsQsContext->deleteTopic($this->snsQsTopic);
62+
}
63+
64+
if ($this->snsQsQueue) {
65+
$this->snsQsContext->deleteQueue($this->snsQsQueue);
66+
}
67+
}
68+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Enqueue\SnsQs\Tests\Spec;
4+
5+
use Enqueue\SnsQs\SnsQsMessage;
6+
use Interop\Queue\Spec\MessageSpec;
7+
8+
class SnsQsMessageTest extends MessageSpec
9+
{
10+
protected function createMessage()
11+
{
12+
return new SnsQsMessage();
13+
}
14+
}

0 commit comments

Comments
 (0)