github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/store/localcachelayer/emoji_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 "context" 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 TestEmojiStore(t *testing.T) { 18 // StoreTest(t, storetest.TestEmojiStore) 19 // } 20 21 func TestEmojiStoreCache(t *testing.T) { 22 fakeEmoji := model.Emoji{Id: "123", Name: "name123"} 23 ctxEmoji := model.Emoji{Id: "master", Name: "name123"} 24 25 t.Run("first call by id not cached, second cached and returning same data", func(t *testing.T) { 26 mockStore := getMockStore() 27 mockCacheProvider := getMockCacheProvider() 28 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 29 require.NoError(t, err) 30 31 emoji, err := cachedStore.Emoji().Get(context.Background(), "123", true) 32 require.NoError(t, err) 33 assert.Equal(t, emoji, &fakeEmoji) 34 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 1) 35 emoji, err = cachedStore.Emoji().Get(context.Background(), "123", true) 36 require.NoError(t, err) 37 assert.Equal(t, emoji, &fakeEmoji) 38 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 1) 39 }) 40 41 t.Run("first call by name not cached, second cached and returning same data", func(t *testing.T) { 42 mockStore := getMockStore() 43 mockCacheProvider := getMockCacheProvider() 44 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 45 require.NoError(t, err) 46 47 emoji, err := cachedStore.Emoji().GetByName(context.Background(), "name123", true) 48 require.NoError(t, err) 49 assert.Equal(t, emoji, &fakeEmoji) 50 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 1) 51 emoji, err = cachedStore.Emoji().GetByName(context.Background(), "name123", true) 52 require.NoError(t, err) 53 assert.Equal(t, emoji, &fakeEmoji) 54 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 1) 55 }) 56 57 t.Run("first call by id not cached, second force not cached", func(t *testing.T) { 58 mockStore := getMockStore() 59 mockCacheProvider := getMockCacheProvider() 60 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 61 require.NoError(t, err) 62 63 cachedStore.Emoji().Get(context.Background(), "123", true) 64 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 1) 65 cachedStore.Emoji().Get(context.Background(), "123", false) 66 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 2) 67 }) 68 69 t.Run("first call by name not cached, second force not cached", func(t *testing.T) { 70 mockStore := getMockStore() 71 mockCacheProvider := getMockCacheProvider() 72 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 73 require.NoError(t, err) 74 75 cachedStore.Emoji().GetByName(context.Background(), "name123", true) 76 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 1) 77 cachedStore.Emoji().GetByName(context.Background(), "name123", false) 78 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 2) 79 }) 80 81 t.Run("first call by id force not cached, second not cached, third cached", func(t *testing.T) { 82 mockStore := getMockStore() 83 mockCacheProvider := getMockCacheProvider() 84 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 85 require.NoError(t, err) 86 87 cachedStore.Emoji().Get(context.Background(), "123", false) 88 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 1) 89 cachedStore.Emoji().Get(context.Background(), "123", true) 90 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 2) 91 cachedStore.Emoji().Get(context.Background(), "123", true) 92 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 2) 93 }) 94 95 t.Run("first call by name force not cached, second not cached, third cached", func(t *testing.T) { 96 mockStore := getMockStore() 97 mockCacheProvider := getMockCacheProvider() 98 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 99 require.NoError(t, err) 100 101 cachedStore.Emoji().GetByName(context.Background(), "name123", false) 102 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 1) 103 cachedStore.Emoji().GetByName(context.Background(), "name123", true) 104 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 2) 105 cachedStore.Emoji().GetByName(context.Background(), "name123", true) 106 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 2) 107 }) 108 109 t.Run("first call by id, second call by name cached", 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 cachedStore.Emoji().Get(context.Background(), "123", true) 116 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 1) 117 cachedStore.Emoji().GetByName(context.Background(), "name123", true) 118 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 0) 119 }) 120 121 t.Run("first call by name, second call by id cached", func(t *testing.T) { 122 mockStore := getMockStore() 123 mockCacheProvider := getMockCacheProvider() 124 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 125 require.NoError(t, err) 126 127 cachedStore.Emoji().GetByName(context.Background(), "name123", true) 128 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 1) 129 cachedStore.Emoji().Get(context.Background(), "123", true) 130 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 0) 131 }) 132 133 t.Run("first call by id not cached, invalidate, and then not cached again", func(t *testing.T) { 134 mockStore := getMockStore() 135 mockCacheProvider := getMockCacheProvider() 136 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 137 require.NoError(t, err) 138 139 cachedStore.Emoji().Get(context.Background(), "123", true) 140 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 1) 141 cachedStore.Emoji().Delete(&fakeEmoji, 0) 142 cachedStore.Emoji().Get(context.Background(), "123", true) 143 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 2) 144 }) 145 146 t.Run("call by id, use master", func(t *testing.T) { 147 mockStore := getMockStore() 148 mockCacheProvider := getMockCacheProvider() 149 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 150 require.NoError(t, err) 151 152 cachedStore.Emoji().Get(context.Background(), "master", true) 153 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 1) 154 cachedStore.Emoji().Delete(&ctxEmoji, 0) 155 cachedStore.Emoji().Get(context.Background(), "master", true) 156 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "Get", 2) 157 }) 158 159 t.Run("first call by name not cached, invalidate, and then not cached again", func(t *testing.T) { 160 mockStore := getMockStore() 161 mockCacheProvider := getMockCacheProvider() 162 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 163 require.NoError(t, err) 164 165 cachedStore.Emoji().GetByName(context.Background(), "name123", true) 166 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 1) 167 cachedStore.Emoji().Delete(&fakeEmoji, 0) 168 cachedStore.Emoji().GetByName(context.Background(), "name123", true) 169 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 2) 170 }) 171 172 t.Run("call by name, use master", func(t *testing.T) { 173 mockStore := getMockStore() 174 mockCacheProvider := getMockCacheProvider() 175 cachedStore, err := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 176 require.NoError(t, err) 177 178 cachedStore.Emoji().GetByName(context.Background(), "master", true) 179 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 1) 180 cachedStore.Emoji().Delete(&ctxEmoji, 0) 181 cachedStore.Emoji().GetByName(context.Background(), "master", true) 182 mockStore.Emoji().(*mocks.EmojiStore).AssertNumberOfCalls(t, "GetByName", 2) 183 }) 184 }