github.com/muhammadn/cortex@v1.9.1-0.20220510110439-46bb7000d03d/pkg/alertmanager/alertstore/local/store_test.go (about) 1 package local 2 3 import ( 4 "context" 5 "fmt" 6 "io/ioutil" 7 "os" 8 "path/filepath" 9 "testing" 10 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13 14 "github.com/cortexproject/cortex/pkg/alertmanager/alertspb" 15 ) 16 17 func TestStore_ListAllUsers(t *testing.T) { 18 ctx := context.Background() 19 store, storeDir := prepareLocalStore(t) 20 21 // The storage is empty. 22 { 23 users, err := store.ListAllUsers(ctx) 24 require.NoError(t, err) 25 assert.Empty(t, users) 26 } 27 28 // The storage contains some users. 29 { 30 user1Cfg := prepareAlertmanagerConfig("user-1") 31 user2Cfg := prepareAlertmanagerConfig("user-2") 32 require.NoError(t, ioutil.WriteFile(filepath.Join(storeDir, "user-1.yaml"), []byte(user1Cfg), os.ModePerm)) 33 require.NoError(t, ioutil.WriteFile(filepath.Join(storeDir, "user-2.yaml"), []byte(user2Cfg), os.ModePerm)) 34 35 // The following file is expected to be skipped. 36 require.NoError(t, ioutil.WriteFile(filepath.Join(storeDir, "user-3.unsupported-extension"), []byte{}, os.ModePerm)) 37 38 users, err := store.ListAllUsers(ctx) 39 require.NoError(t, err) 40 assert.ElementsMatch(t, []string{"user-1", "user-2"}, users) 41 } 42 } 43 44 func TestStore_GetAlertConfig(t *testing.T) { 45 ctx := context.Background() 46 store, storeDir := prepareLocalStore(t) 47 48 // The user has no config. 49 { 50 _, err := store.GetAlertConfig(ctx, "user-1") 51 assert.Equal(t, alertspb.ErrNotFound, err) 52 } 53 54 // The user has a config 55 { 56 user1Cfg := prepareAlertmanagerConfig("user-1") 57 user2Cfg := prepareAlertmanagerConfig("user-2") 58 require.NoError(t, ioutil.WriteFile(filepath.Join(storeDir, "user-1.yaml"), []byte(user1Cfg), os.ModePerm)) 59 require.NoError(t, ioutil.WriteFile(filepath.Join(storeDir, "user-2.yaml"), []byte(user2Cfg), os.ModePerm)) 60 61 config, err := store.GetAlertConfig(ctx, "user-1") 62 require.NoError(t, err) 63 assert.Equal(t, user1Cfg, config.RawConfig) 64 65 config, err = store.GetAlertConfig(ctx, "user-2") 66 require.NoError(t, err) 67 assert.Equal(t, user2Cfg, config.RawConfig) 68 } 69 } 70 71 func TestStore_GetAlertConfigs(t *testing.T) { 72 ctx := context.Background() 73 store, storeDir := prepareLocalStore(t) 74 75 // The storage is empty. 76 { 77 configs, err := store.GetAlertConfigs(ctx, []string{"user-1", "user-2"}) 78 require.NoError(t, err) 79 assert.Empty(t, configs) 80 } 81 82 // The storage contains some configs. 83 { 84 user1Cfg := prepareAlertmanagerConfig("user-1") 85 require.NoError(t, ioutil.WriteFile(filepath.Join(storeDir, "user-1.yaml"), []byte(user1Cfg), os.ModePerm)) 86 87 configs, err := store.GetAlertConfigs(ctx, []string{"user-1", "user-2"}) 88 require.NoError(t, err) 89 assert.Contains(t, configs, "user-1") 90 assert.NotContains(t, configs, "user-2") 91 assert.Equal(t, user1Cfg, configs["user-1"].RawConfig) 92 93 // Add another user config. 94 user2Cfg := prepareAlertmanagerConfig("user-2") 95 require.NoError(t, ioutil.WriteFile(filepath.Join(storeDir, "user-2.yaml"), []byte(user2Cfg), os.ModePerm)) 96 97 configs, err = store.GetAlertConfigs(ctx, []string{"user-1", "user-2"}) 98 require.NoError(t, err) 99 assert.Contains(t, configs, "user-1") 100 assert.Contains(t, configs, "user-2") 101 assert.Equal(t, user1Cfg, configs["user-1"].RawConfig) 102 assert.Equal(t, user2Cfg, configs["user-2"].RawConfig) 103 } 104 } 105 106 func prepareLocalStore(t *testing.T) (store *Store, storeDir string) { 107 var err error 108 109 // Create a temporarily directory for the storage. 110 storeDir, err = ioutil.TempDir(os.TempDir(), "local") 111 require.NoError(t, err) 112 t.Cleanup(func() { 113 require.NoError(t, os.RemoveAll(storeDir)) 114 }) 115 116 store, err = NewStore(StoreConfig{Path: storeDir}) 117 require.NoError(t, err) 118 return 119 } 120 121 func prepareAlertmanagerConfig(userID string) string { 122 return fmt.Sprintf(` 123 global: 124 smtp_smarthost: 'localhost:25' 125 smtp_from: 'alertmanager@example.org' 126 smtp_auth_username: 'alertmanager' 127 smtp_auth_password: 'password' 128 129 route: 130 receiver: send-email 131 132 receivers: 133 - name: send-email 134 email_configs: 135 - to: '%s@localhost' 136 `, userID) 137 }