package packs

import (
	"testing"
)

// TestLockRulePropagatesFromObjectSpecToMetadata verifies that a LockRule set
// on an ObjectSpec flows through buildObjectMetadataWithResolver into the
// resulting ObjectMetadata.LockRule pointer with the same value.
func TestLockRulePropagatesFromObjectSpecToMetadata(t *testing.T) {
	rule := "IsArchived"
	specs := []ObjectSpec{
		{
			APIName:      "Widget__c",
			Label:        "Widget",
			SharingModel: "Private",
			LockRule:     rule,
		},
	}
	objects := buildObjectMetadataWithResolver(specs, objectSpecFieldResolver{})
	if len(objects) != 1 {
		t.Fatalf("buildObjectMetadataWithResolver returned %d objects, want 1", len(objects))
	}
	obj := objects[0]
	if obj.LockRule == nil {
		t.Fatal("ObjectMetadata.LockRule is nil, want non-nil")
	}
	if *obj.LockRule != rule {
		t.Fatalf("ObjectMetadata.LockRule = %q, want %q", *obj.LockRule, rule)
	}
}

// TestLockRuleEmptySpecYieldsNilMetadata verifies that an empty LockRule on an
// ObjectSpec results in a nil LockRule pointer on the ObjectMetadata — so that
// NULLs are never written for objects that do not author the field.
func TestLockRuleEmptySpecYieldsNilMetadata(t *testing.T) {
	specs := []ObjectSpec{
		{
			APIName:      "Widget__c",
			Label:        "Widget",
			SharingModel: "Private",
			LockRule:     "",
		},
	}
	objects := buildObjectMetadataWithResolver(specs, objectSpecFieldResolver{})
	if len(objects) != 1 {
		t.Fatalf("buildObjectMetadataWithResolver returned %d objects, want 1", len(objects))
	}
	obj := objects[0]
	if obj.LockRule != nil {
		t.Fatalf("ObjectMetadata.LockRule = %q, want nil for empty spec", *obj.LockRule)
	}
}
