84 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			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
 | 
						|
}
 |