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