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  }