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 }