github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/ruler/rulestore/configdb/store_test.go (about) 1 package configdb 2 3 import ( 4 "context" 5 fmt "fmt" 6 "testing" 7 time "time" 8 9 "github.com/stretchr/testify/assert" 10 11 "github.com/grafana/loki/pkg/configs/client" 12 "github.com/grafana/loki/pkg/configs/userconfig" 13 ) 14 15 var zeroTime time.Time 16 17 type MockClient struct { 18 cfgs map[string]userconfig.VersionedRulesConfig 19 err error 20 } 21 22 func (c *MockClient) GetRules(ctx context.Context, since userconfig.ID) (map[string]userconfig.VersionedRulesConfig, error) { 23 return c.cfgs, c.err 24 } 25 26 func (c *MockClient) GetAlerts(ctx context.Context, since userconfig.ID) (*client.ConfigsResponse, error) { 27 return nil, nil 28 } 29 30 func Test_ConfigRuleStoreError(t *testing.T) { 31 mock := &MockClient{ 32 cfgs: nil, 33 err: fmt.Errorf("Error"), 34 } 35 36 store := NewConfigRuleStore(mock) 37 _, err := store.ListAllRuleGroups(context.Background()) 38 39 assert.Equal(t, mock.err, err, "Unexpected error returned") 40 } 41 42 func Test_ConfigRuleStoreReturn(t *testing.T) { 43 id := userconfig.ID(10) 44 mock := &MockClient{ 45 cfgs: map[string]userconfig.VersionedRulesConfig{ 46 "user": { 47 ID: id, 48 Config: fakeRuleConfig(), 49 DeletedAt: zeroTime, 50 }, 51 }, 52 err: nil, 53 } 54 55 store := NewConfigRuleStore(mock) 56 rules, _ := store.ListAllRuleGroups(context.Background()) 57 58 assert.Equal(t, 1, len(rules["user"])) 59 assert.Equal(t, id, store.since) 60 } 61 62 func Test_ConfigRuleStoreDelete(t *testing.T) { 63 mock := &MockClient{ 64 cfgs: map[string]userconfig.VersionedRulesConfig{ 65 "user": { 66 ID: 1, 67 Config: fakeRuleConfig(), 68 DeletedAt: zeroTime, 69 }, 70 }, 71 err: nil, 72 } 73 74 store := NewConfigRuleStore(mock) 75 _, _ = store.ListAllRuleGroups(context.Background()) 76 77 mock.cfgs["user"] = userconfig.VersionedRulesConfig{ 78 ID: 1, 79 Config: userconfig.RulesConfig{}, 80 DeletedAt: time.Unix(0, 1), 81 } 82 83 rules, _ := store.ListAllRuleGroups(context.Background()) 84 85 assert.Equal(t, 0, len(rules["user"])) 86 } 87 88 func Test_ConfigRuleStoreAppend(t *testing.T) { 89 mock := &MockClient{ 90 cfgs: map[string]userconfig.VersionedRulesConfig{ 91 "user": { 92 ID: 1, 93 Config: fakeRuleConfig(), 94 DeletedAt: zeroTime, 95 }, 96 }, 97 err: nil, 98 } 99 100 store := NewConfigRuleStore(mock) 101 _, _ = store.ListAllRuleGroups(context.Background()) 102 103 delete(mock.cfgs, "user") 104 mock.cfgs["user2"] = userconfig.VersionedRulesConfig{ 105 ID: 1, 106 Config: fakeRuleConfig(), 107 DeletedAt: zeroTime, 108 } 109 110 rules, _ := store.ListAllRuleGroups(context.Background()) 111 112 assert.Equal(t, 2, len(rules)) 113 } 114 115 func Test_ConfigRuleStoreSinceSet(t *testing.T) { 116 mock := &MockClient{ 117 cfgs: map[string]userconfig.VersionedRulesConfig{ 118 "user": { 119 ID: 1, 120 Config: fakeRuleConfig(), 121 DeletedAt: zeroTime, 122 }, 123 "user1": { 124 ID: 10, 125 Config: fakeRuleConfig(), 126 DeletedAt: zeroTime, 127 }, 128 "user2": { 129 ID: 100, 130 Config: fakeRuleConfig(), 131 DeletedAt: zeroTime, 132 }, 133 }, 134 err: nil, 135 } 136 137 store := NewConfigRuleStore(mock) 138 _, _ = store.ListAllRuleGroups(context.Background()) 139 assert.Equal(t, userconfig.ID(100), store.since) 140 141 delete(mock.cfgs, "user") 142 delete(mock.cfgs, "user1") 143 mock.cfgs["user2"] = userconfig.VersionedRulesConfig{ 144 ID: 50, 145 Config: fakeRuleConfig(), 146 DeletedAt: zeroTime, 147 } 148 149 _, _ = store.ListAllRuleGroups(context.Background()) 150 assert.Equal(t, userconfig.ID(100), store.since) 151 152 mock.cfgs["user2"] = userconfig.VersionedRulesConfig{ 153 ID: 101, 154 Config: fakeRuleConfig(), 155 DeletedAt: zeroTime, 156 } 157 158 _, _ = store.ListAllRuleGroups(context.Background()) 159 assert.Equal(t, userconfig.ID(101), store.since) 160 } 161 162 func fakeRuleConfig() userconfig.RulesConfig { 163 return userconfig.RulesConfig{ 164 FormatVersion: userconfig.RuleFormatV2, 165 Files: map[string]string{ 166 "test": ` 167 # Config no. 1. 168 groups: 169 - name: example 170 rules: 171 - alert: ScrapeFailed 172 expr: 'up != 1' 173 for: 10m 174 labels: 175 severity: warning 176 annotations: 177 summary: "Scrape of {{$labels.job}} (pod: {{$labels.instance}}) failed." 178 description: "Prometheus cannot reach the /metrics page on the {{$labels.instance}} pod." 179 impact: "We have no monitoring data for {{$labels.job}} - {{$labels.instance}}. At worst, it's completely down. At best, we cannot reliably respond to operational issues." 180 dashboardURL: "$${base_url}/admin/prometheus/targets" 181 `, 182 }, 183 } 184 }