package testhelper_test

import (
	"testing"

	th "github.com/fiskerinc/cloud-services/pkg/testhelper"
)

func TestJSONCompare(t *testing.T) {
	comparer := th.JSONComparer{
		IgnoreProps: []string{"prop3"},
	}
	defer comparer.Close()
	ref := []byte(`{"prop1": 1, "prop2": "x", "prop3": true, "prop4": true, "prop5": {"prop1": 1, "prop2": "x", "prop3": true, "prop4": true}, "prop10": 1, "prop11": "x", "prop12": true, "prop13": true, "prop14": {"prop10": 1, "prop11": "x", "prop12": true, "prop13": true}}`)
	comp := []byte(`{"prop1": 2, "prop2": "X", "prop3": false, "prop4": false, "prop5": {"prop1": 3, "prop2": "Y", "prop3": false, "prop4": false}, "prop10": 1, "prop11": "x", "prop12": true, "prop13": true, "prop14": {"prop10": 1, "prop11": "x", "prop12": true, "prop13": true}}`)

	diff, err := comparer.GetDiff(ref, comp)
	if err != nil {
		t.Errorf(th.TestErrorTemplate, "JSONComparer.GetDiff error", nil, err)
		return
	}

	th.MapHasValue(t, "prop1 = 1", diff, "prop1", float64(1))
	th.MapHasValue(t, "prop2 = X", diff, "prop2", "x")
	th.MapKeyNotExists(t, "prop3 ignored", diff, "prop3")
	th.MapHasValue(t, "prop4 = true", diff, "prop4", true)
	th.MapHasValue(t, "prop5.prop1 = 1", diff, "prop5.prop1", float64(1))
	th.MapHasValue(t, "prop5.prop2 = X", diff, "prop5.prop2", "x")
	th.MapHasValue(t, "prop5.prop4 = true", diff, "prop5.prop4", true)
	th.MapKeyNotExists(t, "no prop10", diff, "prop10")
	th.MapKeyNotExists(t, "no prop11", diff, "prop11")
	th.MapKeyNotExists(t, "no prop12", diff, "prop12")
	th.MapKeyNotExists(t, "no prop13", diff, "prop13")
	th.MapKeyNotExists(t, "no prop14", diff, "prop14")
	th.MapKeyNotExists(t, "no prop14.prop10", diff, "prop14.prop10")
	th.MapKeyNotExists(t, "no prop14.prop11", diff, "prop14.prop11")
	th.MapKeyNotExists(t, "no prop14.prop12", diff, "prop14.prop12")
	th.MapKeyNotExists(t, "no prop14.prop13", diff, "prop14.prop13")
}
