@@ -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
1230func 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
115135func 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
135159func 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}
0 commit comments