Files
ozon-api-client/ozon/utils.go
Kirill 1494ff5905 Better tests (check that response match the structure) (#52)
Trailing zeros were removed from time in responses because of json marshaling features
2023-12-11 03:19:12 +03:00

84 lines
2.0 KiB
Go

package ozon
import (
"bytes"
"encoding/json"
"fmt"
"reflect"
"strings"
"testing"
)
func compareJsonResponse(t *testing.T, expectedJSON string, response interface{}) {
err := json.Unmarshal([]byte(expectedJSON), response)
if err != nil {
t.Errorf("got error: %s", err)
return
}
after, err := json.Marshal(response)
if err != nil {
t.Errorf("got error: %s", err)
return
}
var j1, j2 map[string]interface{}
if err := json.NewDecoder(strings.NewReader(expectedJSON)).Decode(&j1); err != nil {
t.Errorf("got error: %s", err)
return
}
if err := json.NewDecoder(bytes.NewReader(after)).Decode(&j2); err != nil {
t.Errorf("got error: %s", err)
return
}
if err := compareJson(j1, j2, ""); err != nil {
t.Errorf("jsons are not equal: %s", err)
return
}
}
func compareJson(expected interface{}, actual interface{}, prefix string) error {
if expected == nil {
return nil
}
expectedType := reflect.TypeOf(expected).Kind()
actualType := reflect.TypeOf(actual).Kind()
if expectedType != actualType {
return fmt.Errorf("type for key %s is different: expected: %s, \ngot: %s", prefix, expectedType, actualType)
}
switch expected.(type) {
case map[string]interface{}:
expectedMap := expected.(map[string]interface{})
actualMap := actual.(map[string]interface{})
for k, v := range expectedMap {
key := fmt.Sprintf("%s.%s", prefix, k)
actualValue, ok := actualMap[k]
if !ok {
return fmt.Errorf("key %s is absent", key)
}
if err := compareJson(v, actualValue, key); err != nil {
return err
}
}
case []interface{}:
expectedSlice := expected.([]interface{})
actualSlice := actual.([]interface{})
for i := range expectedSlice {
key := fmt.Sprintf("%s.%d", prefix, i)
if err := compareJson(expectedSlice[i], actualSlice[i], key); err != nil {
return err
}
}
default:
if !reflect.DeepEqual(expected, actual) {
return fmt.Errorf("value for key %s is different: expected: %s, \ngot: %s", prefix, expected, actual)
}
}
return nil
}