9
9
* file that was distributed with this source code.
10
10
*/
11
11
12
- use PHPUnit \Framework \MockObject \MockObject ;
13
12
use Symfony \Component \HttpClient \MockHttpClient ;
13
+ use Symfony \Component \HttpClient \Response \JsonMockResponse ;
14
+ use Symfony \Component \HttpClient \Response \MockResponse ;
14
15
use Symfony \Component \Notifier \Bridge \Lox24 \Lox24Options ;
15
16
use Symfony \Component \Notifier \Bridge \Lox24 \Lox24Transport ;
16
17
use Symfony \Component \Notifier \Bridge \Lox24 \Type ;
25
26
use Symfony \Component \Notifier \Message \SmsMessage ;
26
27
use Symfony \Component \Notifier \Test \TransportTestCase ;
27
28
use Symfony \Contracts \HttpClient \HttpClientInterface ;
28
- use Symfony \Contracts \HttpClient \ResponseInterface ;
29
29
30
30
/**
31
31
* @author Andrei Lebedev <andrew.lebedev@gmail.com>
@@ -48,13 +48,6 @@ class Lox24TransportTest extends TransportTestCase
48
48
'service_code ' => 'direct ' ,
49
49
];
50
50
51
- private MockObject |HttpClientInterface $ client ;
52
-
53
- protected function setUp (): void
54
- {
55
- $ this ->client = $ this ->createMock (HttpClientInterface::class);
56
- }
57
-
58
51
public static function createTransport (?HttpClientInterface $ client = null ): Lox24Transport
59
52
{
60
53
return (new Lox24Transport ('user ' , 'token ' , 'sender ' , ['type ' => 'voice ' ], $ client ?? new MockHttpClient ()))->setHost ('host.test ' );
@@ -102,30 +95,31 @@ public function testSendWithInvalidMessageType()
102
95
103
96
public function testMessageFromNotEmpty ()
104
97
{
105
- $ this ->assertRequestBody ([
98
+ $ client = $ this ->mockHttpClient ([
106
99
'sender_id ' => 'testFrom2 ' ,
107
100
'phone ' => '+1411111111 ' ,
108
101
'text ' => 'test text ' ,
109
102
'is_text_deleted ' => false ,
110
103
'delivery_at ' => 0 ,
111
104
'service_code ' => 'direct ' ,
112
105
], [], 201 , ['uuid ' => '123456 ' ]);
113
- $ transport = new Lox24Transport ('user ' , 'token ' , 'testFrom ' , [], $ this ->client );
106
+
107
+ $ transport = new Lox24Transport ('user ' , 'token ' , 'testFrom ' , [], $ client );
114
108
$ message = new SmsMessage ('+1411111111 ' , 'test text ' , 'testFrom2 ' );
115
109
$ transport ->send ($ message );
116
110
}
117
111
118
112
public function testMessageFromEmpty ()
119
113
{
120
- $ this ->assertRequestBody ([
114
+ $ client = $ this ->mockHttpClient ([
121
115
'sender_id ' => 'testFrom ' ,
122
116
'phone ' => '+1411111111 ' ,
123
117
'text ' => 'test text ' ,
124
118
'is_text_deleted ' => false ,
125
119
'delivery_at ' => 0 ,
126
120
'service_code ' => 'direct ' ,
127
121
], [], 201 , ['uuid ' => '123456 ' ]);
128
- $ transport = new Lox24Transport ('user ' , 'token ' , 'testFrom ' , [], $ this -> client );
122
+ $ transport = new Lox24Transport ('user ' , 'token ' , 'testFrom ' , [], $ client );
129
123
$ message = new SmsMessage ('+1411111111 ' , 'test text ' );
130
124
$ transport ->send ($ message );
131
125
}
@@ -143,15 +137,15 @@ public function testMessageFromInvalid()
143
137
144
138
public function testOptionIsTextDeleted ()
145
139
{
146
- $ this ->assertRequestBody ([
140
+ $ client = $ this ->mockHttpClient ([
147
141
'sender_id ' => 'testFrom ' ,
148
142
'phone ' => '+1411111111 ' ,
149
143
'text ' => 'test text ' ,
150
144
'is_text_deleted ' => true ,
151
145
'delivery_at ' => 0 ,
152
146
'service_code ' => 'direct ' ,
153
147
], [], 201 , ['uuid ' => '123456 ' ]);
154
- $ transport = new Lox24Transport ('user ' , 'token ' , 'testFrom ' , [], $ this -> client );
148
+ $ transport = new Lox24Transport ('user ' , 'token ' , 'testFrom ' , [], $ client );
155
149
156
150
$ options = (new Lox24Options ())->deleteTextAfterSending (true );
157
151
$ message = new SmsMessage ('+1411111111 ' , 'test text ' );
@@ -162,15 +156,15 @@ public function testOptionIsTextDeleted()
162
156
163
157
public function testOptionDeliveryAtGreaterThanZero ()
164
158
{
165
- $ this ->assertRequestBody ([
159
+ $ client = $ this ->mockHttpClient ([
166
160
'sender_id ' => 'testFrom ' ,
167
161
'phone ' => '+1411111111 ' ,
168
162
'text ' => 'test text ' ,
169
163
'is_text_deleted ' => false ,
170
164
'delivery_at ' => 1000000000 ,
171
165
'service_code ' => 'direct ' ,
172
166
], [], 201 , ['uuid ' => '123456 ' ]);
173
- $ transport = new Lox24Transport ('user ' , 'token ' , 'testFrom ' , [], $ this -> client );
167
+ $ transport = new Lox24Transport ('user ' , 'token ' , 'testFrom ' , [], $ client );
174
168
175
169
$ options = (new Lox24Options ())->deliveryAt ((new DateTimeImmutable ())->setTimestamp (1000000000 ));
176
170
$ message = new SmsMessage ('+1411111111 ' , 'test text ' );
@@ -181,7 +175,7 @@ public function testOptionDeliveryAtGreaterThanZero()
181
175
182
176
public function testOptionVoiceLanguageSpanish ()
183
177
{
184
- $ this ->assertRequestBody ([
178
+ $ client = $ this ->mockHttpClient ([
185
179
'sender_id ' => 'testFrom ' ,
186
180
'phone ' => '+1411111111 ' ,
187
181
'text ' => 'test text ' ,
@@ -190,7 +184,7 @@ public function testOptionVoiceLanguageSpanish()
190
184
'service_code ' => 'text2speech ' ,
191
185
'voice_lang ' => 'ES ' ,
192
186
], [], 201 , ['uuid ' => '123456 ' ]);
193
- $ transport = new Lox24Transport ('user ' , 'token ' , 'testFrom ' , [], $ this -> client );
187
+ $ transport = new Lox24Transport ('user ' , 'token ' , 'testFrom ' , [], $ client );
194
188
195
189
$ options = (new Lox24Options ())
196
190
->voiceLanguage (VoiceLanguage::Spanish)
@@ -203,15 +197,15 @@ public function testOptionVoiceLanguageSpanish()
203
197
204
198
public function testOptionVoiceLanguageAuto ()
205
199
{
206
- $ this ->assertRequestBody ([
200
+ $ client = $ this ->mockHttpClient ([
207
201
'sender_id ' => 'testFrom ' ,
208
202
'phone ' => '+1411111111 ' ,
209
203
'text ' => 'test text ' ,
210
204
'is_text_deleted ' => false ,
211
205
'delivery_at ' => 0 ,
212
206
'service_code ' => 'text2speech ' ,
213
207
], [], 201 , ['uuid ' => '123456 ' ]);
214
- $ transport = new Lox24Transport ('user ' , 'token ' , 'testFrom ' , [], $ this -> client );
208
+ $ transport = new Lox24Transport ('user ' , 'token ' , 'testFrom ' , [], $ client );
215
209
216
210
$ options = (new Lox24Options ())
217
211
->voiceLanguage (VoiceLanguage::Auto)
@@ -224,7 +218,7 @@ public function testOptionVoiceLanguageAuto()
224
218
225
219
public function testOptionType ()
226
220
{
227
- $ this ->assertRequestBody ([
221
+ $ client = $ this ->mockHttpClient ([
228
222
'sender_id ' => 'testFrom ' ,
229
223
'phone ' => '+1411111111 ' ,
230
224
'text ' => 'test text ' ,
@@ -233,7 +227,7 @@ public function testOptionType()
233
227
'service_code ' => 'direct ' ,
234
228
], [], 201 , ['uuid ' => '123456 ' ]);
235
229
236
- $ transport = new Lox24Transport ('user ' , 'token ' , 'testFrom ' , ['type ' => 'voice ' ], $ this -> client );
230
+ $ transport = new Lox24Transport ('user ' , 'token ' , 'testFrom ' , ['type ' => 'voice ' ], $ client );
237
231
238
232
$ options = (new Lox24Options ())->type (Type::Sms);
239
233
$ message = new SmsMessage ('+1411111111 ' , 'test text ' );
@@ -244,7 +238,7 @@ public function testOptionType()
244
238
245
239
public function testOptionCallbackData ()
246
240
{
247
- $ this ->assertRequestBody ([
241
+ $ client = $ this ->mockHttpClient ([
248
242
'sender_id ' => 'testFrom ' ,
249
243
'phone ' => '+1411111111 ' ,
250
244
'text ' => 'test text ' ,
@@ -254,7 +248,7 @@ public function testOptionCallbackData()
254
248
'callback_data ' => 'callback_data ' ,
255
249
], [], 201 , ['uuid ' => '123456 ' ]);
256
250
257
- $ transport = new Lox24Transport ('user ' , 'token ' , 'testFrom ' , ['type ' => 'voice ' ], $ this -> client );
251
+ $ transport = new Lox24Transport ('user ' , 'token ' , 'testFrom ' , ['type ' => 'voice ' ], $ client );
258
252
259
253
$ options = (new Lox24Options ())->callbackData ('callback_data ' );
260
254
$ message = new SmsMessage ('+1411111111 ' , 'test text ' );
@@ -270,7 +264,7 @@ public function testResponseStatusCodeNotEqual201()
270
264
'Unable to send the SMS: "service_code: Service \'s code is invalid or unavailable.". '
271
265
);
272
266
273
- $ this ->assertRequestBody ([
267
+ $ client = $ this ->mockHttpClient ([
274
268
'sender_id ' => 'testFrom ' ,
275
269
'phone ' => '+1411111111 ' ,
276
270
'text ' => 'test text ' ,
@@ -294,28 +288,56 @@ public function testResponseStatusCodeNotEqual201()
294
288
],
295
289
);
296
290
297
- $ transport = new Lox24Transport ('user ' , 'token ' , 'testFrom ' , [], $ this -> client );
291
+ $ transport = new Lox24Transport ('user ' , 'token ' , 'testFrom ' , [], $ client );
298
292
299
293
$ message = new SmsMessage ('+1411111111 ' , 'test text ' );
300
294
$ transport ->send ($ message );
301
295
}
302
296
303
- private function assertRequestBody (
297
+ public function mockHttpClient (
304
298
array $ bodyOverride = [],
305
299
array $ headersOverride = [],
306
300
int $ responseStatus = 200 ,
307
301
array $ responseContent = [],
308
- ): void {
309
- $ body = array_merge (self ::REQUEST_BODY , $ bodyOverride );
302
+ ): MockHttpClient {
303
+ $ body = json_encode ( array_merge (self ::REQUEST_BODY , $ bodyOverride) );
310
304
$ headers = array_merge (self ::REQUEST_HEADERS , $ headersOverride );
311
- $ response = $ this ->createMock (ResponseInterface::class);
312
- $ response ->expects ($ this ->once ())->method ('getStatusCode ' )->willReturn ($ responseStatus );
313
- $ response ->expects ($ this ->once ())->method ('toArray ' )->willReturn ($ responseContent );
314
- $ this ->client ->expects ($ this ->once ())
315
- ->method ('request ' )
316
- ->with ('POST ' , 'https://api.lox24.eu/sms ' , [
317
- 'body ' => $ body ,
318
- 'headers ' => $ headers ,
319
- ])->willReturn ($ response );
305
+
306
+ $ factory = function ($ method , $ url , $ options ) use (
307
+ $ body ,
308
+ $ headers ,
309
+ $ responseStatus ,
310
+ $ responseContent
311
+ ): MockResponse {
312
+ $ this ->assertSame ('POST ' , $ method );
313
+ $ this ->assertSame ('https://api.lox24.eu/sms ' , $ url );
314
+ $ this ->assertHeaders ($ headers , $ options ['headers ' ]);
315
+ $ this ->assertJsonStringEqualsJsonString ($ body , $ options ['body ' ]);
316
+
317
+ return new JsonMockResponse ($ responseContent , [
318
+ 'http_code ' => $ responseStatus ,
319
+ 'headers ' => ['content-type ' => 'application/json ' ],
320
+ ]);
321
+ };
322
+
323
+ return new MockHttpClient ($ factory );
324
+ }
325
+
326
+ private function assertHeaders (array $ expected , array $ headers ): void
327
+ {
328
+ foreach ($ this ->normalizeHeaders ($ expected ) as $ expectedHeader ) {
329
+ $ headerExists = in_array ($ expectedHeader , $ headers , true );
330
+ $ this ->assertTrue ($ headerExists , "Header ' $ expectedHeader' not found in request's headers " );
331
+ }
332
+ }
333
+
334
+ private function normalizeHeaders (array $ headers ): array
335
+ {
336
+ $ normalized = [];
337
+ foreach ($ headers as $ key => $ value ) {
338
+ $ normalized [] = $ key .': ' .$ value ;
339
+ }
340
+
341
+ return $ normalized ;
320
342
}
321
343
}
0 commit comments