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  }