11
11
12
12
namespace Symfony \Component \Messenger \Bridge \AmazonSqs \Tests \Transport ;
13
13
14
+ use AsyncAws \Core \Exception \Http \HttpException ;
15
+ use AsyncAws \Core \Test \ResultMockFactory ;
16
+ use AsyncAws \Sqs \Result \GetQueueUrlResult ;
17
+ use AsyncAws \Sqs \Result \ReceiveMessageResult ;
18
+ use AsyncAws \Sqs \SqsClient ;
19
+ use AsyncAws \Sqs \ValueObject \Message ;
14
20
use PHPUnit \Framework \TestCase ;
15
21
use Symfony \Component \Messenger \Bridge \AmazonSqs \Transport \Connection ;
16
- use Symfony \Component \Messenger \Exception \TransportException ;
17
22
use Symfony \Contracts \HttpClient \HttpClientInterface ;
18
- use Symfony \Contracts \HttpClient \ResponseInterface ;
19
23
20
24
class ConnectionTest extends TestCase
21
25
{
@@ -31,7 +35,7 @@ public function testFromDsn()
31
35
{
32
36
$ httpClient = $ this ->getMockBuilder (HttpClientInterface::class)->getMock ();
33
37
$ this ->assertEquals (
34
- new Connection (['endpoint ' => 'https://sqs. eu-west-1.amazonaws.com ' , 'queue_name ' => ' queue ' ], $ httpClient ),
38
+ new Connection (['queue_name ' => 'queue ' ], new SqsClient ([ ' region ' => ' eu-west-1 ' , 'accessKeyId ' => null , ' accessKeySecret ' => null ], null , $ httpClient) ),
35
39
Connection::fromDsn ('sqs://default/queue ' , [], $ httpClient )
36
40
);
37
41
}
@@ -40,16 +44,16 @@ public function testFromDsnWithRegion()
40
44
{
41
45
$ httpClient = $ this ->getMockBuilder (HttpClientInterface::class)->getMock ();
42
46
$ this ->assertEquals (
43
- new Connection (['endpoint ' => 'https://sqs.us-east-1.amazonaws.com ' , ' queue_name ' => 'queue ' , 'region ' => ' us-east-1 ' ], $ httpClient ),
44
- Connection::fromDsn ('sqs://default/queue?region=us-east-1 ' , [], $ httpClient )
47
+ new Connection (['queue_name ' => 'queue ' ], new SqsClient ([ ' region ' => 'us-west-2 ' , 'accessKeyId ' => null , ' accessKeySecret ' => null ], null , $ httpClient) ),
48
+ Connection::fromDsn ('sqs://default/queue?region=us-west-2 ' , [], $ httpClient )
45
49
);
46
50
}
47
51
48
52
public function testFromDsnWithCustomEndpoint ()
49
53
{
50
54
$ httpClient = $ this ->getMockBuilder (HttpClientInterface::class)->getMock ();
51
55
$ this ->assertEquals (
52
- new Connection (['endpoint ' => 'https://localhost ' , 'queue_name ' => ' queue ' ], $ httpClient ),
56
+ new Connection (['queue_name ' => ' queue ' ], new SqsClient ([ ' region ' => ' eu-west-1 ' , ' endpoint ' => 'https://localhost ' , 'accessKeyId ' => null , ' accessKeySecret ' => null ], null , $ httpClient) ),
53
57
Connection::fromDsn ('sqs://localhost/queue ' , [], $ httpClient )
54
58
);
55
59
}
@@ -58,7 +62,7 @@ public function testFromDsnWithCustomEndpointAndPort()
58
62
{
59
63
$ httpClient = $ this ->getMockBuilder (HttpClientInterface::class)->getMock ();
60
64
$ this ->assertEquals (
61
- new Connection (['endpoint ' => 'https://localhost:1234 ' , 'queue_name ' => ' queue ' ], $ httpClient ),
65
+ new Connection (['queue_name ' => ' queue ' ], new SqsClient ([ ' region ' => ' eu-west-1 ' , ' endpoint ' => 'https://localhost:1234 ' , 'accessKeyId ' => null , ' accessKeySecret ' => null ], null , $ httpClient) ),
62
66
Connection::fromDsn ('sqs://localhost:1234/queue ' , [], $ httpClient )
63
67
);
64
68
}
@@ -67,7 +71,7 @@ public function testFromDsnWithOptions()
67
71
{
68
72
$ httpClient = $ this ->getMockBuilder (HttpClientInterface::class)->getMock ();
69
73
$ this ->assertEquals (
70
- new Connection (['endpoint ' => 'https://sqs.eu-west-1.amazonaws.com ' , 'account ' => '213 ' , 'queue_name ' => ' queue ' , 'buffer_size ' => 1 , 'wait_time ' => 5 , 'auto_setup ' => false ], $ httpClient ),
74
+ new Connection (['account ' => '213 ' , 'queue_name ' => 'queue ' , 'buffer_size ' => 1 , ' wait_time ' => 5 , 'auto_setup ' => false ], new SqsClient ([ ' region ' => ' eu-west-1 ' , 'accessKeyId ' => null , 'accessKeySecret ' => null ], null , $ httpClient) ),
71
75
Connection::fromDsn ('sqs://default/213/queue ' , ['buffer_size ' => 1 , 'wait_time ' => 5 , 'auto_setup ' => false ], $ httpClient )
72
76
);
73
77
}
@@ -76,153 +80,63 @@ public function testFromDsnWithQueryOptions()
76
80
{
77
81
$ httpClient = $ this ->getMockBuilder (HttpClientInterface::class)->getMock ();
78
82
$ this ->assertEquals (
79
- new Connection (['endpoint ' => 'https://sqs.eu-west-1.amazonaws.com ' , 'account ' => '213 ' , 'queue_name ' => ' queue ' , 'buffer_size ' => 1 , 'wait_time ' => 5 , 'auto_setup ' => false ], $ httpClient ),
83
+ new Connection (['account ' => '213 ' , 'queue_name ' => 'queue ' , 'buffer_size ' => 1 , ' wait_time ' => 5 , 'auto_setup ' => false ], new SqsClient ([ ' region ' => ' eu-west-1 ' , 'accessKeyId ' => null , 'accessKeySecret ' => null ], null , $ httpClient) ),
80
84
Connection::fromDsn ('sqs://default/213/queue?buffer_size=1&wait_time=5&auto_setup=0 ' , [], $ httpClient )
81
85
);
82
86
}
83
87
84
- private function handleGetQueueUrl (int $ index , $ mock ): string
85
- {
86
- $ response = $ this ->getMockBuilder (ResponseInterface::class)->getMock ();
87
-
88
- $ mock ->expects ($ this ->at ($ index ))->method ('request ' )
89
- ->with ('POST ' , 'https://localhost ' , ['body ' => ['Action ' => 'GetQueueUrl ' , 'QueueName ' => 'queue ' ]])
90
- ->willReturn ($ response );
91
- $ response ->expects ($ this ->once ())->method ('getStatusCode ' )->willReturn (200 );
92
- $ response ->expects ($ this ->once ())->method ('getContent ' )->willReturn ('<GetQueueUrlResponse>
93
- <GetQueueUrlResult>
94
- <QueueUrl>https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue</QueueUrl>
95
- </GetQueueUrlResult>
96
- <ResponseMetadata>
97
- <RequestId>470a6f13-2ed9-4181-ad8a-2fdea142988e</RequestId>
98
- </ResponseMetadata>
99
- </GetQueueUrlResponse> ' );
100
-
101
- return 'https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue ' ;
102
- }
103
-
104
88
public function testKeepGettingPendingMessages ()
105
89
{
106
- $ httpClient = $ this ->getMockBuilder (HttpClientInterface::class)->getMock ();
107
- $ response = $ this ->getMockBuilder (ResponseInterface::class)->getMock ();
108
-
109
- $ queueUrl = $ this ->handleGetQueueUrl (0 , $ httpClient );
110
-
111
- $ httpClient ->expects ($ this ->at (1 ))->method ('request ' )
112
- ->with ('POST ' , $ queueUrl , ['body ' => ['Action ' => 'ReceiveMessage ' , 'VisibilityTimeout ' => null , 'MaxNumberOfMessages ' => 9 , 'WaitTimeSeconds ' => 20 , 'MessageAttributeName.1 ' => 'All ' ]])
113
- ->willReturn ($ response );
114
- $ response ->expects ($ this ->once ())->method ('getContent ' )->willReturn ('<ReceiveMessageResponse>
115
- <ReceiveMessageResult>
116
- <Message>
117
- <MessageId>5fea7756-0ea4-451a-a703-a558b933e274</MessageId>
118
- <ReceiptHandle>
119
- MbZj6wDWli+JvwwJaBV+3dcjk2YW2vA3+STFFljTM8tJJg6HRG6PYSasuWXPJB+Cw
120
- Lj1FjgXUv1uSj1gUPAWV66FU/WeR4mq2OKpEGYWbnLmpRCJVAyeMjeU5ZBdtcQ+QE
121
- auMZc8ZRv37sIW2iJKq3M9MFx1YvV11A2x/KSbkJ0=
122
- </ReceiptHandle>
123
- <MD5OfBody>fafb00f5732ab283681e124bf8747ed1</MD5OfBody>
124
- <Body>{"body":"this is a test","headers":{}}</Body>
125
- <Attribute>
126
- <Name>SenderId</Name>
127
- <Value>195004372649</Value>
128
- </Attribute>
129
- <Attribute>
130
- <Name>SentTimestamp</Name>
131
- <Value>1238099229000</Value>
132
- </Attribute>
133
- <Attribute>
134
- <Name>ApproximateReceiveCount</Name>
135
- <Value>5</Value>
136
- </Attribute>
137
- <Attribute>
138
- <Name>ApproximateFirstReceiveTimestamp</Name>
139
- <Value>1250700979248</Value>
140
- </Attribute>
141
- </Message>
142
- <Message>
143
- <MessageId>5fea7756-0ea4-451a-a703-a558b933e274</MessageId>
144
- <ReceiptHandle>
145
- MbZj6wDWli+JvwwJaBV+3dcjk2YW2vA3+STFFljTM8tJJg6HRG6PYSasuWXPJB+Cw
146
- Lj1FjgXUv1uSj1gUPAWV66FU/WeR4mq2OKpEGYWbnLmpRCJVAyeMjeU5ZBdtcQ+QE
147
- auMZc8ZRv37sIW2iJKq3M9MFx1YvV11A2x/KSbkJ0=
148
- </ReceiptHandle>
149
- <MD5OfBody>fafb00f5732ab283681e124bf8747ed1</MD5OfBody>
150
- <Body>{"body":"this is a test","headers":{}}</Body>
151
- <Attribute>
152
- <Name>SenderId</Name>
153
- <Value>195004372649</Value>
154
- </Attribute>
155
- <Attribute>
156
- <Name>SentTimestamp</Name>
157
- <Value>1238099229000</Value>
158
- </Attribute>
159
- <Attribute>
160
- <Name>ApproximateReceiveCount</Name>
161
- <Value>5</Value>
162
- </Attribute>
163
- <Attribute>
164
- <Name>ApproximateFirstReceiveTimestamp</Name>
165
- <Value>1250700979248</Value>
166
- </Attribute>
167
- </Message>
168
- <Message>
169
- <MessageId>5fea7756-0ea4-451a-a703-a558b933e274</MessageId>
170
- <ReceiptHandle>
171
- MbZj6wDWli+JvwwJaBV+3dcjk2YW2vA3+STFFljTM8tJJg6HRG6PYSasuWXPJB+Cw
172
- Lj1FjgXUv1uSj1gUPAWV66FU/WeR4mq2OKpEGYWbnLmpRCJVAyeMjeU5ZBdtcQ+QE
173
- auMZc8ZRv37sIW2iJKq3M9MFx1YvV11A2x/KSbkJ0=
174
- </ReceiptHandle>
175
- <MD5OfBody>fafb00f5732ab283681e124bf8747ed1</MD5OfBody>
176
- <Body>{"body":"this is a test","headers":{}}</Body>
177
- <Attribute>
178
- <Name>SenderId</Name>
179
- <Value>195004372649</Value>
180
- </Attribute>
181
- <Attribute>
182
- <Name>SentTimestamp</Name>
183
- <Value>1238099229000</Value>
184
- </Attribute>
185
- <Attribute>
186
- <Name>ApproximateReceiveCount</Name>
187
- <Value>5</Value>
188
- </Attribute>
189
- <Attribute>
190
- <Name>ApproximateFirstReceiveTimestamp</Name>
191
- <Value>1250700979248</Value>
192
- </Attribute>
193
- </Message>
194
- </ReceiveMessageResult>
195
- <ResponseMetadata>
196
- <RequestId>b6633655-283d-45b4-aee4-4e84e0ae6afa</RequestId>
197
- </ResponseMetadata>
198
- </ReceiveMessageResponse> ' );
199
-
200
- $ connection = Connection::fromDsn ('sqs://localhost/queue ' , ['auto_setup ' => false ], $ httpClient );
90
+ $ client = $ this ->createMock (SqsClient::class);
91
+ $ client ->expects ($ this ->any ())
92
+ ->method ('getQueueUrl ' )
93
+ ->with (['QueueName ' => 'queue ' , 'QueueOwnerAWSAccountId ' => 123 ])
94
+ ->willReturn (ResultMockFactory::create (GetQueueUrlResult::class, ['QueueUrl ' => 'https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue ' ]));
95
+ $ client ->expects ($ this ->at (1 ))
96
+ ->method ('receiveMessage ' )
97
+ ->with ([
98
+ 'QueueUrl ' => 'https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue ' ,
99
+ 'MaxNumberOfMessages ' => 9 ,
100
+ 'WaitTimeSeconds ' => 20 ,
101
+ 'MessageAttributeNames ' => ['All ' ],
102
+ 'VisibilityTimeout ' => null ,
103
+ ])
104
+ ->willReturn (ResultMockFactory::create (ReceiveMessageResult::class, ['Messages ' => [
105
+ new Message (['MessageId ' => 1 , 'Body ' => 'this is a test ' ]),
106
+ new Message (['MessageId ' => 2 , 'Body ' => 'this is a test ' ]),
107
+ new Message (['MessageId ' => 3 , 'Body ' => 'this is a test ' ]),
108
+ ]]));
109
+ $ client ->expects ($ this ->at (2 ))
110
+ ->method ('receiveMessage ' )
111
+ ->with ([
112
+ 'QueueUrl ' => 'https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue ' ,
113
+ 'MaxNumberOfMessages ' => 9 ,
114
+ 'WaitTimeSeconds ' => 20 ,
115
+ 'MessageAttributeNames ' => ['All ' ],
116
+ 'VisibilityTimeout ' => null ,
117
+ ])
118
+ ->willReturn (ResultMockFactory::create (ReceiveMessageResult::class, ['Messages ' => [
119
+ ]]));
120
+
121
+ $ connection = new Connection (['queue_name ' => 'queue ' , 'account ' => 123 , 'auto_setup ' => false ], $ client );
201
122
$ this ->assertNotNull ($ connection ->get ());
202
123
$ this ->assertNotNull ($ connection ->get ());
203
124
$ this ->assertNotNull ($ connection ->get ());
125
+ $ this ->assertNull ($ connection ->get ());
204
126
}
205
127
206
128
public function testUnexpectedSqsError ()
207
129
{
208
- $ this ->expectException (TransportException ::class);
130
+ $ this ->expectException (HttpException ::class);
209
131
$ this ->expectExceptionMessage ('SQS error happens ' );
210
132
211
- $ httpClient = $ this ->getMockBuilder (HttpClientInterface::class)->getMock ();
212
- $ response = $ this ->getMockBuilder (ResponseInterface::class)->getMock ();
213
-
214
- $ httpClient ->expects ($ this ->once ())->method ('request ' )->willReturn ($ response );
215
- $ response ->expects ($ this ->once ())->method ('getStatusCode ' )->willReturn (400 );
216
- $ response ->expects ($ this ->once ())->method ('getContent ' )->willReturn ('<ErrorResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">
217
- <Error>
218
- <Type>Sender</Type>
219
- <Code>boom</Code>
220
- <Message>SQS error happens</Message>
221
- <Detail/>
222
- </Error>
223
- <RequestId>30441e49-5246-5231-9c87-4bd704b81ce9</RequestId>
224
- </ErrorResponse> ' );
225
- $ connection = Connection::fromDsn ('sqs://localhost/queue ' , [], $ httpClient );
133
+ $ client = $ this ->createMock (SqsClient::class);
134
+ $ client ->expects ($ this ->any ())
135
+ ->method ('getQueueUrl ' )
136
+ ->with (['QueueName ' => 'queue ' , 'QueueOwnerAWSAccountId ' => 123 ])
137
+ ->willReturn (ResultMockFactory::createFailing (GetQueueUrlResult::class, 400 , 'SQS error happens ' ));
138
+
139
+ $ connection = new Connection (['queue_name ' => 'queue ' , 'account ' => 123 , 'auto_setup ' => false ], $ client );
226
140
$ connection ->get ();
227
141
}
228
142
}
0 commit comments