package metadata

import (
	"bytes"
	"testing"
)

func TestMergeFlowMetadataRawPreservesUntouchedNumericMetadata(t *testing.T) {
	t.Parallel()

	merged, err := mergeFlowMetadataRaw(
		[]byte(`{
			"assignment":{"value":9007199254740993},
			"start":{"triggerType":"RecordAfterSave","object":"ProbeObject"}
		}`),
		[]byte(`{"description":"after"}`),
	)
	if err != nil {
		t.Fatalf("mergeFlowMetadataRaw() error = %v", err)
	}
	if !bytes.Contains(merged, []byte(`9007199254740993`)) {
		t.Fatalf("merged metadata = %s, want untouched large integer preserved", merged)
	}
	if bytes.Contains(merged, []byte(`9007199254740992`)) {
		t.Fatalf("merged metadata = %s, got float64-coerced integer", merged)
	}
	if !bytes.Contains(merged, []byte(`"description":"after"`)) {
		t.Fatalf("merged metadata = %s, want patched description", merged)
	}
}

func TestMergeFlowMetadataRawRejectsNullPatchValues(t *testing.T) {
	t.Parallel()

	_, err := mergeFlowMetadataRaw(
		[]byte(`{"start":{"triggerType":"RecordAfterSave","object":"ProbeObject"}}`),
		[]byte(`{"start":{"object":null}}`),
	)
	if err == nil {
		t.Fatal("mergeFlowMetadataRaw() error = nil, want null metadata rejection")
	}
	if got := err.Error(); got != "Metadata.start.object cannot be null" {
		t.Fatalf("mergeFlowMetadataRaw() error = %q, want Metadata.start.object null rejection", got)
	}
}
