github.com/jfrerich/mattermost-server@v5.8.0-rc2+incompatible/store/storetest/link_metadata_store.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package storetest 5 6 import ( 7 "net/http" 8 "testing" 9 "time" 10 11 "github.com/dyatlov/go-opengraph/opengraph" 12 "github.com/mattermost/mattermost-server/model" 13 "github.com/mattermost/mattermost-server/store" 14 "github.com/stretchr/testify/assert" 15 "github.com/stretchr/testify/require" 16 ) 17 18 // These tests are ran on the same store instance, so this provides easier unique, valid timestamps 19 var linkMetadataTimestamp int64 = 1546300800000 20 21 func getNextLinkMetadataTimestamp() int64 { 22 linkMetadataTimestamp += int64(time.Hour) / 1000 23 return linkMetadataTimestamp 24 } 25 26 func TestLinkMetadataStore(t *testing.T, ss store.Store) { 27 t.Run("Save", func(t *testing.T) { testLinkMetadataStoreSave(t, ss) }) 28 t.Run("Get", func(t *testing.T) { testLinkMetadataStoreGet(t, ss) }) 29 t.Run("Types", func(t *testing.T) { testLinkMetadataStoreTypes(t, ss) }) 30 } 31 32 func testLinkMetadataStoreSave(t *testing.T, ss store.Store) { 33 t.Run("should save item", func(t *testing.T) { 34 metadata := &model.LinkMetadata{ 35 URL: "http://example.com", 36 Timestamp: getNextLinkMetadataTimestamp(), 37 Type: model.LINK_METADATA_TYPE_IMAGE, 38 Data: &model.PostImage{}, 39 } 40 41 result := <-ss.LinkMetadata().Save(metadata) 42 43 require.Nil(t, result.Err) 44 require.IsType(t, metadata, result.Data) 45 assert.Equal(t, *metadata, *result.Data.(*model.LinkMetadata)) 46 }) 47 48 t.Run("should fail to save invalid item", func(t *testing.T) { 49 metadata := &model.LinkMetadata{ 50 URL: "", 51 Timestamp: 0, 52 Type: "garbage", 53 Data: nil, 54 } 55 56 result := <-ss.LinkMetadata().Save(metadata) 57 58 assert.NotNil(t, result.Err) 59 }) 60 61 t.Run("should save with duplicate URL and different timestamp", func(t *testing.T) { 62 metadata := &model.LinkMetadata{ 63 URL: "http://example.com", 64 Timestamp: getNextLinkMetadataTimestamp(), 65 Type: model.LINK_METADATA_TYPE_IMAGE, 66 Data: &model.PostImage{}, 67 } 68 69 result := <-ss.LinkMetadata().Save(metadata) 70 require.Nil(t, result.Err) 71 72 metadata.Timestamp = getNextLinkMetadataTimestamp() 73 74 result = <-ss.LinkMetadata().Save(metadata) 75 76 require.Nil(t, result.Err) 77 require.IsType(t, metadata, result.Data) 78 assert.Equal(t, *metadata, *result.Data.(*model.LinkMetadata)) 79 }) 80 81 t.Run("should save with duplicate timestamp and different URL", func(t *testing.T) { 82 metadata := &model.LinkMetadata{ 83 URL: "http://example.com", 84 Timestamp: getNextLinkMetadataTimestamp(), 85 Type: model.LINK_METADATA_TYPE_IMAGE, 86 Data: &model.PostImage{}, 87 } 88 89 result := <-ss.LinkMetadata().Save(metadata) 90 require.Nil(t, result.Err) 91 92 metadata.URL = "http://example.com/another/page" 93 94 result = <-ss.LinkMetadata().Save(metadata) 95 96 require.Nil(t, result.Err) 97 require.IsType(t, metadata, result.Data) 98 assert.Equal(t, *metadata, *result.Data.(*model.LinkMetadata)) 99 }) 100 101 t.Run("should fail to save with duplicate URL and timestamp", func(t *testing.T) { 102 metadata := &model.LinkMetadata{ 103 URL: "http://example.com", 104 Timestamp: getNextLinkMetadataTimestamp(), 105 Type: model.LINK_METADATA_TYPE_IMAGE, 106 Data: &model.PostImage{}, 107 } 108 109 result := <-ss.LinkMetadata().Save(metadata) 110 require.Nil(t, result.Err) 111 112 result = <-ss.LinkMetadata().Save(metadata) 113 114 assert.NotNil(t, result.Err) 115 }) 116 } 117 118 func testLinkMetadataStoreGet(t *testing.T, ss store.Store) { 119 t.Run("should get value", func(t *testing.T) { 120 metadata := &model.LinkMetadata{ 121 URL: "http://example.com", 122 Timestamp: getNextLinkMetadataTimestamp(), 123 Type: model.LINK_METADATA_TYPE_IMAGE, 124 Data: &model.PostImage{}, 125 } 126 127 result := <-ss.LinkMetadata().Save(metadata) 128 require.Nil(t, result.Err) 129 130 result = <-ss.LinkMetadata().Get(metadata.URL, metadata.Timestamp) 131 132 require.Nil(t, result.Err) 133 require.IsType(t, metadata, result.Data) 134 assert.Equal(t, *metadata, *result.Data.(*model.LinkMetadata)) 135 }) 136 137 t.Run("should return not found with incorrect URL", func(t *testing.T) { 138 metadata := &model.LinkMetadata{ 139 URL: "http://example.com", 140 Timestamp: getNextLinkMetadataTimestamp(), 141 Type: model.LINK_METADATA_TYPE_IMAGE, 142 Data: &model.PostImage{}, 143 } 144 145 result := <-ss.LinkMetadata().Save(metadata) 146 require.Nil(t, result.Err) 147 148 result = <-ss.LinkMetadata().Get("http://example.com/another_page", metadata.Timestamp) 149 150 require.NotNil(t, result.Err) 151 assert.Equal(t, http.StatusNotFound, result.Err.StatusCode) 152 }) 153 154 t.Run("should return not found with incorrect timestamp", func(t *testing.T) { 155 metadata := &model.LinkMetadata{ 156 URL: "http://example.com", 157 Timestamp: getNextLinkMetadataTimestamp(), 158 Type: model.LINK_METADATA_TYPE_IMAGE, 159 Data: &model.PostImage{}, 160 } 161 162 result := <-ss.LinkMetadata().Save(metadata) 163 require.Nil(t, result.Err) 164 165 result = <-ss.LinkMetadata().Get(metadata.URL, getNextLinkMetadataTimestamp()) 166 167 require.NotNil(t, result.Err) 168 assert.Equal(t, http.StatusNotFound, result.Err.StatusCode) 169 }) 170 } 171 172 func testLinkMetadataStoreTypes(t *testing.T, ss store.Store) { 173 t.Run("should save and get image metadata", func(t *testing.T) { 174 metadata := &model.LinkMetadata{ 175 URL: "http://example.com", 176 Timestamp: getNextLinkMetadataTimestamp(), 177 Type: model.LINK_METADATA_TYPE_IMAGE, 178 Data: &model.PostImage{ 179 Width: 123, 180 Height: 456, 181 }, 182 } 183 184 result := <-ss.LinkMetadata().Save(metadata) 185 require.Nil(t, result.Err) 186 187 received := result.Data.(*model.LinkMetadata) 188 require.IsType(t, &model.PostImage{}, received.Data) 189 assert.Equal(t, *(metadata.Data.(*model.PostImage)), *(received.Data.(*model.PostImage))) 190 191 result = <-ss.LinkMetadata().Get(metadata.URL, metadata.Timestamp) 192 require.Nil(t, result.Err) 193 194 received = result.Data.(*model.LinkMetadata) 195 require.IsType(t, &model.PostImage{}, received.Data) 196 assert.Equal(t, *(metadata.Data.(*model.PostImage)), *(received.Data.(*model.PostImage))) 197 }) 198 199 t.Run("should save and get opengraph data", func(t *testing.T) { 200 og := &opengraph.OpenGraph{ 201 URL: "http://example.com", 202 Images: []*opengraph.Image{ 203 { 204 URL: "http://example.com/image.png", 205 }, 206 }, 207 } 208 209 metadata := &model.LinkMetadata{ 210 URL: "http://example.com", 211 Timestamp: getNextLinkMetadataTimestamp(), 212 Type: model.LINK_METADATA_TYPE_OPENGRAPH, 213 Data: og, 214 } 215 216 result := <-ss.LinkMetadata().Save(metadata) 217 require.Nil(t, result.Err) 218 219 received := result.Data.(*model.LinkMetadata) 220 require.IsType(t, &opengraph.OpenGraph{}, received.Data) 221 assert.Equal(t, *(metadata.Data.(*opengraph.OpenGraph)), *(received.Data.(*opengraph.OpenGraph))) 222 223 result = <-ss.LinkMetadata().Get(metadata.URL, metadata.Timestamp) 224 require.Nil(t, result.Err) 225 226 received = result.Data.(*model.LinkMetadata) 227 require.IsType(t, &opengraph.OpenGraph{}, received.Data) 228 assert.Equal(t, *(metadata.Data.(*opengraph.OpenGraph)), *(received.Data.(*opengraph.OpenGraph))) 229 }) 230 231 t.Run("should save and get nil", func(t *testing.T) { 232 metadata := &model.LinkMetadata{ 233 URL: "http://example.com", 234 Timestamp: getNextLinkMetadataTimestamp(), 235 Type: model.LINK_METADATA_TYPE_NONE, 236 Data: nil, 237 } 238 239 result := <-ss.LinkMetadata().Save(metadata) 240 require.Nil(t, result.Err) 241 242 received := result.Data.(*model.LinkMetadata) 243 assert.Nil(t, received.Data) 244 245 result = <-ss.LinkMetadata().Get(metadata.URL, metadata.Timestamp) 246 require.Nil(t, result.Err) 247 248 received = result.Data.(*model.LinkMetadata) 249 require.Nil(t, received.Data) 250 }) 251 }