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  }