package constants

import "testing"

func TestNormalizeApprovalValues(t *testing.T) {
	if got := NormalizeApprovalMode("unanimous"); got != ApprovalModeUnanimous {
		t.Fatalf("NormalizeApprovalMode = %q", got)
	}
	if got := NormalizeApprovalMode(""); got != ApprovalModeFirstResponse {
		t.Fatalf("empty approval mode = %q", got)
	}
	if got := NormalizeApprovalRejectBehavior("backtosubmitter"); got != ApprovalRejectBehaviorBackToSubmitter {
		t.Fatalf("reject behavior = %q", got)
	}
	if got := NormalizeApprovalProcessNodeRejectBehavior("BackToPrevious"); got != ApprovalRejectBehaviorBackToSubmitter {
		t.Fatalf("process-node reject behavior = %q", got)
	}
	if got := NormalizeApprovalApproverType("relatedUser"); got != ApprovalApproverTypeRelatedUserField {
		t.Fatalf("approver type = %q", got)
	}
	if got := NormalizeApprovalSubmitterType("owner"); got != ApprovalSubmitterTypeRecordOwner {
		t.Fatalf("submitter type = %q", got)
	}
}

func TestFlowScheduleFrequencySpecs(t *testing.T) {
	canonical, ok := NormalizeFlowScheduleFrequency("weekly")
	if !ok || canonical != FlowScheduleFrequencyWeekly {
		t.Fatalf("NormalizeFlowScheduleFrequency = %q, %v", canonical, ok)
	}
	key, ok := FlowScheduleOccurrenceKey(FlowScheduleFrequencyDaily)
	if !ok || key != "daily" {
		t.Fatalf("FlowScheduleOccurrenceKey = %q, %v", key, ok)
	}
	if _, ok := FlowScheduleOccurrenceKey("Monthly"); ok {
		t.Fatal("unexpected key for unknown frequency")
	}
}

func TestTabVisibilityRank(t *testing.T) {
	if got := TabVisibilityRank(TabVisibilityVisible); got != 3 {
		t.Fatalf("Visible rank = %d", got)
	}
	if got := TabVisibilityFromRank(2); got != TabVisibilityDefaultOff {
		t.Fatalf("rank 2 visibility = %q", got)
	}
	entries := TabVisibilityRankEntries()
	entries[0].Rank = 99
	if got := TabVisibilityRank(TabVisibilityDefaultOn); got != 3 {
		t.Fatalf("rank entries leaked mutable state: %d", got)
	}
}

func TestMetadataNameClassifiers(t *testing.T) {
	if !IsRoleBackedGroupType(GroupTypeRoleAndSubordinates) {
		t.Fatal("RoleAndSubordinates should be role-backed")
	}
	if !GroupTypeIncludesSubordinateRoles("roleandsubordinates") {
		t.Fatal("RoleAndSubordinates should include subordinate roles")
	}
	if !IsSystemRelatedObjectAPIName("OpportunityShare") {
		t.Fatal("Share suffix should be system-related")
	}
}
