package audit

import "testing"

type historyPlanTestPerms map[string]bool

func (p historyPlanTestPerms) HasFieldRead(_ string, fieldApiName string) (bool, error) {
	return p[fieldApiName], nil
}

func TestRedactFieldHistoryPlan_SuppressesDeniedFieldsFromMetadata(t *testing.T) {
	plan := HistoryQueryPlan{
		ObjectApiName: "Account",
		AllowedFields: []string{
			"Name",
		},
		Projections: []FieldRef{
			{Column: ColumnFieldName},
			{Column: ColumnOldValue},
			{Column: ColumnNewValue},
		},
	}

	redacted, err := RedactFieldHistoryPlan(
		plan,
		historyPlanTestPerms{"Name": true, "Secret__c": false},
		"Secret__c",
	)
	if err != nil {
		t.Fatalf("RedactFieldHistoryPlan: %v", err)
	}

	if len(redacted.DeniedFields) != 1 || redacted.DeniedFields[0] != "Secret__c" {
		t.Fatalf("DeniedFields = %#v; want [Secret__c]", redacted.DeniedFields)
	}
	if len(redacted.AllowedFields) != 1 || redacted.AllowedFields[0] != "Name" {
		t.Fatalf("AllowedFields = %#v; want [Name]", redacted.AllowedFields)
	}

	var suppressSecret bool
	for _, p := range redacted.Predicates {
		if p.Kind == PredicateSuppressField && p.FieldName == "Secret__c" && p.Column == ColumnFieldName {
			suppressSecret = true
		}
	}
	if !suppressSecret {
		t.Fatalf("expected suppression predicate for Secret__c; predicates=%#v", redacted.Predicates)
	}
}
