github.com/mattermost/mattermost-server/v5@v5.39.3/store/storetest/emoji_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  	"context"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/mattermost/mattermost-server/v5/model"
    12  	"github.com/mattermost/mattermost-server/v5/store"
    13  
    14  	"github.com/stretchr/testify/assert"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  func TestEmojiStore(t *testing.T, ss store.Store) {
    19  	t.Run("EmojiSaveDelete", func(t *testing.T) { testEmojiSaveDelete(t, ss) })
    20  	t.Run("EmojiGet", func(t *testing.T) { testEmojiGet(t, ss) })
    21  	t.Run("EmojiGetByName", func(t *testing.T) { testEmojiGetByName(t, ss) })
    22  	t.Run("EmojiGetMultipleByName", func(t *testing.T) { testEmojiGetMultipleByName(t, ss) })
    23  	t.Run("EmojiGetList", func(t *testing.T) { testEmojiGetList(t, ss) })
    24  	t.Run("EmojiSearch", func(t *testing.T) { testEmojiSearch(t, ss) })
    25  }
    26  
    27  func testEmojiSaveDelete(t *testing.T, ss store.Store) {
    28  	emoji1 := &model.Emoji{
    29  		CreatorId: model.NewId(),
    30  		Name:      model.NewId(),
    31  	}
    32  
    33  	_, err := ss.Emoji().Save(emoji1)
    34  	require.NoError(t, err)
    35  
    36  	assert.Len(t, emoji1.Id, 26, "should've set id for emoji")
    37  
    38  	emoji2 := model.Emoji{
    39  		CreatorId: model.NewId(),
    40  		Name:      emoji1.Name,
    41  	}
    42  	_, err = ss.Emoji().Save(&emoji2)
    43  	require.Error(t, err, "shouldn't be able to save emoji with duplicate name")
    44  
    45  	err = ss.Emoji().Delete(emoji1, time.Now().Unix())
    46  	require.NoError(t, err)
    47  
    48  	_, err = ss.Emoji().Save(&emoji2)
    49  	require.NoError(t, err, "should be able to save emoji with duplicate name now that original has been deleted")
    50  
    51  	err = ss.Emoji().Delete(&emoji2, time.Now().Unix()+1)
    52  	require.NoError(t, err)
    53  }
    54  
    55  func testEmojiGet(t *testing.T, ss store.Store) {
    56  	emojis := []model.Emoji{
    57  		{
    58  			CreatorId: model.NewId(),
    59  			Name:      model.NewId(),
    60  		},
    61  		{
    62  			CreatorId: model.NewId(),
    63  			Name:      model.NewId(),
    64  		},
    65  		{
    66  			CreatorId: model.NewId(),
    67  			Name:      model.NewId(),
    68  		},
    69  	}
    70  
    71  	for i, emoji := range emojis {
    72  		data, err := ss.Emoji().Save(&emoji)
    73  		require.NoError(t, err)
    74  		emojis[i] = *data
    75  	}
    76  	defer func() {
    77  		for _, emoji := range emojis {
    78  			err := ss.Emoji().Delete(&emoji, time.Now().Unix())
    79  			require.NoError(t, err)
    80  		}
    81  	}()
    82  
    83  	for _, emoji := range emojis {
    84  		_, err := ss.Emoji().Get(context.Background(), emoji.Id, false)
    85  		require.NoErrorf(t, err, "failed to get emoji with id %v", emoji.Id)
    86  	}
    87  
    88  	for _, emoji := range emojis {
    89  		_, err := ss.Emoji().Get(context.Background(), emoji.Id, true)
    90  		require.NoErrorf(t, err, "failed to get emoji with id %v", emoji.Id)
    91  	}
    92  }
    93  
    94  func testEmojiGetByName(t *testing.T, ss store.Store) {
    95  	emojis := []model.Emoji{
    96  		{
    97  			CreatorId: model.NewId(),
    98  			Name:      model.NewId(),
    99  		},
   100  		{
   101  			CreatorId: model.NewId(),
   102  			Name:      model.NewId(),
   103  		},
   104  		{
   105  			CreatorId: model.NewId(),
   106  			Name:      model.NewId(),
   107  		},
   108  	}
   109  
   110  	for i, emoji := range emojis {
   111  		data, err := ss.Emoji().Save(&emoji)
   112  		require.NoError(t, err)
   113  		emojis[i] = *data
   114  	}
   115  	defer func() {
   116  		for _, emoji := range emojis {
   117  			err := ss.Emoji().Delete(&emoji, time.Now().Unix())
   118  			require.NoError(t, err)
   119  		}
   120  	}()
   121  
   122  	for _, emoji := range emojis {
   123  		_, err := ss.Emoji().GetByName(context.Background(), emoji.Name, true)
   124  		require.NoErrorf(t, err, "failed to get emoji with name %v", emoji.Name)
   125  	}
   126  }
   127  
   128  func testEmojiGetMultipleByName(t *testing.T, ss store.Store) {
   129  	emojis := []model.Emoji{
   130  		{
   131  			CreatorId: model.NewId(),
   132  			Name:      model.NewId(),
   133  		},
   134  		{
   135  			CreatorId: model.NewId(),
   136  			Name:      model.NewId(),
   137  		},
   138  		{
   139  			CreatorId: model.NewId(),
   140  			Name:      model.NewId(),
   141  		},
   142  	}
   143  
   144  	for i, emoji := range emojis {
   145  		data, err := ss.Emoji().Save(&emoji)
   146  		require.NoError(t, err)
   147  		emojis[i] = *data
   148  	}
   149  	defer func() {
   150  		for _, emoji := range emojis {
   151  			err := ss.Emoji().Delete(&emoji, time.Now().Unix())
   152  			require.NoError(t, err)
   153  		}
   154  	}()
   155  
   156  	t.Run("one emoji", func(t *testing.T) {
   157  		received, err := ss.Emoji().GetMultipleByName([]string{emojis[0].Name})
   158  		require.NoError(t, err, "could not get emoji")
   159  		require.Len(t, received, 1, "got incorrect emoji")
   160  		require.Equal(t, *received[0], emojis[0], "got incorrect emoji")
   161  	})
   162  
   163  	t.Run("multiple emojis", func(t *testing.T) {
   164  		received, err := ss.Emoji().GetMultipleByName([]string{emojis[0].Name, emojis[1].Name, emojis[2].Name})
   165  		require.NoError(t, err, "could not get emojis")
   166  		require.Len(t, received, 3, "got incorrect emojis")
   167  	})
   168  
   169  	t.Run("one nonexistent emoji", func(t *testing.T) {
   170  		received, err := ss.Emoji().GetMultipleByName([]string{"ab"})
   171  		require.NoError(t, err, "could not get emoji", err)
   172  		require.Empty(t, received, "got incorrect emoji")
   173  	})
   174  
   175  	t.Run("multiple emojis with nonexistent names", func(t *testing.T) {
   176  		received, err := ss.Emoji().GetMultipleByName([]string{emojis[0].Name, emojis[1].Name, emojis[2].Name, "abcd", "1234"})
   177  		require.NoError(t, err, "could not get emojis")
   178  		require.Len(t, received, 3, "got incorrect emojis")
   179  	})
   180  }
   181  
   182  func testEmojiGetList(t *testing.T, ss store.Store) {
   183  	emojis := []model.Emoji{
   184  		{
   185  			CreatorId: model.NewId(),
   186  			Name:      "00000000000000000000000000a" + model.NewId(),
   187  		},
   188  		{
   189  			CreatorId: model.NewId(),
   190  			Name:      "00000000000000000000000000b" + model.NewId(),
   191  		},
   192  		{
   193  			CreatorId: model.NewId(),
   194  			Name:      "00000000000000000000000000c" + model.NewId(),
   195  		},
   196  	}
   197  
   198  	for i, emoji := range emojis {
   199  		data, err := ss.Emoji().Save(&emoji)
   200  		require.NoError(t, err)
   201  		emojis[i] = *data
   202  	}
   203  	defer func() {
   204  		for _, emoji := range emojis {
   205  			err := ss.Emoji().Delete(&emoji, time.Now().Unix())
   206  			require.NoError(t, err)
   207  		}
   208  	}()
   209  
   210  	result, err := ss.Emoji().GetList(0, 100, "")
   211  	require.NoError(t, err)
   212  
   213  	for _, emoji := range emojis {
   214  		found := false
   215  
   216  		for _, savedEmoji := range result {
   217  			if emoji.Id == savedEmoji.Id {
   218  				found = true
   219  				break
   220  			}
   221  		}
   222  
   223  		require.Truef(t, found, "failed to get emoji with id %v", emoji.Id)
   224  	}
   225  
   226  	remojis, err := ss.Emoji().GetList(0, 3, model.EMOJI_SORT_BY_NAME)
   227  	assert.NoError(t, err)
   228  	assert.Equal(t, 3, len(remojis))
   229  	assert.Equal(t, emojis[0].Name, remojis[0].Name)
   230  	assert.Equal(t, emojis[1].Name, remojis[1].Name)
   231  	assert.Equal(t, emojis[2].Name, remojis[2].Name)
   232  
   233  	remojis, err = ss.Emoji().GetList(1, 2, model.EMOJI_SORT_BY_NAME)
   234  	assert.NoError(t, err)
   235  	assert.Equal(t, 2, len(remojis))
   236  	assert.Equal(t, emojis[1].Name, remojis[0].Name)
   237  	assert.Equal(t, emojis[2].Name, remojis[1].Name)
   238  
   239  }
   240  
   241  func testEmojiSearch(t *testing.T, ss store.Store) {
   242  	emojis := []model.Emoji{
   243  		{
   244  			CreatorId: model.NewId(),
   245  			Name:      "blargh_" + model.NewId(),
   246  		},
   247  		{
   248  			CreatorId: model.NewId(),
   249  			Name:      model.NewId() + "_blargh",
   250  		},
   251  		{
   252  			CreatorId: model.NewId(),
   253  			Name:      model.NewId() + "_blargh_" + model.NewId(),
   254  		},
   255  		{
   256  			CreatorId: model.NewId(),
   257  			Name:      model.NewId(),
   258  		},
   259  	}
   260  
   261  	for i, emoji := range emojis {
   262  		data, err := ss.Emoji().Save(&emoji)
   263  		require.NoError(t, err)
   264  		emojis[i] = *data
   265  	}
   266  	defer func() {
   267  		for _, emoji := range emojis {
   268  			err := ss.Emoji().Delete(&emoji, time.Now().Unix())
   269  			require.NoError(t, err)
   270  		}
   271  	}()
   272  
   273  	shouldFind := []bool{true, false, false, false}
   274  
   275  	result, err := ss.Emoji().Search("blargh", true, 100)
   276  	require.NoError(t, err)
   277  	for i, emoji := range emojis {
   278  		found := false
   279  
   280  		for _, savedEmoji := range result {
   281  			if emoji.Id == savedEmoji.Id {
   282  				found = true
   283  				break
   284  			}
   285  		}
   286  
   287  		assert.Equal(t, shouldFind[i], found, emoji.Name)
   288  	}
   289  
   290  	shouldFind = []bool{true, true, true, false}
   291  	result, err = ss.Emoji().Search("blargh", false, 100)
   292  	require.NoError(t, err)
   293  	for i, emoji := range emojis {
   294  		found := false
   295  
   296  		for _, savedEmoji := range result {
   297  			if emoji.Id == savedEmoji.Id {
   298  				found = true
   299  				break
   300  			}
   301  		}
   302  
   303  		assert.Equal(t, shouldFind[i], found, emoji.Name)
   304  	}
   305  }