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  }