package alert

import (
	"testing"
	"time"

	"github.com/stretchr/testify/require"
)

func TestPageDelayReadsTheAnnotation(t *testing.T) {
	t.Parallel()

	require.Equal(t, 5*time.Minute, PageDelay(map[string]string{PageDelayAnnotation: "5m"}))
	require.Equal(t, 90*time.Second, PageDelay(map[string]string{PageDelayAnnotation: "90s"}))
	require.Equal(t, 2*time.Minute, PageDelay(map[string]string{PageDelayAnnotation: "  2m  "}))
}

func TestPageDelayIsZeroWhenTheRuleAsksForNothing(t *testing.T) {
	t.Parallel()

	// Every rule today. Absent is the overwhelmingly common case and must cost
	// nothing to express.
	require.Zero(t, PageDelay(nil))
	require.Zero(t, PageDelay(map[string]string{}))
	require.Zero(t, PageDelay(map[string]string{PageDelayAnnotation: ""}))
	require.Zero(t, PageDelay(map[string]string{"runbook_url": "https://example/x"}))
}

func TestPageDelayFailsToZeroRatherThanSilencingAPage(t *testing.T) {
	t.Parallel()

	// A typo in a rule annotation may lose the delay its author wanted. It may
	// not decide that nobody gets called: every unusable value pages now.
	for _, raw := range []string{"5", "five minutes", "5 m", "1d", "-3m", "0s"} {
		require.Zerof(t, PageDelay(map[string]string{PageDelayAnnotation: raw}),
			"unusable value %q must page immediately", raw)
	}
}

func TestPageDelayCapsWhatARuleCanAskFor(t *testing.T) {
	t.Parallel()

	// Over the cap is clamped, not rejected. An alert that pages late beats one
	// whose delivery refuses to parse.
	require.Equal(t, MaxPageDelay, PageDelay(map[string]string{PageDelayAnnotation: "45m"}))
	require.Equal(t, MaxPageDelay, PageDelay(map[string]string{PageDelayAnnotation: "2h"}))
	require.Equal(t, MaxPageDelay, PageDelay(map[string]string{PageDelayAnnotation: "10m"}))
}
