@@ -173,6 +173,7 @@ var simpleSliceOfStringsRequest = `{
173
173
]
174
174
}
175
175
`
176
+
176
177
var simpleSliceOfStringsCassette = `{
177
178
"strings": [
178
179
"3",
@@ -182,6 +183,138 @@ var simpleSliceOfStringsCassette = `{
182
183
}
183
184
`
184
185
186
+ var ludacrisBodyRequest = `{
187
+ "payload": {
188
+ "artists": [
189
+ {
190
+ "name": "Ludacris",
191
+ "age": 45,
192
+ "songs": ["Ludacris", "Ludacris", "Ludacris"]
193
+ }
194
+ }
195
+ }
196
+ }
197
+ `
198
+
199
+ var jdillaBodyCassette = `{
200
+ "payload": {
201
+ "artists": [
202
+ {
203
+ "name": "Jdilla",
204
+ "age": 54,
205
+ "songs": ["this", "is", "jdilla"]
206
+ }
207
+ ]
208
+ }
209
+ }
210
+ `
211
+
212
+ var requestInstanceSettings = `{
213
+ "settings": [
214
+ {
215
+ "name": "max_connections",
216
+ "value": "200"
217
+ },
218
+ {
219
+ "name": "max_parallel_workers",
220
+ "value": "2"
221
+ },
222
+ {
223
+ "name": "effective_cache_size",
224
+ "value": "1300"
225
+ },
226
+ {
227
+ "name": "maintenance_work_mem",
228
+ "value": "150"
229
+ },
230
+ {
231
+ "name": "max_parallel_workers_per_gather",
232
+ "value": "2"
233
+ },
234
+ {
235
+ "name": "work_mem",
236
+ "value": "4"
237
+ }
238
+ ]
239
+ }
240
+ `
241
+
242
+ var cassetteInstanceSettings = `{
243
+ "settings": [
244
+ {
245
+ "name": "maintenance_work_mem",
246
+ "value": "150"
247
+ },
248
+ {
249
+ "name": "effective_cache_size",
250
+ "value": "1300"
251
+ },
252
+ {
253
+ "name": "work_mem",
254
+ "value": "4"
255
+ },
256
+ {
257
+ "name": "max_parallel_workers",
258
+ "value": "2"
259
+ },
260
+ {
261
+ "name": "max_parallel_workers_per_gather",
262
+ "value": "2"
263
+ },
264
+ {
265
+ "name": "max_connections",
266
+ "value": "200"
267
+ }
268
+ ]
269
+ }
270
+ `
271
+
272
+ var objectBodyRequest = `{
273
+ "Id": "MyPolicy",
274
+ "Statement": [
275
+ {
276
+ "Action": [
277
+ "s3:ListBucket",
278
+ "s3:GetObject"
279
+ ],
280
+ "Effect": "Allow",
281
+ "Principal": {
282
+ "SCW": "*"
283
+ },
284
+ "Resource": [
285
+ "tf-tests-scw-obp-basic-4713290580220176511",
286
+ "tf-tests-scw-obp-basic-4713290580220176511/*"
287
+ ],
288
+ "Sid": "GrantToEveryone"
289
+ }
290
+ ],
291
+ "Version": "2012-10-17"
292
+ }
293
+ `
294
+
295
+ var objectBodyCassette = `{
296
+ "Id": "MyPolicy",
297
+ "Statement": [
298
+ {
299
+ "Action": [
300
+ "s3:ListBucket",
301
+ "s3:GetObject"
302
+ ],
303
+ "Effect": "Allow",
304
+ "Principal": {
305
+ "SCW": "*"
306
+ },
307
+ "Sid": "GrantToEveryone",
308
+ "Resource": [
309
+ "tf-tests-scw-obp-basic-1234567890",
310
+ "tf-tests-scw-obp-basic-1234567890/*"
311
+ ]
312
+ }
313
+ ],
314
+ "Version": "2012-10-17"
315
+ }
316
+ `
317
+
185
318
// we don't use httptest.NewRequest because it does not set the GetBody func
186
319
func newRequest (method , url string , body io.Reader ) * http.Request {
187
320
req , err := http .NewRequestWithContext (context .Background (), method , url , body )
@@ -197,7 +330,7 @@ var testBodyMatcherCases = []struct {
197
330
cassetteBody * cassette.Request
198
331
shouldMatch bool
199
332
}{
200
- // create bar compare with foo
333
+ // bar does not match foo
201
334
{
202
335
requestBody : newRequest (http .MethodPost , "https://api.scaleway.com/iam/v1alpha1/users" , strings .NewReader (barMemberCreationBody )),
203
336
cassetteBody : & cassette.Request {
@@ -208,7 +341,7 @@ var testBodyMatcherCases = []struct {
208
341
},
209
342
shouldMatch : false ,
210
343
},
211
- // create bar compare with bar
344
+ // bar matches bar
212
345
{
213
346
requestBody : newRequest (http .MethodPost , "https://api.scaleway.com/iam/v1alpha1/users" , strings .NewReader (barMemberCreationBody )),
214
347
cassetteBody : & cassette.Request {
@@ -231,8 +364,7 @@ var testBodyMatcherCases = []struct {
231
364
shouldMatch : true ,
232
365
},
233
366
// patch secret with nested slices of map[string]interface{} in different order
234
- // we cannot user deep equal because the order of the slices is different although the values are the same
235
- // it is not possible to sort them because they are not comparable (map[string]interface{})
367
+ // in such simple cases we flatten the maps and compare them in same order
236
368
{
237
369
requestBody : newRequest (http .MethodPatch , "https://api.scaleway.com/secrets/v1/secrets/123" , strings .NewReader (secretPatchBodyRequest )),
238
370
cassetteBody : & cassette.Request {
@@ -243,7 +375,29 @@ var testBodyMatcherCases = []struct {
243
375
},
244
376
shouldMatch : true ,
245
377
},
246
- // compare nested slices of different integers
378
+ // flatten the maps and compare them in same order
379
+ {
380
+ requestBody : newRequest (http .MethodPost , "https://api.scaleway.com/iam/v1alpha1/users" , strings .NewReader (requestInstanceSettings )),
381
+ cassetteBody : & cassette.Request {
382
+ URL : "https://api.scaleway.com/iam/v1alpha1/users" ,
383
+ Method : http .MethodPost ,
384
+ Body : cassetteInstanceSettings ,
385
+ ContentLength : int64 (len (cassetteInstanceSettings )),
386
+ },
387
+ shouldMatch : true ,
388
+ },
389
+ // complex slice of maps case
390
+ {
391
+ requestBody : newRequest (http .MethodPost , "https://api.scaleway.com/iam/v1alpha1/policies" , strings .NewReader (objectBodyRequest )),
392
+ cassetteBody : & cassette.Request {
393
+ URL : "https://api.scaleway.com/iam/v1alpha1/policies" ,
394
+ Method : http .MethodPost ,
395
+ Body : objectBodyCassette ,
396
+ ContentLength : int64 (len (objectBodyCassette )),
397
+ },
398
+ shouldMatch : true ,
399
+ },
400
+ // compare slices of different integers
247
401
{
248
402
requestBody : newRequest (http .MethodPost , "https://api.scaleway.com/iam/v1alpha1/users" , strings .NewReader (integertestBodyRequest )),
249
403
cassetteBody : & cassette.Request {
@@ -254,7 +408,7 @@ var testBodyMatcherCases = []struct {
254
408
},
255
409
shouldMatch : false ,
256
410
},
257
- // compare nested slices of same integers in different order
411
+ // compare slices of same integers in different order
258
412
{
259
413
requestBody : newRequest (http .MethodPost , "https://api.scaleway.com/iam/v1alpha1/users" , strings .NewReader (integerBodyRequestOutOfOrder )),
260
414
cassetteBody : & cassette.Request {
@@ -265,7 +419,7 @@ var testBodyMatcherCases = []struct {
265
419
},
266
420
shouldMatch : true ,
267
421
},
268
- // compare nested slices of slices of strings
422
+ // compare slices of slices of strings in different order
269
423
{
270
424
requestBody : newRequest (http .MethodPost , "https://api.scaleway.com/iam/v1alpha1/users" , strings .NewReader (nestedSliceOfSlicesRequest )),
271
425
cassetteBody : & cassette.Request {
@@ -286,7 +440,7 @@ var testBodyMatcherCases = []struct {
286
440
},
287
441
shouldMatch : true ,
288
442
},
289
- // compare simple slice of strings
443
+ // compare slices of strings in different order
290
444
{
291
445
requestBody : newRequest (http .MethodPost , "https://api.scaleway.com/iam/v1alpha1/users" , strings .NewReader (simpleSliceOfStringsRequest )),
292
446
cassetteBody : & cassette.Request {
@@ -297,13 +451,26 @@ var testBodyMatcherCases = []struct {
297
451
},
298
452
shouldMatch : true ,
299
453
},
454
+ // ludacris does not match jdilla
455
+ {
456
+ requestBody : newRequest (http .MethodPost , "https://api.scaleway.com/iam/v1alpha1/users" , strings .NewReader (ludacrisBodyRequest )),
457
+ cassetteBody : & cassette.Request {
458
+ URL : "https://api.scaleway.com/iam/v1alpha1/users" ,
459
+ Method : http .MethodPost ,
460
+ Body : jdillaBodyCassette ,
461
+ ContentLength : int64 (len (jdillaBodyCassette )),
462
+ },
463
+ shouldMatch : false ,
464
+ },
300
465
}
301
466
302
467
func TestCassetteMatcher (t * testing.T ) {
303
468
for i , test := range testBodyMatcherCases {
304
469
shouldMatch := acctest .CassetteMatcher (test .requestBody , * test .cassetteBody )
305
470
if shouldMatch != test .shouldMatch {
306
471
t .Errorf ("test %d: expected %v, got %v" , i , test .shouldMatch , shouldMatch )
472
+ t .Errorf ("requestBody: %s" , test .requestBody .Body )
473
+ t .Errorf ("cassetteBody: %s" , test .cassetteBody .Body )
307
474
}
308
475
}
309
476
}
0 commit comments