github.com/mattermost/mattermost-server/v5@v5.39.3/store/localcachelayer/emoji_layer_test.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package localcachelayer
     5  
     6  import (
     7  	"context"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/mattermost/mattermost-server/v5/model"
    14  	"github.com/mattermost/mattermost-server/v5/store/storetest"
    15  	"github.com/mattermost/mattermost-server/v5/store/storetest/mocks"
    16  )
    17  
    18  func TestEmojiStore(t *testing.T) {
    19  	StoreTest(t, storetest.TestEmojiStore)
    20  }
    21  
    22  func TestEmojiStoreCache(t *testing.T) {
    23  	fakeEmoji := model.Emoji{Id: "123", Name: "name123"}
    24  	ctxEmoji := model.Emoji{Id: "master", Name: "name123"}
    25  
    26  	t.Run("first call by id not cached, second cached and returning same data", func(t *testing.T) {
    27  		mockStore := getMockStore()
    28  		mockCacheProvider := getMockCacheProvider()
    29  		cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider)
    30  		require.NoError(t, err)
    31  
    32  		emoji, err := cachedStore.Emoji().Get(context.Background(), "123", true)
    33  		require.NoError(t, err)
    34  		assert.Equal(t, emoji, &fakeEmoji)
    35  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 1)
    36  		emoji, err = cachedStore.Emoji().Get(context.Background(), "123", true)
    37  		require.NoError(t, err)
    38  		assert.Equal(t, emoji, &fakeEmoji)
    39  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 1)
    40  	})
    41  
    42  	t.Run("first call by name not cached, second cached and returning same data", func(t *testing.T) {
    43  		mockStore := getMockStore()
    44  		mockCacheProvider := getMockCacheProvider()
    45  		cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider)
    46  		require.NoError(t, err)
    47  
    48  		emoji, err := cachedStore.Emoji().GetByName(context.Background(), "name123", true)
    49  		require.NoError(t, err)
    50  		assert.Equal(t, emoji, &fakeEmoji)
    51  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 1)
    52  		emoji, err = cachedStore.Emoji().GetByName(context.Background(), "name123", true)
    53  		require.NoError(t, err)
    54  		assert.Equal(t, emoji, &fakeEmoji)
    55  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 1)
    56  	})
    57  
    58  	t.Run("first call by id not cached, second force not cached", func(t *testing.T) {
    59  		mockStore := getMockStore()
    60  		mockCacheProvider := getMockCacheProvider()
    61  		cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider)
    62  		require.NoError(t, err)
    63  
    64  		cachedStore.Emoji().Get(context.Background(), "123", true)
    65  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 1)
    66  		cachedStore.Emoji().Get(context.Background(), "123", false)
    67  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 2)
    68  	})
    69  
    70  	t.Run("first call by name not cached, second force not cached", func(t *testing.T) {
    71  		mockStore := getMockStore()
    72  		mockCacheProvider := getMockCacheProvider()
    73  		cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider)
    74  		require.NoError(t, err)
    75  
    76  		cachedStore.Emoji().GetByName(context.Background(), "name123", true)
    77  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 1)
    78  		cachedStore.Emoji().GetByName(context.Background(), "name123", false)
    79  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 2)
    80  	})
    81  
    82  	t.Run("first call by id force not cached, second not cached, third cached", func(t *testing.T) {
    83  		mockStore := getMockStore()
    84  		mockCacheProvider := getMockCacheProvider()
    85  		cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider)
    86  		require.NoError(t, err)
    87  
    88  		cachedStore.Emoji().Get(context.Background(), "123", false)
    89  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 1)
    90  		cachedStore.Emoji().Get(context.Background(), "123", true)
    91  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 2)
    92  		cachedStore.Emoji().Get(context.Background(), "123", true)
    93  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 2)
    94  	})
    95  
    96  	t.Run("first call by name force not cached, second not cached, third cached", func(t *testing.T) {
    97  		mockStore := getMockStore()
    98  		mockCacheProvider := getMockCacheProvider()
    99  		cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider)
   100  		require.NoError(t, err)
   101  
   102  		cachedStore.Emoji().GetByName(context.Background(), "name123", false)
   103  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 1)
   104  		cachedStore.Emoji().GetByName(context.Background(), "name123", true)
   105  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 2)
   106  		cachedStore.Emoji().GetByName(context.Background(), "name123", true)
   107  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 2)
   108  	})
   109  
   110  	t.Run("first call by id, second call by name cached", func(t *testing.T) {
   111  		mockStore := getMockStore()
   112  		mockCacheProvider := getMockCacheProvider()
   113  		cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider)
   114  		require.NoError(t, err)
   115  
   116  		cachedStore.Emoji().Get(context.Background(), "123", true)
   117  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 1)
   118  		cachedStore.Emoji().GetByName(context.Background(), "name123", true)
   119  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 0)
   120  	})
   121  
   122  	t.Run("first call by name, second call by id cached", func(t *testing.T) {
   123  		mockStore := getMockStore()
   124  		mockCacheProvider := getMockCacheProvider()
   125  		cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider)
   126  		require.NoError(t, err)
   127  
   128  		cachedStore.Emoji().GetByName(context.Background(), "name123", true)
   129  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 1)
   130  		cachedStore.Emoji().Get(context.Background(), "123", true)
   131  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 0)
   132  	})
   133  
   134  	t.Run("first call by id not cached, invalidate, and then not cached again", func(t *testing.T) {
   135  		mockStore := getMockStore()
   136  		mockCacheProvider := getMockCacheProvider()
   137  		cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider)
   138  		require.NoError(t, err)
   139  
   140  		cachedStore.Emoji().Get(context.Background(), "123", true)
   141  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 1)
   142  		cachedStore.Emoji().Delete(&fakeEmoji, 0)
   143  		cachedStore.Emoji().Get(context.Background(), "123", true)
   144  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 2)
   145  	})
   146  
   147  	t.Run("call by id, use master", func(t *testing.T) {
   148  		mockStore := getMockStore()
   149  		mockCacheProvider := getMockCacheProvider()
   150  		cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider)
   151  		require.NoError(t, err)
   152  
   153  		cachedStore.Emoji().Get(context.Background(), "master", true)
   154  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 1)
   155  		cachedStore.Emoji().Delete(&ctxEmoji, 0)
   156  		cachedStore.Emoji().Get(context.Background(), "master", true)
   157  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 2)
   158  	})
   159  
   160  	t.Run("first call by name not cached, invalidate, and then not cached again", func(t *testing.T) {
   161  		mockStore := getMockStore()
   162  		mockCacheProvider := getMockCacheProvider()
   163  		cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider)
   164  		require.NoError(t, err)
   165  
   166  		cachedStore.Emoji().GetByName(context.Background(), "name123", true)
   167  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 1)
   168  		cachedStore.Emoji().Delete(&fakeEmoji, 0)
   169  		cachedStore.Emoji().GetByName(context.Background(), "name123", true)
   170  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 2)
   171  	})
   172  
   173  	t.Run("call by name, use master", func(t *testing.T) {
   174  		mockStore := getMockStore()
   175  		mockCacheProvider := getMockCacheProvider()
   176  		cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider)
   177  		require.NoError(t, err)
   178  
   179  		cachedStore.Emoji().GetByName(context.Background(), "master", true)
   180  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 1)
   181  		cachedStore.Emoji().Delete(&ctxEmoji, 0)
   182  		cachedStore.Emoji().GetByName(context.Background(), "master", true)
   183  		mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 2)
   184  	})
   185  }