github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/store/localcachelayer/post_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 "fmt" 8 "testing" 9 10 "github.com/mattermost/mattermost-server/v5/model" 11 "github.com/mattermost/mattermost-server/v5/store/storetest" 12 "github.com/mattermost/mattermost-server/v5/store/storetest/mocks" 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/require" 15 ) 16 17 func TestPostStore(t *testing.T) { 18 StoreTestWithSqlSupplier(t, storetest.TestPostStore) 19 } 20 21 func TestPostStoreLastPostTimeCache(t *testing.T) { 22 var fakeLastTime int64 = 1 23 channelId := "channelId" 24 fakeOptions := model.GetPostsSinceOptions{ 25 ChannelId: channelId, 26 Time: fakeLastTime, 27 SkipFetchThreads: false, 28 } 29 30 t.Run("GetEtag: first call not cached, second cached and returning same data", func(t *testing.T) { 31 mockStore := getMockStore() 32 mockCacheProvider := getMockCacheProvider() 33 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 34 35 expectedResult := fmt.Sprintf("%v.%v", model.CurrentVersion, fakeLastTime) 36 37 etag := cachedStore.Post().GetEtag(channelId, true) 38 assert.Equal(t, etag, expectedResult) 39 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetEtag", 1) 40 41 etag = cachedStore.Post().GetEtag(channelId, true) 42 assert.Equal(t, etag, expectedResult) 43 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetEtag", 1) 44 }) 45 46 t.Run("GetEtag: first call not cached, second force no cached", func(t *testing.T) { 47 mockStore := getMockStore() 48 mockCacheProvider := getMockCacheProvider() 49 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 50 51 cachedStore.Post().GetEtag(channelId, true) 52 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetEtag", 1) 53 cachedStore.Post().GetEtag(channelId, false) 54 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetEtag", 2) 55 }) 56 57 t.Run("GetEtag: first call not cached, invalidate, and then not cached again", func(t *testing.T) { 58 mockStore := getMockStore() 59 mockCacheProvider := getMockCacheProvider() 60 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 61 62 cachedStore.Post().GetEtag(channelId, true) 63 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetEtag", 1) 64 cachedStore.Post().InvalidateLastPostTimeCache(channelId) 65 cachedStore.Post().GetEtag(channelId, true) 66 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetEtag", 2) 67 }) 68 69 t.Run("GetEtag: first call not cached, clear caches, and then not cached again", func(t *testing.T) { 70 mockStore := getMockStore() 71 mockCacheProvider := getMockCacheProvider() 72 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 73 74 cachedStore.Post().GetEtag(channelId, true) 75 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetEtag", 1) 76 cachedStore.Post().ClearCaches() 77 cachedStore.Post().GetEtag(channelId, true) 78 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetEtag", 2) 79 }) 80 81 t.Run("GetPostsSince: first call not cached, second cached and returning same data", func(t *testing.T) { 82 mockStore := getMockStore() 83 mockCacheProvider := getMockCacheProvider() 84 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 85 86 expectedResult := model.NewPostList() 87 88 list, err := cachedStore.Post().GetPostsSince(fakeOptions, true) 89 require.Nil(t, err) 90 assert.Equal(t, list, expectedResult) 91 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetPostsSince", 1) 92 93 list, err = cachedStore.Post().GetPostsSince(fakeOptions, true) 94 require.Nil(t, err) 95 assert.Equal(t, list, expectedResult) 96 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetPostsSince", 1) 97 }) 98 99 t.Run("GetPostsSince: first call not cached, second force no cached", func(t *testing.T) { 100 mockStore := getMockStore() 101 mockCacheProvider := getMockCacheProvider() 102 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 103 104 cachedStore.Post().GetPostsSince(fakeOptions, true) 105 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetPostsSince", 1) 106 cachedStore.Post().GetPostsSince(fakeOptions, false) 107 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetPostsSince", 2) 108 }) 109 110 t.Run("GetPostsSince: first call not cached, invalidate, and then not cached again", func(t *testing.T) { 111 mockStore := getMockStore() 112 mockCacheProvider := getMockCacheProvider() 113 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 114 115 cachedStore.Post().GetPostsSince(fakeOptions, true) 116 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetPostsSince", 1) 117 cachedStore.Post().InvalidateLastPostTimeCache(channelId) 118 cachedStore.Post().GetPostsSince(fakeOptions, true) 119 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetPostsSince", 2) 120 }) 121 122 t.Run("GetPostsSince: first call not cached, clear caches, and then not cached again", func(t *testing.T) { 123 mockStore := getMockStore() 124 mockCacheProvider := getMockCacheProvider() 125 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 126 127 cachedStore.Post().GetPostsSince(fakeOptions, true) 128 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetPostsSince", 1) 129 cachedStore.Post().ClearCaches() 130 cachedStore.Post().GetPostsSince(fakeOptions, true) 131 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetPostsSince", 2) 132 }) 133 } 134 135 func TestPostStoreCache(t *testing.T) { 136 fakePosts := &model.PostList{} 137 fakeOptions := model.GetPostsOptions{ChannelId: "123", PerPage: 30} 138 139 t.Run("first call not cached, second cached and returning same data", func(t *testing.T) { 140 mockStore := getMockStore() 141 mockCacheProvider := getMockCacheProvider() 142 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 143 144 gotPosts, err := cachedStore.Post().GetPosts(fakeOptions, true) 145 require.Nil(t, err) 146 assert.Equal(t, fakePosts, gotPosts) 147 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetPosts", 1) 148 149 _, _ = cachedStore.Post().GetPosts(fakeOptions, true) 150 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetPosts", 1) 151 }) 152 153 t.Run("first call not cached, second force not cached", func(t *testing.T) { 154 mockStore := getMockStore() 155 mockCacheProvider := getMockCacheProvider() 156 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 157 158 gotPosts, err := cachedStore.Post().GetPosts(fakeOptions, true) 159 require.Nil(t, err) 160 assert.Equal(t, fakePosts, gotPosts) 161 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetPosts", 1) 162 163 _, _ = cachedStore.Post().GetPosts(fakeOptions, false) 164 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetPosts", 2) 165 }) 166 167 t.Run("first call not cached, invalidate, and then not cached again", func(t *testing.T) { 168 mockStore := getMockStore() 169 mockCacheProvider := getMockCacheProvider() 170 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 171 172 gotPosts, err := cachedStore.Post().GetPosts(fakeOptions, true) 173 require.Nil(t, err) 174 assert.Equal(t, fakePosts, gotPosts) 175 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetPosts", 1) 176 177 cachedStore.Post().InvalidateLastPostTimeCache("12360") 178 179 _, _ = cachedStore.Post().GetPosts(fakeOptions, true) 180 mockStore.Post().(*mocks.PostStore).AssertNumberOfCalls(t, "GetPosts", 1) 181 182 }) 183 }