github.com/nmintoh/dserver@v5.11.1+incompatible/model/link_metadata_test.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package model
     5  
     6  import (
     7  	"encoding/json"
     8  	"testing"
     9  
    10  	"github.com/dyatlov/go-opengraph/opengraph"
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func TestLinkMetadataIsValid(t *testing.T) {
    16  	for _, test := range []struct {
    17  		Name     string
    18  		Metadata *LinkMetadata
    19  		Expected bool
    20  	}{
    21  		{
    22  			Name: "should be valid image metadata",
    23  			Metadata: &LinkMetadata{
    24  				URL:       "http://example.com",
    25  				Timestamp: 1546300800000,
    26  				Type:      LINK_METADATA_TYPE_IMAGE,
    27  				Data:      &PostImage{},
    28  			},
    29  			Expected: true,
    30  		},
    31  		{
    32  			Name: "should be valid opengraph metadata",
    33  			Metadata: &LinkMetadata{
    34  				URL:       "http://example.com",
    35  				Timestamp: 1546300800000,
    36  				Type:      LINK_METADATA_TYPE_OPENGRAPH,
    37  				Data:      &opengraph.OpenGraph{},
    38  			},
    39  			Expected: true,
    40  		},
    41  		{
    42  			Name: "should be valid with no metadata",
    43  			Metadata: &LinkMetadata{
    44  				URL:       "http://example.com",
    45  				Timestamp: 1546300800000,
    46  				Type:      LINK_METADATA_TYPE_NONE,
    47  				Data:      nil,
    48  			},
    49  			Expected: true,
    50  		},
    51  		{
    52  			Name: "should be invalid because of empty URL",
    53  			Metadata: &LinkMetadata{
    54  				Timestamp: 1546300800000,
    55  				Type:      LINK_METADATA_TYPE_IMAGE,
    56  				Data:      &PostImage{},
    57  			},
    58  			Expected: false,
    59  		},
    60  		{
    61  			Name: "should be invalid because of empty timestamp",
    62  			Metadata: &LinkMetadata{
    63  				URL:  "http://example.com",
    64  				Type: LINK_METADATA_TYPE_IMAGE,
    65  				Data: &PostImage{},
    66  			},
    67  			Expected: false,
    68  		},
    69  		{
    70  			Name: "should be invalid because of unrounded timestamp",
    71  			Metadata: &LinkMetadata{
    72  				URL:       "http://example.com",
    73  				Timestamp: 1546300800001,
    74  				Type:      LINK_METADATA_TYPE_IMAGE,
    75  				Data:      &PostImage{},
    76  			},
    77  			Expected: false,
    78  		},
    79  		{
    80  			Name: "should be invalid because of invalid type",
    81  			Metadata: &LinkMetadata{
    82  				URL:       "http://example.com",
    83  				Timestamp: 1546300800000,
    84  				Type:      "garbage",
    85  				Data:      &PostImage{},
    86  			},
    87  			Expected: false,
    88  		},
    89  		{
    90  			Name: "should be invalid because of empty data",
    91  			Metadata: &LinkMetadata{
    92  				URL:       "http://example.com",
    93  				Timestamp: 1546300800000,
    94  				Type:      LINK_METADATA_TYPE_IMAGE,
    95  			},
    96  			Expected: false,
    97  		},
    98  		{
    99  			Name: "should be invalid because of mismatched data and type, image type and opengraph data",
   100  			Metadata: &LinkMetadata{
   101  				URL:       "http://example.com",
   102  				Timestamp: 1546300800000,
   103  				Type:      LINK_METADATA_TYPE_IMAGE,
   104  				Data:      &opengraph.OpenGraph{},
   105  			},
   106  			Expected: false,
   107  		},
   108  		{
   109  			Name: "should be invalid because of mismatched data and type, opengraph type and image data",
   110  			Metadata: &LinkMetadata{
   111  				URL:       "http://example.com",
   112  				Timestamp: 1546300800000,
   113  				Type:      LINK_METADATA_TYPE_OPENGRAPH,
   114  				Data:      &PostImage{},
   115  			},
   116  			Expected: false,
   117  		},
   118  		{
   119  			Name: "should be invalid because of mismatched data and type, image type and random data",
   120  			Metadata: &LinkMetadata{
   121  				URL:       "http://example.com",
   122  				Timestamp: 1546300800000,
   123  				Type:      LINK_METADATA_TYPE_OPENGRAPH,
   124  				Data:      &Channel{},
   125  			},
   126  			Expected: false,
   127  		},
   128  	} {
   129  		t.Run(test.Name, func(t *testing.T) {
   130  			err := test.Metadata.IsValid()
   131  
   132  			if test.Expected {
   133  				assert.Nil(t, err)
   134  			} else {
   135  				assert.NotNil(t, err)
   136  			}
   137  		})
   138  	}
   139  }
   140  
   141  func TestLinkMetadataDeserializeDataToConcreteType(t *testing.T) {
   142  	t.Run("should convert []byte to PostImage", func(t *testing.T) {
   143  		image := &PostImage{
   144  			Height: 400,
   145  			Width:  500,
   146  		}
   147  
   148  		metadata := &LinkMetadata{
   149  			Type: LINK_METADATA_TYPE_IMAGE,
   150  			Data: []byte(image.ToJson()),
   151  		}
   152  
   153  		require.IsType(t, []byte{}, metadata.Data)
   154  
   155  		err := metadata.DeserializeDataToConcreteType()
   156  
   157  		assert.Nil(t, err)
   158  		assert.IsType(t, &PostImage{}, metadata.Data)
   159  		assert.Equal(t, *image, *metadata.Data.(*PostImage))
   160  	})
   161  
   162  	t.Run("should convert string to OpenGraph", func(t *testing.T) {
   163  		og := &opengraph.OpenGraph{
   164  			URL:         "http://example.com",
   165  			Description: "Hello, world!",
   166  			Images: []*opengraph.Image{
   167  				{
   168  					URL: "http://example.com/image.png",
   169  				},
   170  			},
   171  		}
   172  
   173  		b, err := json.Marshal(og)
   174  
   175  		require.Nil(t, err)
   176  
   177  		metadata := &LinkMetadata{
   178  			Type: LINK_METADATA_TYPE_OPENGRAPH,
   179  			Data: b,
   180  		}
   181  
   182  		require.IsType(t, []byte{}, metadata.Data)
   183  
   184  		err = metadata.DeserializeDataToConcreteType()
   185  
   186  		assert.Nil(t, err)
   187  		assert.IsType(t, &opengraph.OpenGraph{}, metadata.Data)
   188  		assert.Equal(t, *og, *metadata.Data.(*opengraph.OpenGraph))
   189  	})
   190  
   191  	t.Run("should ignore data of the correct type", func(t *testing.T) {
   192  		metadata := &LinkMetadata{
   193  			Type: LINK_METADATA_TYPE_OPENGRAPH,
   194  			Data: 1234,
   195  		}
   196  
   197  		err := metadata.DeserializeDataToConcreteType()
   198  
   199  		assert.Nil(t, err)
   200  	})
   201  
   202  	t.Run("should ignore an invalid type", func(t *testing.T) {
   203  		metadata := &LinkMetadata{
   204  			Type: "garbage",
   205  			Data: "garbage",
   206  		}
   207  
   208  		err := metadata.DeserializeDataToConcreteType()
   209  
   210  		assert.Nil(t, err)
   211  	})
   212  
   213  	t.Run("should return error for invalid data", func(t *testing.T) {
   214  		metadata := &LinkMetadata{
   215  			Type: LINK_METADATA_TYPE_IMAGE,
   216  			Data: "garbage",
   217  		}
   218  
   219  		err := metadata.DeserializeDataToConcreteType()
   220  
   221  		assert.NotNil(t, err)
   222  	})
   223  }
   224  
   225  func TestFloorToNearestHour(t *testing.T) {
   226  	assert.True(t, isRoundedToNearestHour(FloorToNearestHour(1546346096000)))
   227  }