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