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