github.com/wgh-/mattermost-server@v4.8.0-rc2+incompatible/api4/emoji_test.go (about) 1 // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package api4 5 6 import ( 7 "bytes" 8 "image" 9 _ "image/gif" 10 "testing" 11 12 "github.com/mattermost/mattermost-server/model" 13 "github.com/mattermost/mattermost-server/utils" 14 15 "github.com/stretchr/testify/assert" 16 ) 17 18 func TestCreateEmoji(t *testing.T) { 19 th := Setup().InitBasic().InitSystemAdmin() 20 defer th.TearDown() 21 Client := th.Client 22 23 EnableCustomEmoji := *th.App.Config().ServiceSettings.EnableCustomEmoji 24 defer func() { 25 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = EnableCustomEmoji }) 26 }() 27 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = false }) 28 29 emoji := &model.Emoji{ 30 CreatorId: th.BasicUser.Id, 31 Name: model.NewId(), 32 } 33 34 // try to create an emoji when they're disabled 35 _, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") 36 CheckNotImplementedStatus(t, resp) 37 38 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true }) 39 // try to create a valid gif emoji when they're enabled 40 newEmoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") 41 CheckNoError(t, resp) 42 if newEmoji.Name != emoji.Name { 43 t.Fatal("create with wrong name") 44 } 45 46 // try to create an emoji with a duplicate name 47 emoji2 := &model.Emoji{ 48 CreatorId: th.BasicUser.Id, 49 Name: newEmoji.Name, 50 } 51 _, resp = Client.CreateEmoji(emoji2, utils.CreateTestGif(t, 10, 10), "image.gif") 52 CheckBadRequestStatus(t, resp) 53 CheckErrorMessage(t, resp, "api.emoji.create.duplicate.app_error") 54 55 // try to create a valid animated gif emoji 56 emoji = &model.Emoji{ 57 CreatorId: th.BasicUser.Id, 58 Name: model.NewId(), 59 } 60 61 newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestAnimatedGif(t, 10, 10, 10), "image.gif") 62 CheckNoError(t, resp) 63 if newEmoji.Name != emoji.Name { 64 t.Fatal("create with wrong name") 65 } 66 67 // try to create a valid jpeg emoji 68 emoji = &model.Emoji{ 69 CreatorId: th.BasicUser.Id, 70 Name: model.NewId(), 71 } 72 73 newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestJpeg(t, 10, 10), "image.gif") 74 CheckNoError(t, resp) 75 if newEmoji.Name != emoji.Name { 76 t.Fatal("create with wrong name") 77 } 78 79 // try to create a valid png emoji 80 emoji = &model.Emoji{ 81 CreatorId: th.BasicUser.Id, 82 Name: model.NewId(), 83 } 84 85 newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestPng(t, 10, 10), "image.gif") 86 CheckNoError(t, resp) 87 if newEmoji.Name != emoji.Name { 88 t.Fatal("create with wrong name") 89 } 90 91 // try to create an emoji that's too wide 92 emoji = &model.Emoji{ 93 CreatorId: th.BasicUser.Id, 94 Name: model.NewId(), 95 } 96 97 newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 1000, 10), "image.gif") 98 CheckNoError(t, resp) 99 if newEmoji.Name != emoji.Name { 100 t.Fatal("create with wrong name") 101 } 102 103 // try to create an emoji that's too tall 104 emoji = &model.Emoji{ 105 CreatorId: th.BasicUser.Id, 106 Name: model.NewId(), 107 } 108 109 newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 1000), "image.gif") 110 CheckNoError(t, resp) 111 if newEmoji.Name != emoji.Name { 112 t.Fatal("create with wrong name") 113 } 114 115 // try to create an emoji that's too large 116 emoji = &model.Emoji{ 117 CreatorId: th.BasicUser.Id, 118 Name: model.NewId(), 119 } 120 121 _, resp = Client.CreateEmoji(emoji, utils.CreateTestAnimatedGif(t, 100, 100, 10000), "image.gif") 122 if resp.Error == nil { 123 t.Fatal("should fail - emoji is too big") 124 } 125 126 // try to create an emoji with data that isn't an image 127 emoji = &model.Emoji{ 128 CreatorId: th.BasicUser.Id, 129 Name: model.NewId(), 130 } 131 132 _, resp = Client.CreateEmoji(emoji, make([]byte, 100), "image.gif") 133 CheckBadRequestStatus(t, resp) 134 CheckErrorMessage(t, resp, "api.emoji.upload.image.app_error") 135 136 // try to create an emoji as another user 137 emoji = &model.Emoji{ 138 CreatorId: th.BasicUser2.Id, 139 Name: model.NewId(), 140 } 141 142 _, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") 143 CheckForbiddenStatus(t, resp) 144 } 145 146 func TestGetEmojiList(t *testing.T) { 147 th := Setup().InitBasic() 148 defer th.TearDown() 149 Client := th.Client 150 151 EnableCustomEmoji := *th.App.Config().ServiceSettings.EnableCustomEmoji 152 defer func() { 153 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = EnableCustomEmoji }) 154 }() 155 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true }) 156 157 emojis := []*model.Emoji{ 158 { 159 CreatorId: th.BasicUser.Id, 160 Name: model.NewId(), 161 }, 162 { 163 CreatorId: th.BasicUser.Id, 164 Name: model.NewId(), 165 }, 166 { 167 CreatorId: th.BasicUser.Id, 168 Name: model.NewId(), 169 }, 170 } 171 172 for idx, emoji := range emojis { 173 emoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") 174 CheckNoError(t, resp) 175 emojis[idx] = emoji 176 } 177 178 listEmoji, resp := Client.GetEmojiList(0, 100) 179 CheckNoError(t, resp) 180 for _, emoji := range emojis { 181 found := false 182 for _, savedEmoji := range listEmoji { 183 if emoji.Id == savedEmoji.Id { 184 found = true 185 break 186 } 187 } 188 if !found { 189 t.Fatalf("failed to get emoji with id %v", emoji.Id) 190 } 191 } 192 193 _, resp = Client.DeleteEmoji(emojis[0].Id) 194 CheckNoError(t, resp) 195 listEmoji, resp = Client.GetEmojiList(0, 100) 196 CheckNoError(t, resp) 197 found := false 198 for _, savedEmoji := range listEmoji { 199 if savedEmoji.Id == emojis[0].Id { 200 found = true 201 break 202 } 203 if found { 204 t.Fatalf("should not get a deleted emoji %v", emojis[0].Id) 205 } 206 } 207 208 listEmoji, resp = Client.GetEmojiList(0, 1) 209 CheckNoError(t, resp) 210 211 if len(listEmoji) != 1 { 212 t.Fatal("should only return 1") 213 } 214 215 listEmoji, resp = Client.GetSortedEmojiList(0, 100, model.EMOJI_SORT_BY_NAME) 216 CheckNoError(t, resp) 217 218 if len(listEmoji) == 0 { 219 t.Fatal("should return more than 0") 220 } 221 } 222 223 func TestDeleteEmoji(t *testing.T) { 224 th := Setup().InitBasic().InitSystemAdmin() 225 defer th.TearDown() 226 Client := th.Client 227 228 EnableCustomEmoji := *th.App.Config().ServiceSettings.EnableCustomEmoji 229 defer func() { 230 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = EnableCustomEmoji }) 231 }() 232 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true }) 233 234 emoji := &model.Emoji{ 235 CreatorId: th.BasicUser.Id, 236 Name: model.NewId(), 237 } 238 239 newEmoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") 240 CheckNoError(t, resp) 241 242 ok, resp := Client.DeleteEmoji(newEmoji.Id) 243 CheckNoError(t, resp) 244 if !ok { 245 t.Fatal("should return true") 246 } else { 247 _, err := Client.GetEmoji(newEmoji.Id) 248 if err == nil { 249 t.Fatal("should not return the emoji it was deleted") 250 } 251 } 252 253 //Admin can delete other users emoji 254 newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") 255 CheckNoError(t, resp) 256 257 ok, resp = th.SystemAdminClient.DeleteEmoji(newEmoji.Id) 258 CheckNoError(t, resp) 259 if !ok { 260 t.Fatal("should return true") 261 } else { 262 _, err := th.SystemAdminClient.GetEmoji(newEmoji.Id) 263 if err == nil { 264 t.Fatal("should not return the emoji it was deleted") 265 } 266 } 267 268 // Try to delete just deleted emoji 269 _, resp = Client.DeleteEmoji(newEmoji.Id) 270 CheckNotFoundStatus(t, resp) 271 272 //Try to delete non-existing emoji 273 _, resp = Client.DeleteEmoji(model.NewId()) 274 CheckNotFoundStatus(t, resp) 275 276 //Try to delete without Id 277 _, resp = Client.DeleteEmoji("") 278 CheckNotFoundStatus(t, resp) 279 280 //Try to delete other user's custom emoji 281 newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") 282 CheckNoError(t, resp) 283 284 Client.Logout() 285 th.LoginBasic2() 286 ok, resp = Client.DeleteEmoji(newEmoji.Id) 287 CheckUnauthorizedStatus(t, resp) 288 } 289 290 func TestGetEmoji(t *testing.T) { 291 th := Setup().InitBasic() 292 defer th.TearDown() 293 Client := th.Client 294 295 EnableCustomEmoji := *th.App.Config().ServiceSettings.EnableCustomEmoji 296 defer func() { 297 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = EnableCustomEmoji }) 298 }() 299 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true }) 300 301 emoji := &model.Emoji{ 302 CreatorId: th.BasicUser.Id, 303 Name: model.NewId(), 304 } 305 306 newEmoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") 307 CheckNoError(t, resp) 308 309 emoji, resp = Client.GetEmoji(newEmoji.Id) 310 CheckNoError(t, resp) 311 if emoji.Id != newEmoji.Id { 312 t.Fatal("wrong emoji was returned") 313 } 314 315 _, resp = Client.GetEmoji(model.NewId()) 316 CheckNotFoundStatus(t, resp) 317 } 318 319 func TestGetEmojiByName(t *testing.T) { 320 th := Setup().InitBasic() 321 defer th.TearDown() 322 Client := th.Client 323 324 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true }) 325 326 emoji := &model.Emoji{ 327 CreatorId: th.BasicUser.Id, 328 Name: model.NewId(), 329 } 330 331 newEmoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") 332 CheckNoError(t, resp) 333 334 emoji, resp = Client.GetEmojiByName(newEmoji.Name) 335 CheckNoError(t, resp) 336 assert.Equal(t, newEmoji.Name, emoji.Name) 337 338 _, resp = Client.GetEmojiByName(model.NewId()) 339 CheckNotFoundStatus(t, resp) 340 341 Client.Logout() 342 _, resp = Client.GetEmojiByName(newEmoji.Name) 343 CheckUnauthorizedStatus(t, resp) 344 } 345 346 func TestGetEmojiImage(t *testing.T) { 347 th := Setup().InitBasic() 348 defer th.TearDown() 349 Client := th.Client 350 351 EnableCustomEmoji := *th.App.Config().ServiceSettings.EnableCustomEmoji 352 DriverName := *th.App.Config().FileSettings.DriverName 353 defer func() { 354 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = EnableCustomEmoji }) 355 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.FileSettings.DriverName = DriverName }) 356 }() 357 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true }) 358 359 emoji1 := &model.Emoji{ 360 CreatorId: th.BasicUser.Id, 361 Name: model.NewId(), 362 } 363 364 emoji1, resp := Client.CreateEmoji(emoji1, utils.CreateTestGif(t, 10, 10), "image.gif") 365 CheckNoError(t, resp) 366 367 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = false }) 368 369 _, resp = Client.GetEmojiImage(emoji1.Id) 370 CheckNotImplementedStatus(t, resp) 371 CheckErrorMessage(t, resp, "api.emoji.disabled.app_error") 372 373 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.FileSettings.DriverName = "" }) 374 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true }) 375 376 _, resp = Client.GetEmojiImage(emoji1.Id) 377 CheckNotImplementedStatus(t, resp) 378 CheckErrorMessage(t, resp, "api.emoji.storage.app_error") 379 380 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.FileSettings.DriverName = DriverName }) 381 382 emojiImage, resp := Client.GetEmojiImage(emoji1.Id) 383 CheckNoError(t, resp) 384 if len(emojiImage) <= 0 { 385 t.Fatal("should return the image") 386 } 387 _, imageType, err := image.DecodeConfig(bytes.NewReader(emojiImage)) 388 if err != nil { 389 t.Fatalf("unable to identify received image: %v", err.Error()) 390 } else if imageType != "gif" { 391 t.Fatal("should've received gif data") 392 } 393 394 emoji2 := &model.Emoji{ 395 CreatorId: th.BasicUser.Id, 396 Name: model.NewId(), 397 } 398 399 emoji2, resp = Client.CreateEmoji(emoji2, utils.CreateTestAnimatedGif(t, 10, 10, 10), "image.gif") 400 CheckNoError(t, resp) 401 402 emojiImage, resp = Client.GetEmojiImage(emoji2.Id) 403 CheckNoError(t, resp) 404 if len(emojiImage) <= 0 { 405 t.Fatal("should return the image") 406 } 407 _, imageType, err = image.DecodeConfig(bytes.NewReader(emojiImage)) 408 if err != nil { 409 t.Fatalf("unable to identify received image: %v", err.Error()) 410 } else if imageType != "gif" { 411 t.Fatal("should've received gif data") 412 } 413 414 emoji3 := &model.Emoji{ 415 CreatorId: th.BasicUser.Id, 416 Name: model.NewId(), 417 } 418 emoji3, resp = Client.CreateEmoji(emoji3, utils.CreateTestJpeg(t, 10, 10), "image.jpg") 419 CheckNoError(t, resp) 420 421 emojiImage, resp = Client.GetEmojiImage(emoji3.Id) 422 CheckNoError(t, resp) 423 if len(emojiImage) <= 0 { 424 t.Fatal("should return the image") 425 } 426 _, imageType, err = image.DecodeConfig(bytes.NewReader(emojiImage)) 427 if err != nil { 428 t.Fatalf("unable to identify received image: %v", err.Error()) 429 } else if imageType != "jpeg" { 430 t.Fatal("should've received gif data") 431 } 432 433 emoji4 := &model.Emoji{ 434 CreatorId: th.BasicUser.Id, 435 Name: model.NewId(), 436 } 437 emoji4, resp = Client.CreateEmoji(emoji4, utils.CreateTestPng(t, 10, 10), "image.png") 438 CheckNoError(t, resp) 439 440 emojiImage, resp = Client.GetEmojiImage(emoji4.Id) 441 CheckNoError(t, resp) 442 if len(emojiImage) <= 0 { 443 t.Fatal("should return the image") 444 } 445 _, imageType, err = image.DecodeConfig(bytes.NewReader(emojiImage)) 446 if err != nil { 447 t.Fatalf("unable to identify received image: %v", err.Error()) 448 } else if imageType != "png" { 449 t.Fatal("should've received gif data") 450 } 451 452 _, resp = Client.DeleteEmoji(emoji4.Id) 453 CheckNoError(t, resp) 454 455 _, resp = Client.GetEmojiImage(emoji4.Id) 456 CheckNotFoundStatus(t, resp) 457 458 _, resp = Client.GetEmojiImage(model.NewId()) 459 CheckNotFoundStatus(t, resp) 460 461 _, resp = Client.GetEmojiImage("") 462 CheckBadRequestStatus(t, resp) 463 } 464 465 func TestSearchEmoji(t *testing.T) { 466 th := Setup().InitBasic() 467 defer th.TearDown() 468 Client := th.Client 469 470 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true }) 471 472 searchTerm1 := model.NewId() 473 searchTerm2 := model.NewId() 474 475 emojis := []*model.Emoji{ 476 { 477 CreatorId: th.BasicUser.Id, 478 Name: searchTerm1, 479 }, 480 { 481 CreatorId: th.BasicUser.Id, 482 Name: "blargh_" + searchTerm2, 483 }, 484 } 485 486 for idx, emoji := range emojis { 487 emoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") 488 CheckNoError(t, resp) 489 emojis[idx] = emoji 490 } 491 492 search := &model.EmojiSearch{Term: searchTerm1} 493 remojis, resp := Client.SearchEmoji(search) 494 CheckNoError(t, resp) 495 CheckOKStatus(t, resp) 496 497 found := false 498 for _, e := range remojis { 499 if e.Name == emojis[0].Name { 500 found = true 501 } 502 } 503 504 assert.True(t, found) 505 506 search.Term = searchTerm2 507 search.PrefixOnly = true 508 remojis, resp = Client.SearchEmoji(search) 509 CheckNoError(t, resp) 510 CheckOKStatus(t, resp) 511 512 found = false 513 for _, e := range remojis { 514 if e.Name == emojis[1].Name { 515 found = true 516 } 517 } 518 519 assert.False(t, found) 520 521 search.PrefixOnly = false 522 remojis, resp = Client.SearchEmoji(search) 523 CheckNoError(t, resp) 524 CheckOKStatus(t, resp) 525 526 found = false 527 for _, e := range remojis { 528 if e.Name == emojis[1].Name { 529 found = true 530 } 531 } 532 533 assert.True(t, found) 534 535 search.Term = "" 536 _, resp = Client.SearchEmoji(search) 537 CheckBadRequestStatus(t, resp) 538 539 Client.Logout() 540 _, resp = Client.SearchEmoji(search) 541 CheckUnauthorizedStatus(t, resp) 542 } 543 544 func TestAutocompleteEmoji(t *testing.T) { 545 th := Setup().InitBasic() 546 defer th.TearDown() 547 Client := th.Client 548 549 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true }) 550 551 searchTerm1 := model.NewId() 552 553 emojis := []*model.Emoji{ 554 { 555 CreatorId: th.BasicUser.Id, 556 Name: searchTerm1, 557 }, 558 { 559 CreatorId: th.BasicUser.Id, 560 Name: "blargh_" + searchTerm1, 561 }, 562 } 563 564 for idx, emoji := range emojis { 565 emoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") 566 CheckNoError(t, resp) 567 emojis[idx] = emoji 568 } 569 570 remojis, resp := Client.AutocompleteEmoji(searchTerm1, "") 571 CheckNoError(t, resp) 572 CheckOKStatus(t, resp) 573 574 found1 := false 575 found2 := false 576 for _, e := range remojis { 577 if e.Name == emojis[0].Name { 578 found1 = true 579 } 580 581 if e.Name == emojis[1].Name { 582 found2 = true 583 } 584 } 585 586 assert.True(t, found1) 587 assert.False(t, found2) 588 589 _, resp = Client.AutocompleteEmoji("", "") 590 CheckBadRequestStatus(t, resp) 591 592 Client.Logout() 593 _, resp = Client.AutocompleteEmoji(searchTerm1, "") 594 CheckUnauthorizedStatus(t, resp) 595 }