@@ -84,10 +84,11 @@ type ExpectedRequest struct {
84
84
85
85
// Response defines expected properties of a response from a backend.
86
86
type Response struct {
87
- StatusCode int
88
- StatusCodes []int // alternative to StatusCode, allows multiple acceptable codes
89
- Headers map [string ]string
90
- AbsentHeaders []string
87
+ StatusCode int
88
+ StatusCodes []int // alternative to StatusCode, allows multiple acceptable codes
89
+ Headers map [string ]string
90
+ HeadersWithMultipleValues map [string ][]string // allows multiple values for a header
91
+ AbsentHeaders []string
91
92
92
93
// IgnoreWhitespace will cause whitespace to be ignored when comparing the respond
93
94
// header values.
@@ -343,26 +344,52 @@ func CompareRequest(t *testing.T, req *roundtripper.Request, cReq *roundtripper.
343
344
}
344
345
}
345
346
346
- if expected .Response .Headers != nil {
347
+ if expected .Response .Headers != nil || expected . Response . HeadersWithMultipleValues != nil {
347
348
if cRes .Headers == nil {
348
349
return fmt .Errorf ("no headers captured, expected %v" , len (expected .Response .Headers ))
349
350
}
350
351
for name , val := range cRes .Headers {
351
352
cRes .Headers [strings .ToLower (name )] = val
352
353
}
353
354
354
- for name , expectedVal := range expected .Response .Headers {
355
- actualVal , ok := cRes .Headers [strings .ToLower (name )]
356
- if ! ok {
357
- return fmt .Errorf ("expected %s header to be set, actual headers: %v" , name , cRes .Headers )
358
- }
359
- actualValStr := strings .Join (actualVal , "," )
360
- if expected .Response .IgnoreWhitespace {
361
- actualValStr = strings .ReplaceAll (actualValStr , " " , "" )
362
- expectedVal = strings .ReplaceAll (expectedVal , " " , "" )
355
+ if expected .Response .HeadersWithMultipleValues != nil {
356
+ for name , expectedVals := range expected .Response .HeadersWithMultipleValues {
357
+ actualVal , ok := cRes .Headers [strings .ToLower (name )]
358
+ if ! ok {
359
+ return fmt .Errorf ("expected %s header to be set, actual headers: %v" , name , cRes .Headers )
360
+ }
361
+ actualValStr := strings .Join (actualVal , "," )
362
+ if expected .Response .IgnoreWhitespace {
363
+ actualValStr = strings .ReplaceAll (actualValStr , " " , "" )
364
+ for i := range expectedVals {
365
+ expectedVals [i ] = strings .ReplaceAll (expectedVals [i ], " " , "" )
366
+ }
367
+ }
368
+ matched := false
369
+ for _ , expectedVal := range expectedVals {
370
+ if actualValStr == expectedVal {
371
+ matched = true
372
+ break
373
+ }
374
+ }
375
+ if ! matched {
376
+ return fmt .Errorf ("expected %s header to be set to one of %v, got %s" , name , expectedVals , actualValStr )
377
+ }
363
378
}
364
- if actualValStr != expectedVal {
365
- return fmt .Errorf ("expected %s header to be set to %s, got %s" , name , expectedVal , actualValStr )
379
+ } else {
380
+ for name , expectedVal := range expected .Response .Headers {
381
+ actualVal , ok := cRes .Headers [strings .ToLower (name )]
382
+ if ! ok {
383
+ return fmt .Errorf ("expected %s header to be set, actual headers: %v" , name , cRes .Headers )
384
+ }
385
+ actualValStr := strings .Join (actualVal , "," )
386
+ if expected .Response .IgnoreWhitespace {
387
+ actualValStr = strings .ReplaceAll (actualValStr , " " , "" )
388
+ expectedVal = strings .ReplaceAll (expectedVal , " " , "" )
389
+ }
390
+ if actualValStr != expectedVal {
391
+ return fmt .Errorf ("expected %s header to be set to %s, got %s" , name , expectedVal , actualValStr )
392
+ }
366
393
}
367
394
}
368
395
}
0 commit comments