Files
cloud-services/pkg/testhelper/json_compare.go

79 lines
1.6 KiB
Go

package testhelper
import (
"encoding/json"
"fmt"
)
type JSONComparer struct {
result map[string]interface{}
IgnoreProps []string
}
func (j *JSONComparer) Close() {
j.result = nil
j.IgnoreProps = nil
}
func (j *JSONComparer) GetDiff(reference []byte, compare []byte) (map[string]interface{}, error) {
j.result = map[string]interface{}{}
objRef := map[string]interface{}{}
objComp := map[string]interface{}{}
err := json.Unmarshal(reference, &objRef)
if err != nil {
return j.result, err
}
err = json.Unmarshal(compare, &objComp)
if err != nil {
return j.result, err
}
j.compare("", objRef, objComp)
return j.result, nil
}
func (j *JSONComparer) isMap(obj interface{}) (converted map[string]interface{}, isMap bool) {
converted, isMap = obj.(map[string]interface{})
return
}
func (j *JSONComparer) isIgnored(key string) bool {
for _, ignored := range j.IgnoreProps {
if ignored == key {
return true
}
}
return false
}
func (j JSONComparer) processMap(key string, refVal interface{}, compVal interface{}) bool {
if convRef, isRefMap := j.isMap(refVal); isRefMap {
if convCom, isComMap := j.isMap(compVal); isComMap {
j.compare(fmt.Sprintf("%s.", key), convRef, convCom)
return true
}
}
return false
}
func (j *JSONComparer) compare(prefix string, reference map[string]interface{}, compare map[string]interface{}) {
for key, refVal := range reference {
if j.isIgnored(key) {
continue
}
if comVal, ok := compare[key]; !ok {
j.result[key] = "missing"
} else {
if j.processMap(key, refVal, comVal) {
continue
}
if comVal != refVal {
j.result[prefix+key] = refVal
}
}
}
}