package allowed

import (
	"testing"

	"go.skia.org/infra/go/testutils/unittest"
)

func TestAllowed(t *testing.T) {
	unittest.SmallTest(t)
	testCases := []struct {
		allowed  []string
		value    string
		expected bool
		message  string
	}{
		{
			allowed:  []string{},
			value:    "test@example.org",
			expected: false,
			message:  "empty",
		},
		{
			allowed:  []string{""},
			value:    "test@",
			expected: false,
			message:  "empty domain",
		},
		{
			allowed:  []string{"test@example.org"},
			value:    "test@example.org",
			expected: true,
			message:  "single email",
		},
		{
			allowed:  []string{"example.org"},
			value:    "test@example.org",
			expected: true,
			message:  "single domain",
		},
		{
			allowed:  []string{"example.org"},
			value:    "test@google.com",
			expected: false,
			message:  "single domain fail",
		},
		{
			allowed:  []string{"google.com", "chromium.org", "special@example.com"},
			value:    "test@google.com",
			expected: true,
			message:  "multi domain",
		},
		{
			allowed:  []string{"google.com", "chromium.org", "special@example.com"},
			value:    "foo@chromium.org",
			expected: true,
			message:  "multi domain 2",
		},
		{
			allowed:  []string{"google.com", "chromium.org", "special@example.com"},
			value:    "special@example.com",
			expected: true,
			message:  "multi domain 3",
		},
		{
			allowed:  []string{"google.com", "chromium.org", "special@example.com"},
			value:    "missing@example.com",
			expected: false,
			message:  "multi domain 4",
		},
	}

	for _, tc := range testCases {
		w := NewAllowedFromList(tc.allowed)
		if got, want := w.Member(tc.value), tc.expected; got != want {
			t.Errorf("Failed case Got %v Want %v: %s", got, want, tc.message)
		}
	}
}
