github.com/spreadshirt/mattermost-server@v5.3.2-0.20180927191755-a257d501df3d+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/app"
    13  	"github.com/mattermost/mattermost-server/model"
    14  	"github.com/mattermost/mattermost-server/utils"
    15  
    16  	"github.com/stretchr/testify/assert"
    17  )
    18  
    19  func TestCreateEmoji(t *testing.T) {
    20  	th := Setup().InitBasic().InitSystemAdmin()
    21  	defer th.TearDown()
    22  	Client := th.Client
    23  
    24  	EnableCustomEmoji := *th.App.Config().ServiceSettings.EnableCustomEmoji
    25  	defer func() {
    26  		th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = EnableCustomEmoji })
    27  	}()
    28  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = false })
    29  
    30  	defaultRolePermissions := th.SaveDefaultRolePermissions()
    31  	defer func() {
    32  		th.RestoreDefaultRolePermissions(defaultRolePermissions)
    33  	}()
    34  
    35  	emoji := &model.Emoji{
    36  		CreatorId: th.BasicUser.Id,
    37  		Name:      model.NewId(),
    38  	}
    39  
    40  	// try to create an emoji when they're disabled
    41  	_, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif")
    42  	CheckNotImplementedStatus(t, resp)
    43  
    44  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true })
    45  	// try to create a valid gif emoji when they're enabled
    46  	newEmoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif")
    47  	CheckNoError(t, resp)
    48  	if newEmoji.Name != emoji.Name {
    49  		t.Fatal("create with wrong name")
    50  	}
    51  
    52  	// try to create an emoji with a duplicate name
    53  	emoji2 := &model.Emoji{
    54  		CreatorId: th.BasicUser.Id,
    55  		Name:      newEmoji.Name,
    56  	}
    57  	_, resp = Client.CreateEmoji(emoji2, utils.CreateTestGif(t, 10, 10), "image.gif")
    58  	CheckBadRequestStatus(t, resp)
    59  	CheckErrorMessage(t, resp, "api.emoji.create.duplicate.app_error")
    60  
    61  	// try to create a valid animated gif emoji
    62  	emoji = &model.Emoji{
    63  		CreatorId: th.BasicUser.Id,
    64  		Name:      model.NewId(),
    65  	}
    66  
    67  	newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestAnimatedGif(t, 10, 10, 10), "image.gif")
    68  	CheckNoError(t, resp)
    69  	if newEmoji.Name != emoji.Name {
    70  		t.Fatal("create with wrong name")
    71  	}
    72  
    73  	// try to create a valid jpeg emoji
    74  	emoji = &model.Emoji{
    75  		CreatorId: th.BasicUser.Id,
    76  		Name:      model.NewId(),
    77  	}
    78  
    79  	newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestJpeg(t, 10, 10), "image.gif")
    80  	CheckNoError(t, resp)
    81  	if newEmoji.Name != emoji.Name {
    82  		t.Fatal("create with wrong name")
    83  	}
    84  
    85  	// try to create a valid png emoji
    86  	emoji = &model.Emoji{
    87  		CreatorId: th.BasicUser.Id,
    88  		Name:      model.NewId(),
    89  	}
    90  
    91  	newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestPng(t, 10, 10), "image.gif")
    92  	CheckNoError(t, resp)
    93  	if newEmoji.Name != emoji.Name {
    94  		t.Fatal("create with wrong name")
    95  	}
    96  
    97  	// try to create an emoji that's too wide
    98  	emoji = &model.Emoji{
    99  		CreatorId: th.BasicUser.Id,
   100  		Name:      model.NewId(),
   101  	}
   102  
   103  	newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 1000, 10), "image.gif")
   104  	CheckNoError(t, resp)
   105  	if newEmoji.Name != emoji.Name {
   106  		t.Fatal("create with wrong name")
   107  	}
   108  
   109  	// try to create an emoji that's too wide
   110  	emoji = &model.Emoji{
   111  		CreatorId: th.BasicUser.Id,
   112  		Name:      model.NewId(),
   113  	}
   114  
   115  	newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, app.MaxEmojiOriginalWidth+1), "image.gif")
   116  	if resp.Error == nil {
   117  		t.Fatal("should fail - emoji is too wide")
   118  	}
   119  
   120  	// try to create an emoji that's too tall
   121  	emoji = &model.Emoji{
   122  		CreatorId: th.BasicUser.Id,
   123  		Name:      model.NewId(),
   124  	}
   125  
   126  	newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, app.MaxEmojiOriginalHeight+1, 10), "image.gif")
   127  	if resp.Error == nil {
   128  		t.Fatal("should fail - emoji is too tall")
   129  	}
   130  
   131  	// try to create an emoji that's too large
   132  	emoji = &model.Emoji{
   133  		CreatorId: th.BasicUser.Id,
   134  		Name:      model.NewId(),
   135  	}
   136  
   137  	_, resp = Client.CreateEmoji(emoji, utils.CreateTestAnimatedGif(t, 100, 100, 10000), "image.gif")
   138  	if resp.Error == nil {
   139  		t.Fatal("should fail - emoji is too big")
   140  	}
   141  
   142  	// try to create an emoji with data that isn't an image
   143  	emoji = &model.Emoji{
   144  		CreatorId: th.BasicUser.Id,
   145  		Name:      model.NewId(),
   146  	}
   147  
   148  	_, resp = Client.CreateEmoji(emoji, make([]byte, 100), "image.gif")
   149  	CheckBadRequestStatus(t, resp)
   150  	CheckErrorMessage(t, resp, "api.emoji.upload.image.app_error")
   151  
   152  	// try to create an emoji as another user
   153  	emoji = &model.Emoji{
   154  		CreatorId: th.BasicUser2.Id,
   155  		Name:      model.NewId(),
   156  	}
   157  
   158  	_, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif")
   159  	CheckForbiddenStatus(t, resp)
   160  
   161  	// try to create an emoji without permissions
   162  	th.RemovePermissionFromRole(model.PERMISSION_MANAGE_EMOJIS.Id, model.SYSTEM_USER_ROLE_ID)
   163  
   164  	emoji = &model.Emoji{
   165  		CreatorId: th.BasicUser.Id,
   166  		Name:      model.NewId(),
   167  	}
   168  
   169  	_, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif")
   170  	CheckForbiddenStatus(t, resp)
   171  
   172  	// create an emoji with permissions in one team
   173  	th.AddPermissionToRole(model.PERMISSION_MANAGE_EMOJIS.Id, model.TEAM_USER_ROLE_ID)
   174  
   175  	emoji = &model.Emoji{
   176  		CreatorId: th.BasicUser.Id,
   177  		Name:      model.NewId(),
   178  	}
   179  
   180  	_, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif")
   181  	CheckNoError(t, resp)
   182  }
   183  
   184  func TestGetEmojiList(t *testing.T) {
   185  	th := Setup().InitBasic()
   186  	defer th.TearDown()
   187  	Client := th.Client
   188  
   189  	EnableCustomEmoji := *th.App.Config().ServiceSettings.EnableCustomEmoji
   190  	defer func() {
   191  		th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = EnableCustomEmoji })
   192  	}()
   193  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true })
   194  
   195  	emojis := []*model.Emoji{
   196  		{
   197  			CreatorId: th.BasicUser.Id,
   198  			Name:      model.NewId(),
   199  		},
   200  		{
   201  			CreatorId: th.BasicUser.Id,
   202  			Name:      model.NewId(),
   203  		},
   204  		{
   205  			CreatorId: th.BasicUser.Id,
   206  			Name:      model.NewId(),
   207  		},
   208  	}
   209  
   210  	for idx, emoji := range emojis {
   211  		emoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif")
   212  		CheckNoError(t, resp)
   213  		emojis[idx] = emoji
   214  	}
   215  
   216  	listEmoji, resp := Client.GetEmojiList(0, 100)
   217  	CheckNoError(t, resp)
   218  	for _, emoji := range emojis {
   219  		found := false
   220  		for _, savedEmoji := range listEmoji {
   221  			if emoji.Id == savedEmoji.Id {
   222  				found = true
   223  				break
   224  			}
   225  		}
   226  		if !found {
   227  			t.Fatalf("failed to get emoji with id %v, %v", emoji.Id, len(listEmoji))
   228  		}
   229  	}
   230  
   231  	_, resp = Client.DeleteEmoji(emojis[0].Id)
   232  	CheckNoError(t, resp)
   233  	listEmoji, resp = Client.GetEmojiList(0, 100)
   234  	CheckNoError(t, resp)
   235  	found := false
   236  	for _, savedEmoji := range listEmoji {
   237  		if savedEmoji.Id == emojis[0].Id {
   238  			found = true
   239  			break
   240  		}
   241  		if found {
   242  			t.Fatalf("should not get a deleted emoji %v", emojis[0].Id)
   243  		}
   244  	}
   245  
   246  	listEmoji, resp = Client.GetEmojiList(0, 1)
   247  	CheckNoError(t, resp)
   248  
   249  	if len(listEmoji) != 1 {
   250  		t.Fatal("should only return 1")
   251  	}
   252  
   253  	listEmoji, resp = Client.GetSortedEmojiList(0, 100, model.EMOJI_SORT_BY_NAME)
   254  	CheckNoError(t, resp)
   255  
   256  	if len(listEmoji) == 0 {
   257  		t.Fatal("should return more than 0")
   258  	}
   259  }
   260  
   261  func TestDeleteEmoji(t *testing.T) {
   262  	th := Setup().InitBasic().InitSystemAdmin()
   263  	defer th.TearDown()
   264  	Client := th.Client
   265  
   266  	EnableCustomEmoji := *th.App.Config().ServiceSettings.EnableCustomEmoji
   267  	defer func() {
   268  		th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = EnableCustomEmoji })
   269  	}()
   270  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true })
   271  
   272  	defaultRolePermissions := th.SaveDefaultRolePermissions()
   273  	defer func() {
   274  		th.RestoreDefaultRolePermissions(defaultRolePermissions)
   275  	}()
   276  
   277  	emoji := &model.Emoji{
   278  		CreatorId: th.BasicUser.Id,
   279  		Name:      model.NewId(),
   280  	}
   281  
   282  	newEmoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif")
   283  	CheckNoError(t, resp)
   284  
   285  	ok, resp := Client.DeleteEmoji(newEmoji.Id)
   286  	CheckNoError(t, resp)
   287  	if !ok {
   288  		t.Fatal("should return true")
   289  	} else {
   290  		_, err := Client.GetEmoji(newEmoji.Id)
   291  		if err == nil {
   292  			t.Fatal("should not return the emoji it was deleted")
   293  		}
   294  	}
   295  
   296  	//Admin can delete other users emoji
   297  	newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif")
   298  	CheckNoError(t, resp)
   299  
   300  	ok, resp = th.SystemAdminClient.DeleteEmoji(newEmoji.Id)
   301  	CheckNoError(t, resp)
   302  	if !ok {
   303  		t.Fatal("should return true")
   304  	} else {
   305  		_, err := th.SystemAdminClient.GetEmoji(newEmoji.Id)
   306  		if err == nil {
   307  			t.Fatal("should not return the emoji it was deleted")
   308  		}
   309  	}
   310  
   311  	// Try to delete just deleted emoji
   312  	_, resp = Client.DeleteEmoji(newEmoji.Id)
   313  	CheckNotFoundStatus(t, resp)
   314  
   315  	//Try to delete non-existing emoji
   316  	_, resp = Client.DeleteEmoji(model.NewId())
   317  	CheckNotFoundStatus(t, resp)
   318  
   319  	//Try to delete without Id
   320  	_, resp = Client.DeleteEmoji("")
   321  	CheckNotFoundStatus(t, resp)
   322  
   323  	//Try to delete my custom emoji without permissions
   324  	newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif")
   325  	CheckNoError(t, resp)
   326  
   327  	th.RemovePermissionFromRole(model.PERMISSION_MANAGE_EMOJIS.Id, model.SYSTEM_USER_ROLE_ID)
   328  	_, resp = Client.DeleteEmoji(newEmoji.Id)
   329  	CheckForbiddenStatus(t, resp)
   330  	th.AddPermissionToRole(model.PERMISSION_MANAGE_EMOJIS.Id, model.SYSTEM_USER_ROLE_ID)
   331  
   332  	//Try to delete other user's custom emoji without MANAGE_EMOJIS permissions
   333  	emoji = &model.Emoji{
   334  		CreatorId: th.BasicUser.Id,
   335  		Name:      model.NewId(),
   336  	}
   337  
   338  	newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif")
   339  	CheckNoError(t, resp)
   340  
   341  	th.RemovePermissionFromRole(model.PERMISSION_MANAGE_EMOJIS.Id, model.SYSTEM_USER_ROLE_ID)
   342  	th.AddPermissionToRole(model.PERMISSION_MANAGE_OTHERS_EMOJIS.Id, model.SYSTEM_USER_ROLE_ID)
   343  
   344  	Client.Logout()
   345  	th.LoginBasic2()
   346  
   347  	_, resp = Client.DeleteEmoji(newEmoji.Id)
   348  	CheckForbiddenStatus(t, resp)
   349  
   350  	th.RemovePermissionFromRole(model.PERMISSION_MANAGE_OTHERS_EMOJIS.Id, model.SYSTEM_USER_ROLE_ID)
   351  	th.AddPermissionToRole(model.PERMISSION_MANAGE_EMOJIS.Id, model.SYSTEM_USER_ROLE_ID)
   352  
   353  	Client.Logout()
   354  	th.LoginBasic()
   355  
   356  	//Try to delete other user's custom emoji without MANAGE_OTHERS_EMOJIS permissions
   357  	emoji = &model.Emoji{
   358  		CreatorId: th.BasicUser.Id,
   359  		Name:      model.NewId(),
   360  	}
   361  
   362  	newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif")
   363  	CheckNoError(t, resp)
   364  
   365  	Client.Logout()
   366  	th.LoginBasic2()
   367  
   368  	_, resp = Client.DeleteEmoji(newEmoji.Id)
   369  	CheckForbiddenStatus(t, resp)
   370  
   371  	Client.Logout()
   372  	th.LoginBasic()
   373  
   374  	//Try to delete other user's custom emoji with permissions
   375  	emoji = &model.Emoji{
   376  		CreatorId: th.BasicUser.Id,
   377  		Name:      model.NewId(),
   378  	}
   379  
   380  	newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif")
   381  	CheckNoError(t, resp)
   382  
   383  	th.AddPermissionToRole(model.PERMISSION_MANAGE_EMOJIS.Id, model.SYSTEM_USER_ROLE_ID)
   384  	th.AddPermissionToRole(model.PERMISSION_MANAGE_OTHERS_EMOJIS.Id, model.SYSTEM_USER_ROLE_ID)
   385  
   386  	Client.Logout()
   387  	th.LoginBasic2()
   388  
   389  	_, resp = Client.DeleteEmoji(newEmoji.Id)
   390  	CheckNoError(t, resp)
   391  
   392  	Client.Logout()
   393  	th.LoginBasic()
   394  
   395  	//Try to delete my custom emoji with permissions at team level
   396  	newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif")
   397  	CheckNoError(t, resp)
   398  
   399  	th.RemovePermissionFromRole(model.PERMISSION_MANAGE_EMOJIS.Id, model.SYSTEM_USER_ROLE_ID)
   400  	th.AddPermissionToRole(model.PERMISSION_MANAGE_EMOJIS.Id, model.TEAM_USER_ROLE_ID)
   401  	_, resp = Client.DeleteEmoji(newEmoji.Id)
   402  	CheckNoError(t, resp)
   403  	th.AddPermissionToRole(model.PERMISSION_MANAGE_EMOJIS.Id, model.SYSTEM_USER_ROLE_ID)
   404  	th.RemovePermissionFromRole(model.PERMISSION_MANAGE_EMOJIS.Id, model.TEAM_USER_ROLE_ID)
   405  
   406  	//Try to delete other user's custom emoji with permissions at team level
   407  	emoji = &model.Emoji{
   408  		CreatorId: th.BasicUser.Id,
   409  		Name:      model.NewId(),
   410  	}
   411  
   412  	newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif")
   413  	CheckNoError(t, resp)
   414  
   415  	th.RemovePermissionFromRole(model.PERMISSION_MANAGE_EMOJIS.Id, model.SYSTEM_USER_ROLE_ID)
   416  	th.RemovePermissionFromRole(model.PERMISSION_MANAGE_OTHERS_EMOJIS.Id, model.SYSTEM_USER_ROLE_ID)
   417  
   418  	th.AddPermissionToRole(model.PERMISSION_MANAGE_EMOJIS.Id, model.TEAM_USER_ROLE_ID)
   419  	th.AddPermissionToRole(model.PERMISSION_MANAGE_OTHERS_EMOJIS.Id, model.TEAM_USER_ROLE_ID)
   420  
   421  	Client.Logout()
   422  	th.LoginBasic2()
   423  
   424  	_, resp = Client.DeleteEmoji(newEmoji.Id)
   425  	CheckNoError(t, resp)
   426  }
   427  
   428  func TestGetEmoji(t *testing.T) {
   429  	th := Setup().InitBasic()
   430  	defer th.TearDown()
   431  	Client := th.Client
   432  
   433  	EnableCustomEmoji := *th.App.Config().ServiceSettings.EnableCustomEmoji
   434  	defer func() {
   435  		th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = EnableCustomEmoji })
   436  	}()
   437  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true })
   438  
   439  	emoji := &model.Emoji{
   440  		CreatorId: th.BasicUser.Id,
   441  		Name:      model.NewId(),
   442  	}
   443  
   444  	newEmoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif")
   445  	CheckNoError(t, resp)
   446  
   447  	emoji, resp = Client.GetEmoji(newEmoji.Id)
   448  	CheckNoError(t, resp)
   449  	if emoji.Id != newEmoji.Id {
   450  		t.Fatal("wrong emoji was returned")
   451  	}
   452  
   453  	_, resp = Client.GetEmoji(model.NewId())
   454  	CheckNotFoundStatus(t, resp)
   455  }
   456  
   457  func TestGetEmojiByName(t *testing.T) {
   458  	th := Setup().InitBasic()
   459  	defer th.TearDown()
   460  	Client := th.Client
   461  
   462  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true })
   463  
   464  	emoji := &model.Emoji{
   465  		CreatorId: th.BasicUser.Id,
   466  		Name:      model.NewId(),
   467  	}
   468  
   469  	newEmoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif")
   470  	CheckNoError(t, resp)
   471  
   472  	emoji, resp = Client.GetEmojiByName(newEmoji.Name)
   473  	CheckNoError(t, resp)
   474  	assert.Equal(t, newEmoji.Name, emoji.Name)
   475  
   476  	_, resp = Client.GetEmojiByName(model.NewId())
   477  	CheckNotFoundStatus(t, resp)
   478  
   479  	Client.Logout()
   480  	_, resp = Client.GetEmojiByName(newEmoji.Name)
   481  	CheckUnauthorizedStatus(t, resp)
   482  }
   483  
   484  func TestGetEmojiImage(t *testing.T) {
   485  	th := Setup().InitBasic()
   486  	defer th.TearDown()
   487  	Client := th.Client
   488  
   489  	EnableCustomEmoji := *th.App.Config().ServiceSettings.EnableCustomEmoji
   490  	DriverName := *th.App.Config().FileSettings.DriverName
   491  	defer func() {
   492  		th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = EnableCustomEmoji })
   493  		th.App.UpdateConfig(func(cfg *model.Config) { *cfg.FileSettings.DriverName = DriverName })
   494  	}()
   495  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true })
   496  
   497  	emoji1 := &model.Emoji{
   498  		CreatorId: th.BasicUser.Id,
   499  		Name:      model.NewId(),
   500  	}
   501  
   502  	emoji1, resp := Client.CreateEmoji(emoji1, utils.CreateTestGif(t, 10, 10), "image.gif")
   503  	CheckNoError(t, resp)
   504  
   505  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = false })
   506  
   507  	_, resp = Client.GetEmojiImage(emoji1.Id)
   508  	CheckNotImplementedStatus(t, resp)
   509  	CheckErrorMessage(t, resp, "api.emoji.disabled.app_error")
   510  
   511  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.FileSettings.DriverName = "" })
   512  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true })
   513  
   514  	_, resp = Client.GetEmojiImage(emoji1.Id)
   515  	CheckNotImplementedStatus(t, resp)
   516  	CheckErrorMessage(t, resp, "api.emoji.storage.app_error")
   517  
   518  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.FileSettings.DriverName = DriverName })
   519  
   520  	emojiImage, resp := Client.GetEmojiImage(emoji1.Id)
   521  	CheckNoError(t, resp)
   522  	if len(emojiImage) <= 0 {
   523  		t.Fatal("should return the image")
   524  	}
   525  	_, imageType, err := image.DecodeConfig(bytes.NewReader(emojiImage))
   526  	if err != nil {
   527  		t.Fatalf("unable to identify received image: %v", err.Error())
   528  	} else if imageType != "gif" {
   529  		t.Fatal("should've received gif data")
   530  	}
   531  
   532  	emoji2 := &model.Emoji{
   533  		CreatorId: th.BasicUser.Id,
   534  		Name:      model.NewId(),
   535  	}
   536  
   537  	emoji2, resp = Client.CreateEmoji(emoji2, utils.CreateTestAnimatedGif(t, 10, 10, 10), "image.gif")
   538  	CheckNoError(t, resp)
   539  
   540  	emojiImage, resp = Client.GetEmojiImage(emoji2.Id)
   541  	CheckNoError(t, resp)
   542  	if len(emojiImage) <= 0 {
   543  		t.Fatal("should return the image")
   544  	}
   545  	_, imageType, err = image.DecodeConfig(bytes.NewReader(emojiImage))
   546  	if err != nil {
   547  		t.Fatalf("unable to identify received image: %v", err.Error())
   548  	} else if imageType != "gif" {
   549  		t.Fatal("should've received gif data")
   550  	}
   551  
   552  	emoji3 := &model.Emoji{
   553  		CreatorId: th.BasicUser.Id,
   554  		Name:      model.NewId(),
   555  	}
   556  	emoji3, resp = Client.CreateEmoji(emoji3, utils.CreateTestJpeg(t, 10, 10), "image.jpg")
   557  	CheckNoError(t, resp)
   558  
   559  	emojiImage, resp = Client.GetEmojiImage(emoji3.Id)
   560  	CheckNoError(t, resp)
   561  	if len(emojiImage) <= 0 {
   562  		t.Fatal("should return the image")
   563  	}
   564  	_, imageType, err = image.DecodeConfig(bytes.NewReader(emojiImage))
   565  	if err != nil {
   566  		t.Fatalf("unable to identify received image: %v", err.Error())
   567  	} else if imageType != "jpeg" {
   568  		t.Fatal("should've received gif data")
   569  	}
   570  
   571  	emoji4 := &model.Emoji{
   572  		CreatorId: th.BasicUser.Id,
   573  		Name:      model.NewId(),
   574  	}
   575  	emoji4, resp = Client.CreateEmoji(emoji4, utils.CreateTestPng(t, 10, 10), "image.png")
   576  	CheckNoError(t, resp)
   577  
   578  	emojiImage, resp = Client.GetEmojiImage(emoji4.Id)
   579  	CheckNoError(t, resp)
   580  	if len(emojiImage) <= 0 {
   581  		t.Fatal("should return the image")
   582  	}
   583  	_, imageType, err = image.DecodeConfig(bytes.NewReader(emojiImage))
   584  	if err != nil {
   585  		t.Fatalf("unable to identify received image: %v", err.Error())
   586  	} else if imageType != "png" {
   587  		t.Fatal("should've received gif data")
   588  	}
   589  
   590  	_, resp = Client.DeleteEmoji(emoji4.Id)
   591  	CheckNoError(t, resp)
   592  
   593  	_, resp = Client.GetEmojiImage(emoji4.Id)
   594  	CheckNotFoundStatus(t, resp)
   595  
   596  	_, resp = Client.GetEmojiImage(model.NewId())
   597  	CheckNotFoundStatus(t, resp)
   598  
   599  	_, resp = Client.GetEmojiImage("")
   600  	CheckBadRequestStatus(t, resp)
   601  }
   602  
   603  func TestSearchEmoji(t *testing.T) {
   604  	th := Setup().InitBasic()
   605  	defer th.TearDown()
   606  	Client := th.Client
   607  
   608  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true })
   609  
   610  	searchTerm1 := model.NewId()
   611  	searchTerm2 := model.NewId()
   612  
   613  	emojis := []*model.Emoji{
   614  		{
   615  			CreatorId: th.BasicUser.Id,
   616  			Name:      searchTerm1,
   617  		},
   618  		{
   619  			CreatorId: th.BasicUser.Id,
   620  			Name:      "blargh_" + searchTerm2,
   621  		},
   622  	}
   623  
   624  	for idx, emoji := range emojis {
   625  		emoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif")
   626  		CheckNoError(t, resp)
   627  		emojis[idx] = emoji
   628  	}
   629  
   630  	search := &model.EmojiSearch{Term: searchTerm1}
   631  	remojis, resp := Client.SearchEmoji(search)
   632  	CheckNoError(t, resp)
   633  	CheckOKStatus(t, resp)
   634  
   635  	found := false
   636  	for _, e := range remojis {
   637  		if e.Name == emojis[0].Name {
   638  			found = true
   639  		}
   640  	}
   641  
   642  	assert.True(t, found)
   643  
   644  	search.Term = searchTerm2
   645  	search.PrefixOnly = true
   646  	remojis, resp = Client.SearchEmoji(search)
   647  	CheckNoError(t, resp)
   648  	CheckOKStatus(t, resp)
   649  
   650  	found = false
   651  	for _, e := range remojis {
   652  		if e.Name == emojis[1].Name {
   653  			found = true
   654  		}
   655  	}
   656  
   657  	assert.False(t, found)
   658  
   659  	search.PrefixOnly = false
   660  	remojis, resp = Client.SearchEmoji(search)
   661  	CheckNoError(t, resp)
   662  	CheckOKStatus(t, resp)
   663  
   664  	found = false
   665  	for _, e := range remojis {
   666  		if e.Name == emojis[1].Name {
   667  			found = true
   668  		}
   669  	}
   670  
   671  	assert.True(t, found)
   672  
   673  	search.Term = ""
   674  	_, resp = Client.SearchEmoji(search)
   675  	CheckBadRequestStatus(t, resp)
   676  
   677  	Client.Logout()
   678  	_, resp = Client.SearchEmoji(search)
   679  	CheckUnauthorizedStatus(t, resp)
   680  }
   681  
   682  func TestAutocompleteEmoji(t *testing.T) {
   683  	th := Setup().InitBasic()
   684  	defer th.TearDown()
   685  	Client := th.Client
   686  
   687  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true })
   688  
   689  	searchTerm1 := model.NewId()
   690  
   691  	emojis := []*model.Emoji{
   692  		{
   693  			CreatorId: th.BasicUser.Id,
   694  			Name:      searchTerm1,
   695  		},
   696  		{
   697  			CreatorId: th.BasicUser.Id,
   698  			Name:      "blargh_" + searchTerm1,
   699  		},
   700  	}
   701  
   702  	for idx, emoji := range emojis {
   703  		emoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif")
   704  		CheckNoError(t, resp)
   705  		emojis[idx] = emoji
   706  	}
   707  
   708  	remojis, resp := Client.AutocompleteEmoji(searchTerm1, "")
   709  	CheckNoError(t, resp)
   710  	CheckOKStatus(t, resp)
   711  
   712  	found1 := false
   713  	found2 := false
   714  	for _, e := range remojis {
   715  		if e.Name == emojis[0].Name {
   716  			found1 = true
   717  		}
   718  
   719  		if e.Name == emojis[1].Name {
   720  			found2 = true
   721  		}
   722  	}
   723  
   724  	assert.True(t, found1)
   725  	assert.False(t, found2)
   726  
   727  	_, resp = Client.AutocompleteEmoji("", "")
   728  	CheckBadRequestStatus(t, resp)
   729  
   730  	Client.Logout()
   731  	_, resp = Client.AutocompleteEmoji(searchTerm1, "")
   732  	CheckUnauthorizedStatus(t, resp)
   733  }