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  }