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 }