package subscription

import "testing"

func TestValidateMode(t *testing.T) {
	for _, mode := range []string{ModeTopicForward, ModeCardOnly} {
		if err := ValidateMode(mode); err != nil {
			t.Errorf("ValidateMode(%q): %v", mode, err)
		}
	}
	for _, mode := range []string{"", "forward", "TOPIC_FORWARD"} {
		if err := ValidateMode(mode); err == nil {
			t.Errorf("ValidateMode(%q) succeeded, want error", mode)
		}
	}
}

func TestValidateFilter(t *testing.T) {
	valid := []string{
		`{}`,
		`{"region":["us-west-1"],"classification":["page"]}`,
		`{"classification":["page","ticket"]}`,
		`{"alertname":[],"cluster_id":["c1"],"tenant_id":["t1"],"customer_type":["dedicated"]}`,
	}
	for _, filter := range valid {
		if err := ValidateFilter(ModeTopicForward, []byte(filter)); err != nil {
			t.Errorf("ValidateFilter(%s): %v", filter, err)
		}
	}

	invalid := []string{
		``,
		`null`,
		`[]`,
		`{"region":"us-west-1"}`,
		`{"unknown":["value"]}`,
		`{} {}`,
		`{"classification":["Page"]}`,
		`{"classification":["urgent"]}`,
	}
	for _, filter := range invalid {
		if err := ValidateFilter(ModeTopicForward, []byte(filter)); err == nil {
			t.Errorf("ValidateFilter(%s) succeeded, want error", filter)
		}
	}
}

// A logging alert opens no IM topic and no alert at all, so neither alert mode
// can carry one: it is what the event and customer modes are for.
func TestValidateFilterLoggingByMode(t *testing.T) {
	const filter = `{"classification":["logging"]}`
	for _, mode := range AlertModes {
		if err := ValidateFilter(mode, []byte(filter)); err == nil {
			t.Errorf("ValidateFilter(%s, %s) succeeded, want error", mode, filter)
		}
	}
	for _, mode := range EventModes {
		if err := ValidateFilter(mode, []byte(filter)); err != nil {
			t.Errorf("ValidateFilter(%s, %s): %v", mode, filter, err)
		}
	}
}

// The reverse does not hold: event mode delivers observations, so it carries
// every classification. Narrowing it to logging would make "has this page been
// re-firing?" unaskable — and that is the question the alert view cannot
// answer, because it aggregates repeats into silence.
func TestEventModeCarriesEveryClassification(t *testing.T) {
	for _, class := range []string{"page", "ticket", "logging"} {
		filter := `{"classification":["` + class + `"]}`
		if err := ValidateFilter(ModeEvent, []byte(filter)); err != nil {
			t.Errorf("ValidateFilter(%s, %s): %v", ModeEvent, filter, err)
		}
	}
}
