github.com/haalcala/mattermost-server-change-repo@v0.0.0-20210713015153-16753fbeee5f/store/localcachelayer/channel_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 "testing" 8 9 "github.com/stretchr/testify/assert" 10 "github.com/stretchr/testify/require" 11 12 "github.com/mattermost/mattermost-server/v5/model" 13 "github.com/mattermost/mattermost-server/v5/store/storetest" 14 "github.com/mattermost/mattermost-server/v5/store/storetest/mocks" 15 ) 16 17 func TestChannelStore(t *testing.T) { 18 StoreTestWithSqlStore(t, storetest.TestReactionStore) 19 } 20 21 func TestChannelStoreChannelMemberCountsCache(t *testing.T) { 22 countResult := int64(10) 23 24 t.Run("first call not cached, second cached and returning same data", func(t *testing.T) { 25 mockStore := getMockStore() 26 mockCacheProvider := getMockCacheProvider() 27 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 28 require.NoError(t, err) 29 30 count, err := cachedStore.Channel().GetMemberCount("id", true) 31 require.NoError(t, err) 32 assert.Equal(t, count, countResult) 33 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 1) 34 count, err = cachedStore.Channel().GetMemberCount("id", true) 35 require.NoError(t, err) 36 assert.Equal(t, count, countResult) 37 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 1) 38 }) 39 40 t.Run("first call not cached, second force not cached", func(t *testing.T) { 41 mockStore := getMockStore() 42 mockCacheProvider := getMockCacheProvider() 43 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 44 require.NoError(t, err) 45 46 cachedStore.Channel().GetMemberCount("id", true) 47 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 1) 48 cachedStore.Channel().GetMemberCount("id", false) 49 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 2) 50 }) 51 52 t.Run("first call force not cached, second not cached, third cached", func(t *testing.T) { 53 mockStore := getMockStore() 54 mockCacheProvider := getMockCacheProvider() 55 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 56 require.NoError(t, err) 57 58 cachedStore.Channel().GetMemberCount("id", false) 59 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 1) 60 cachedStore.Channel().GetMemberCount("id", true) 61 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 2) 62 cachedStore.Channel().GetMemberCount("id", true) 63 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 2) 64 }) 65 66 t.Run("first call with GetMemberCountFromCache not cached, second cached and returning same data", func(t *testing.T) { 67 mockStore := getMockStore() 68 mockCacheProvider := getMockCacheProvider() 69 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 70 require.NoError(t, err) 71 72 count := cachedStore.Channel().GetMemberCountFromCache("id") 73 assert.Equal(t, count, countResult) 74 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 1) 75 count = cachedStore.Channel().GetMemberCountFromCache("id") 76 assert.Equal(t, count, countResult) 77 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 1) 78 }) 79 80 t.Run("first call not cached, clear cache, second call not cached", func(t *testing.T) { 81 mockStore := getMockStore() 82 mockCacheProvider := getMockCacheProvider() 83 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 84 require.NoError(t, err) 85 86 cachedStore.Channel().GetMemberCount("id", true) 87 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 1) 88 cachedStore.Channel().ClearCaches() 89 cachedStore.Channel().GetMemberCount("id", true) 90 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 2) 91 }) 92 93 t.Run("first call not cached, invalidate cache, second call not cached", func(t *testing.T) { 94 mockStore := getMockStore() 95 mockCacheProvider := getMockCacheProvider() 96 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 97 require.NoError(t, err) 98 99 cachedStore.Channel().GetMemberCount("id", true) 100 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 1) 101 cachedStore.Channel().InvalidateMemberCount("id") 102 cachedStore.Channel().GetMemberCount("id", true) 103 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 2) 104 }) 105 } 106 107 func TestChannelStoreChannelPinnedPostsCountsCache(t *testing.T) { 108 countResult := int64(10) 109 110 t.Run("first call not cached, second cached and returning same data", 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 count, err := cachedStore.Channel().GetPinnedPostCount("id", true) 117 require.NoError(t, err) 118 assert.Equal(t, count, countResult) 119 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 1) 120 count, err = cachedStore.Channel().GetPinnedPostCount("id", true) 121 require.NoError(t, err) 122 assert.Equal(t, count, countResult) 123 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 1) 124 }) 125 126 t.Run("first call not cached, second force not cached", func(t *testing.T) { 127 mockStore := getMockStore() 128 mockCacheProvider := getMockCacheProvider() 129 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 130 require.NoError(t, err) 131 132 cachedStore.Channel().GetPinnedPostCount("id", true) 133 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 1) 134 cachedStore.Channel().GetPinnedPostCount("id", false) 135 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 2) 136 }) 137 138 t.Run("first call force not cached, second not cached, third cached", func(t *testing.T) { 139 mockStore := getMockStore() 140 mockCacheProvider := getMockCacheProvider() 141 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 142 require.NoError(t, err) 143 144 cachedStore.Channel().GetPinnedPostCount("id", false) 145 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 1) 146 cachedStore.Channel().GetPinnedPostCount("id", true) 147 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 2) 148 cachedStore.Channel().GetPinnedPostCount("id", true) 149 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 2) 150 }) 151 152 t.Run("first call not cached, clear cache, second call not cached", func(t *testing.T) { 153 mockStore := getMockStore() 154 mockCacheProvider := getMockCacheProvider() 155 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 156 require.NoError(t, err) 157 158 cachedStore.Channel().GetPinnedPostCount("id", true) 159 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 1) 160 cachedStore.Channel().ClearCaches() 161 cachedStore.Channel().GetPinnedPostCount("id", true) 162 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 2) 163 }) 164 165 t.Run("first call not cached, invalidate cache, second call not cached", func(t *testing.T) { 166 mockStore := getMockStore() 167 mockCacheProvider := getMockCacheProvider() 168 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 169 require.NoError(t, err) 170 171 cachedStore.Channel().GetPinnedPostCount("id", true) 172 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 1) 173 cachedStore.Channel().InvalidatePinnedPostCount("id") 174 cachedStore.Channel().GetPinnedPostCount("id", true) 175 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 2) 176 }) 177 } 178 179 func TestChannelStoreGuestCountCache(t *testing.T) { 180 countResult := int64(12) 181 182 t.Run("first call not cached, second cached and returning same data", func(t *testing.T) { 183 mockStore := getMockStore() 184 mockCacheProvider := getMockCacheProvider() 185 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 186 require.NoError(t, err) 187 188 count, err := cachedStore.Channel().GetGuestCount("id", true) 189 require.NoError(t, err) 190 assert.Equal(t, count, countResult) 191 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 1) 192 count, err = cachedStore.Channel().GetGuestCount("id", true) 193 require.NoError(t, err) 194 assert.Equal(t, count, countResult) 195 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 1) 196 }) 197 198 t.Run("first call not cached, second force not cached", func(t *testing.T) { 199 mockStore := getMockStore() 200 mockCacheProvider := getMockCacheProvider() 201 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 202 require.NoError(t, err) 203 204 cachedStore.Channel().GetGuestCount("id", true) 205 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 1) 206 cachedStore.Channel().GetGuestCount("id", false) 207 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 2) 208 }) 209 210 t.Run("first call force not cached, second not cached, third cached", func(t *testing.T) { 211 mockStore := getMockStore() 212 mockCacheProvider := getMockCacheProvider() 213 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 214 require.NoError(t, err) 215 216 cachedStore.Channel().GetGuestCount("id", false) 217 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 1) 218 cachedStore.Channel().GetGuestCount("id", true) 219 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 2) 220 cachedStore.Channel().GetGuestCount("id", true) 221 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 2) 222 }) 223 224 t.Run("first call not cached, clear cache, second call not cached", func(t *testing.T) { 225 mockStore := getMockStore() 226 mockCacheProvider := getMockCacheProvider() 227 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 228 require.NoError(t, err) 229 230 cachedStore.Channel().GetGuestCount("id", true) 231 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 1) 232 cachedStore.Channel().ClearCaches() 233 cachedStore.Channel().GetGuestCount("id", true) 234 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 2) 235 }) 236 237 t.Run("first call not cached, invalidate cache, second call not cached", func(t *testing.T) { 238 mockStore := getMockStore() 239 mockCacheProvider := getMockCacheProvider() 240 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 241 require.NoError(t, err) 242 243 cachedStore.Channel().GetGuestCount("id", true) 244 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 1) 245 cachedStore.Channel().InvalidateGuestCount("id") 246 cachedStore.Channel().GetGuestCount("id", true) 247 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 2) 248 }) 249 } 250 251 func TestChannelStoreChannel(t *testing.T) { 252 channelId := "channel1" 253 fakeChannel := model.Channel{Id: channelId} 254 t.Run("first call by id not cached, second cached and returning same data", func(t *testing.T) { 255 mockStore := getMockStore() 256 mockCacheProvider := getMockCacheProvider() 257 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 258 require.NoError(t, err) 259 260 channel, err := cachedStore.Channel().Get(channelId, true) 261 require.NoError(t, err) 262 assert.Equal(t, channel, &fakeChannel) 263 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 1) 264 channel, err = cachedStore.Channel().Get(channelId, true) 265 require.NoError(t, err) 266 assert.Equal(t, channel, &fakeChannel) 267 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 1) 268 }) 269 270 t.Run("first call not cached, second force no cached", func(t *testing.T) { 271 mockStore := getMockStore() 272 mockCacheProvider := getMockCacheProvider() 273 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 274 require.NoError(t, err) 275 276 cachedStore.Channel().Get(channelId, true) 277 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 1) 278 cachedStore.Channel().Get(channelId, false) 279 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 2) 280 }) 281 282 t.Run("first call force no cached, second not cached, third cached", func(t *testing.T) { 283 mockStore := getMockStore() 284 mockCacheProvider := getMockCacheProvider() 285 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 286 require.NoError(t, err) 287 cachedStore.Channel().Get(channelId, false) 288 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 1) 289 cachedStore.Channel().Get(channelId, true) 290 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 2) 291 cachedStore.Channel().Get(channelId, true) 292 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 2) 293 }) 294 295 t.Run("first call not cached, clear cache, second call not cached", func(t *testing.T) { 296 mockStore := getMockStore() 297 mockCacheProvider := getMockCacheProvider() 298 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 299 require.NoError(t, err) 300 301 cachedStore.Channel().Get(channelId, true) 302 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 1) 303 cachedStore.Channel().ClearCaches() 304 cachedStore.Channel().Get(channelId, true) 305 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 2) 306 }) 307 308 t.Run("first call not cached, invalidate cache, second call not cached", func(t *testing.T) { 309 mockStore := getMockStore() 310 mockCacheProvider := getMockCacheProvider() 311 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 312 require.NoError(t, err) 313 cachedStore.Channel().Get(channelId, true) 314 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 1) 315 cachedStore.Channel().InvalidateChannel(channelId) 316 cachedStore.Channel().Get(channelId, true) 317 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 2) 318 }) 319 }