Skip to content

Commit d5838ca

Browse files
committed
wip
1 parent 52c8b79 commit d5838ca

File tree

2 files changed

+45
-39
lines changed

2 files changed

+45
-39
lines changed

internal/acctest/compare.go

Lines changed: 44 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,24 @@ import (
77
"strings"
88
)
99

10+
// compareJSONFields compare two given json fields
11+
// it will recurse on map[string]interface{} and []interface{}
12+
// and compare string fields with compareJSONFieldsStrings
13+
func compareJSONFields(requestValue, cassetteValue interface{}) bool {
14+
switch requestValue := requestValue.(type) {
15+
case string:
16+
return compareJSONFieldsStrings(requestValue, cassetteValue.(string))
17+
case map[string]interface{}:
18+
return compareJSONBodies(requestValue, cassetteValue.(map[string]interface{}))
19+
case []interface{}:
20+
return compareJSONSlices(requestValue, cassetteValue.([]interface{}))
21+
case []string:
22+
return compareStringSlices(requestValue, cassetteValue.([]string))
23+
default:
24+
return reflect.DeepEqual(requestValue, cassetteValue)
25+
}
26+
}
27+
1028
// compareJSONBodies compare two given maps that represent json bodies
1129
// returns true if both json are equivalent
1230
func compareJSONBodies(request, cassette map[string]interface{}) bool {
@@ -27,15 +45,17 @@ func compareJSONBodies(request, cassette map[string]interface{}) bool {
2745
return false
2846
}
2947
}
48+
3049
// TODO: record back ipam/TestAccIPAMIPReverseDNS_Basic
31-
//for key, cassetteValue := range cassette {
32-
// if _, ok := request[key]; !ok && cassetteValue != nil {
33-
// // Fails match if cassettes contains a field not in actual requests
34-
// // Fields should not disappear from requests unless a sdk breaking change
35-
// // We ignore if field is nil in cassette as it could be an old deprecated and unused field
36-
// return false
50+
51+
// for key, cassetteValue := range cassette {
52+
// if _, ok := request[key]; !ok && cassetteValue != nil {
53+
// // Fails match if cassettes contains a field not in actual requests
54+
// // Fields should not disappear from requests unless a sdk breaking change
55+
// // We ignore if field is nil in cassette as it could be an old deprecated and unused field
56+
// return false
57+
// }
3758
// }
38-
//}
3959

4060
return true
4161
}
@@ -113,6 +133,10 @@ func compareJSONFieldsStrings(expected, actual string) bool {
113133
}
114134

115135
func compareStringSlices(request, cassette []string) bool {
136+
if len(request) != len(cassette) {
137+
return false
138+
}
139+
116140
sort.Slice(request, func(i, j int) bool {
117141
return request[i] < request[j]
118142
})
@@ -131,7 +155,7 @@ func compareStringSlices(request, cassette []string) bool {
131155

132156
// compareJSONSlices compares two slices of interface{}
133157
// if the slices are comparable (string or float64), it will sort them and compare them
134-
// it returns true in case of map[string]interface{} because it is not possible to sort them
158+
// it returns true in case of slice of map[string]interface{} because it is not possible to sort them
135159
func compareJSONSlices(request, cassette []interface{}) bool {
136160
if len(request) != len(cassette) {
137161
return false
@@ -144,17 +168,20 @@ func compareJSONSlices(request, cassette []interface{}) bool {
144168
// try to infer the type of the slice, sort it and compare all elements
145169
switch request[0].(type) {
146170
case string:
147-
cassetteString := make([]string, len(cassette))
148-
for i, v := range cassette {
149-
cassetteString[i] = v.(string)
150-
}
171+
sort.Slice(request, func(i, j int) bool {
172+
return request[i].(string) < request[j].(string)
173+
})
174+
sort.Slice(cassette, func(i, j int) bool {
175+
return cassette[i].(string) < cassette[j].(string)
176+
})
151177

152-
requestString := make([]string, len(request))
153-
for i, v := range request {
154-
requestString[i] = v.(string)
178+
for i := range request {
179+
if !compareJSONFieldsStrings(request[i].(string), cassette[i].(string)) {
180+
return false
181+
}
155182
}
156183

157-
return compareStringSlices(requestString, cassetteString)
184+
return true
158185
case float64:
159186
sort.Slice(request, func(i, j int) bool {
160187
return request[i].(float64) < request[j].(float64)
@@ -170,29 +197,9 @@ func compareJSONSlices(request, cassette []interface{}) bool {
170197
}
171198

172199
return true
173-
case []interface{}:
174-
return compareJSONSlices(request, cassette)
175200
case map[string]interface{}:
176201
return true
177-
}
178-
179-
return false
180-
}
181-
182-
// compareJSONFields compare two given json fields
183-
// it will recurse on map[string]interface{} and []interface{}
184-
// and compare string fields with compareJSONFieldsStrings
185-
func compareJSONFields(requestValue, cassetteValue interface{}) bool {
186-
switch requestValue := requestValue.(type) {
187-
case string:
188-
return compareJSONFieldsStrings(requestValue, cassetteValue.(string))
189-
case map[string]interface{}: // recurse
190-
return compareJSONBodies(requestValue, cassetteValue.(map[string]interface{}))
191-
case []interface{}:
192-
return compareJSONSlices(requestValue, cassetteValue.([]interface{}))
193-
case []string:
194-
return compareStringSlices(requestValue, cassetteValue.([]string))
195202
default:
196-
return reflect.DeepEqual(requestValue, cassetteValue)
203+
return reflect.DeepEqual(request, cassette)
197204
}
198205
}

internal/acctest/vcr.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,7 @@ func cassetteBodyMatcher(request *http.Request, cassette cassette.Request) bool
139139
removeKeyRecursive(requestJSON, key)
140140
removeKeyRecursive(cassetteJSON, key)
141141
}
142-
fmt.Println("requestJSON", requestJSON)
143-
fmt.Println("cassetteJSON", cassetteJSON)
142+
144143
return compareJSONBodies(requestJSON, cassetteJSON)
145144
}
146145

0 commit comments

Comments
 (0)