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