package outboundintentv1

import "testing"

func TestDecodeUpsertDesiredStateV1(t *testing.T) {
	raw := []byte(`{"version":1,"targetObject":"contacts","bodyRoot":"properties","mappedFields":{"email":"a@example.com"},"associations":[{"contractIndex":0,"sourceObject":"Account","sourceRecordId":"001-source"}]}`)
	intent := testIntent(raw, 41)

	payload, err := DecodeUpsertDesiredStateV1(intent)
	if err != nil {
		t.Fatalf("DecodeUpsertDesiredStateV1: %v", err)
	}
	if payload.TargetObject != "contacts" || string(payload.MappedFields["email"]) != `"a@example.com"` || len(payload.Associations) != 1 {
		t.Fatalf("payload = %#v", payload)
	}
}

func TestDecodeUpsertDesiredStateV1FailsClosed(t *testing.T) {
	for name, raw := range map[string]string{
		"unknown field":     `{"version":1,"targetObject":"contacts","mappedFields":{"email":"a@example.com"},"provider":"hubspot"}`,
		"noncanonical":      `{ "version":1,"targetObject":"contacts","mappedFields":{"email":"a@example.com"}}`,
		"duplicate field":   `{"version":1,"targetObject":"contacts","mappedFields":{"email":"a@example.com","email":"b@example.com"}}`,
		"association order": `{"version":1,"targetObject":"deals","mappedFields":{"name":"x"},"associations":[{"contractIndex":1,"sourceObject":"Account","sourceRecordId":"001-a"},{"contractIndex":0,"sourceObject":"Contact","sourceRecordId":"003-a"}]}`,
	} {
		t.Run(name, func(t *testing.T) {
			intent := testIntent([]byte(raw), 41)
			if _, err := DecodeUpsertDesiredStateV1(intent); err == nil {
				t.Fatal("malformed payload was accepted")
			}
		})
	}
}
