package persistence

import (
	"encoding/json"
	"testing"
)

func TestDecodeValidationRuleRecordSetBindingsPreservesJSONNumbers(t *testing.T) {
	bindings, err := decodeValidationRuleRecordSetBindings(`[
		{
			"name":"related",
			"mode":"exists",
			"objectApiName":"RelatedItem",
			"filters":[
				{"field":"ExternalNumber","operator":"eq","valueSource":"literal","value":9007199254740993},
				{"field":"Ratio","operator":"eq","valueSource":"literal","value":1.2300}
			]
		}
	]`)
	if err != nil {
		t.Fatalf("decode bindings: %v", err)
	}
	if len(bindings) != 1 || len(bindings[0].Filters) != 2 {
		t.Fatalf("bindings = %#v", bindings)
	}
	for index, want := range []string{"9007199254740993", "1.2300"} {
		value, ok := bindings[0].Filters[index].Value.(json.Number)
		if !ok || string(value) != want {
			t.Fatalf("filter %d value = %#v, want json.Number(%q)", index, bindings[0].Filters[index].Value, want)
		}
	}
}

func TestDecodeValidationRuleRecordSetBindingsFailsClosedOnMalformedJSON(t *testing.T) {
	for _, data := range []string{`[{`, `[] true`} {
		if bindings, err := decodeValidationRuleRecordSetBindings(data); err == nil || bindings != nil {
			t.Fatalf("decode %q = %#v, %v; want fail-closed error", data, bindings, err)
		}
	}
}
