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  }