1// +build !integration
2
3package referees
4
5import (
6	"testing"
7
8	"github.com/sirupsen/logrus"
9	"github.com/stretchr/testify/assert"
10	"github.com/stretchr/testify/mock"
11)
12
13func Test_CreateReferees(t *testing.T) {
14	fakeMockMetricsExecutor := func(t *testing.T) (interface{}, func(t mock.TestingT) bool) {
15		return struct{}{}, func(t mock.TestingT) bool { return false }
16	}
17
18	mockMetricsExecutor := func(t *testing.T) (interface{}, func(t mock.TestingT) bool) {
19		m := new(MockMetricsExecutor)
20
21		m.On("GetMetricsSelector").Return(`name="value"`).Maybe()
22
23		return m, m.AssertExpectations
24	}
25
26	testCases := map[string]struct {
27		mockExecutor     func(t *testing.T) (interface{}, func(t mock.TestingT) bool)
28		config           *Config
29		expectedReferees []Referee
30	}{
31		"Executor doesn't support any referee": {
32			mockExecutor:     fakeMockMetricsExecutor,
33			config:           &Config{Metrics: &MetricsRefereeConfig{QueryInterval: 0}},
34			expectedReferees: nil,
35		},
36		"Executor supports metrics referee": {
37			mockExecutor:     mockMetricsExecutor,
38			config:           &Config{Metrics: &MetricsRefereeConfig{QueryInterval: 0}},
39			expectedReferees: []Referee{&MetricsReferee{}},
40		},
41		"No config provided": {
42			mockExecutor:     mockMetricsExecutor,
43			config:           nil,
44			expectedReferees: nil,
45		},
46	}
47
48	for testName, test := range testCases {
49		t.Run(testName, func(t *testing.T) {
50			logger := logrus.WithField("test", t.Name())
51
52			executor, assertExpectations := test.mockExecutor(t)
53			defer assertExpectations(t)
54
55			referees := CreateReferees(executor, test.config, logger)
56
57			if test.expectedReferees == nil {
58				assert.Nil(t, referees)
59				return
60			}
61
62			assert.Len(t, referees, len(test.expectedReferees))
63			for i, referee := range test.expectedReferees {
64				assert.IsType(t, referee, referees[i])
65			}
66		})
67	}
68}
69