package recordlocks

import "testing"

func TestParentLaneKeyHashCanonicalizesObjectNameOnly(t *testing.T) {
	left, ok := ParentLaneKeyHash(ParentKey{ObjectName: " Account ", RecordID: " 001 "})
	if !ok {
		t.Fatal("ParentLaneKeyHash returned ok=false")
	}
	right, ok := ParentLaneKeyHash(ParentKey{ObjectName: "account", RecordID: "001"})
	if !ok {
		t.Fatal("ParentLaneKeyHash lower-case returned ok=false")
	}
	if left != right {
		t.Fatalf("hash mismatch for case-equivalent object names: %q vs %q", left, right)
	}

	differentID, ok := ParentLaneKeyHash(ParentKey{ObjectName: "Account", RecordID: "001 "})
	if !ok {
		t.Fatal("ParentLaneKeyHash trimmed ID returned ok=false")
	}
	if left != differentID {
		t.Fatalf("trimmed record ID hash mismatch: %q vs %q", left, differentID)
	}

	caseSensitiveID, ok := ParentLaneKeyHash(ParentKey{ObjectName: "Account", RecordID: "ABC"})
	if !ok {
		t.Fatal("ParentLaneKeyHash case-sensitive ID returned ok=false")
	}
	caseSensitiveID2, ok := ParentLaneKeyHash(ParentKey{ObjectName: "Account", RecordID: "abc"})
	if !ok {
		t.Fatal("ParentLaneKeyHash case-sensitive ID2 returned ok=false")
	}
	if caseSensitiveID == caseSensitiveID2 {
		t.Fatal("record IDs must remain case-sensitive in parent lane hashes")
	}
}

func TestNewParentLaneOwnerTokenIsOpaque(t *testing.T) {
	left, err := NewParentLaneOwnerToken()
	if err != nil {
		t.Fatalf("NewParentLaneOwnerToken left: %v", err)
	}
	right, err := NewParentLaneOwnerToken()
	if err != nil {
		t.Fatalf("NewParentLaneOwnerToken right: %v", err)
	}
	if len(left) != 32 || len(right) != 32 {
		t.Fatalf("token lengths = %d/%d, want 32 hex chars", len(left), len(right))
	}
	if left == right {
		t.Fatal("two owner tokens are identical")
	}
}
