github.com/nmintoh/dserver@v5.11.1+incompatible/app/export_test.go (about)

     1  package app
     2  
     3  import (
     4  	"bytes"
     5  	"os"
     6  	"sort"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  	"github.com/stretchr/testify/require"
    11  
    12  	"github.com/mattermost/mattermost-server/model"
    13  	"github.com/mattermost/mattermost-server/store"
    14  )
    15  
    16  func TestReactionsOfPost(t *testing.T) {
    17  	th := Setup(t).InitBasic()
    18  	defer th.TearDown()
    19  
    20  	post := th.BasicPost
    21  	post.HasReactions = true
    22  
    23  	reactionObject := model.Reaction{
    24  		UserId:    th.BasicUser.Id,
    25  		PostId:    post.Id,
    26  		EmojiName: "emoji",
    27  		CreateAt:  model.GetMillis(),
    28  	}
    29  
    30  	th.App.SaveReactionForPost(&reactionObject)
    31  	reactionsOfPost, err := th.App.BuildPostReactions(post.Id)
    32  	require.Nil(t, err)
    33  
    34  	assert.Equal(t, reactionObject.EmojiName, *(*reactionsOfPost)[0].EmojiName)
    35  }
    36  
    37  func TestExportUserNotifyProps(t *testing.T) {
    38  
    39  	th := Setup(t).InitBasic()
    40  	defer th.TearDown()
    41  
    42  	userNotifyProps := model.StringMap{
    43  		model.DESKTOP_NOTIFY_PROP:          model.USER_NOTIFY_ALL,
    44  		model.DESKTOP_SOUND_NOTIFY_PROP:    "true",
    45  		model.EMAIL_NOTIFY_PROP:            "true",
    46  		model.PUSH_NOTIFY_PROP:             model.USER_NOTIFY_ALL,
    47  		model.PUSH_STATUS_NOTIFY_PROP:      model.STATUS_ONLINE,
    48  		model.CHANNEL_MENTIONS_NOTIFY_PROP: "true",
    49  		model.COMMENTS_NOTIFY_PROP:         model.COMMENTS_NOTIFY_ROOT,
    50  		model.MENTION_KEYS_NOTIFY_PROP:     "valid,misc",
    51  	}
    52  
    53  	exportNotifyProps := th.App.buildUserNotifyProps(userNotifyProps)
    54  
    55  	require.Equal(t, userNotifyProps[model.DESKTOP_NOTIFY_PROP], *exportNotifyProps.Desktop)
    56  	require.Equal(t, userNotifyProps[model.DESKTOP_SOUND_NOTIFY_PROP], *exportNotifyProps.DesktopSound)
    57  	require.Equal(t, userNotifyProps[model.EMAIL_NOTIFY_PROP], *exportNotifyProps.Email)
    58  	require.Equal(t, userNotifyProps[model.PUSH_NOTIFY_PROP], *exportNotifyProps.Mobile)
    59  	require.Equal(t, userNotifyProps[model.PUSH_STATUS_NOTIFY_PROP], *exportNotifyProps.MobilePushStatus)
    60  	require.Equal(t, userNotifyProps[model.CHANNEL_MENTIONS_NOTIFY_PROP], *exportNotifyProps.ChannelTrigger)
    61  	require.Equal(t, userNotifyProps[model.COMMENTS_NOTIFY_PROP], *exportNotifyProps.CommentsTrigger)
    62  	require.Equal(t, userNotifyProps[model.MENTION_KEYS_NOTIFY_PROP], *exportNotifyProps.MentionKeys)
    63  }
    64  
    65  func TestExportUserChannels(t *testing.T) {
    66  	th := Setup(t).InitBasic()
    67  	defer th.TearDown()
    68  	channel := th.BasicChannel
    69  	user := th.BasicUser
    70  	team := th.BasicTeam
    71  	channelName := channel.Name
    72  	notifyProps := model.StringMap{
    73  		model.DESKTOP_NOTIFY_PROP: model.USER_NOTIFY_ALL,
    74  		model.PUSH_NOTIFY_PROP:    model.USER_NOTIFY_NONE,
    75  	}
    76  	preference := model.Preference{
    77  		UserId:   user.Id,
    78  		Category: model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL,
    79  		Name:     channel.Id,
    80  		Value:    "true",
    81  	}
    82  	var preferences model.Preferences
    83  	preferences = append(preferences, preference)
    84  	store.Must(th.App.Srv.Store.Preference().Save(&preferences))
    85  	th.App.UpdateChannelMemberNotifyProps(notifyProps, channel.Id, user.Id)
    86  	exportData, err := th.App.buildUserChannelMemberships(user.Id, team.Id)
    87  	require.Nil(t, err)
    88  	assert.Equal(t, len(*exportData), 3)
    89  	for _, data := range *exportData {
    90  		if *data.Name == channelName {
    91  			assert.Equal(t, *data.NotifyProps.Desktop, "all")
    92  			assert.Equal(t, *data.NotifyProps.Mobile, "none")
    93  			assert.Equal(t, *data.NotifyProps.MarkUnread, "all") // default value
    94  			assert.True(t, *data.Favorite)
    95  		} else { // default values
    96  			assert.Equal(t, *data.NotifyProps.Desktop, "default")
    97  			assert.Equal(t, *data.NotifyProps.Mobile, "default")
    98  			assert.Equal(t, *data.NotifyProps.MarkUnread, "all")
    99  			assert.False(t, *data.Favorite)
   100  		}
   101  	}
   102  }
   103  
   104  func TestDirCreationForEmoji(t *testing.T) {
   105  	th := Setup(t).InitBasic()
   106  	defer th.TearDown()
   107  
   108  	pathToDir := th.App.createDirForEmoji("test.json", "exported_emoji_test")
   109  	defer os.Remove(pathToDir)
   110  	if _, err := os.Stat(pathToDir); os.IsNotExist(err) {
   111  		t.Fatal("Directory exported_emoji_test should exist")
   112  	}
   113  }
   114  
   115  func TestCopyEmojiImages(t *testing.T) {
   116  	th := Setup(t).InitBasic()
   117  	defer th.TearDown()
   118  
   119  	emoji := &model.Emoji{
   120  		Id: th.BasicUser.Id,
   121  	}
   122  
   123  	// Creating a dir named `exported_emoji_test` in the root of the repo
   124  	pathToDir := "../exported_emoji_test"
   125  
   126  	os.Mkdir(pathToDir, 0777)
   127  	defer os.RemoveAll(pathToDir)
   128  
   129  	filePath := "../data/emoji/" + emoji.Id
   130  	emojiImagePath := filePath + "/image"
   131  
   132  	var _, err = os.Stat(filePath)
   133  	if os.IsNotExist(err) {
   134  		os.MkdirAll(filePath, 0777)
   135  	}
   136  
   137  	// Creating a file with the name `image` to copy it to `exported_emoji_test`
   138  	os.OpenFile(filePath+"/image", os.O_RDONLY|os.O_CREATE, 0777)
   139  	defer os.RemoveAll(filePath)
   140  
   141  	copyError := th.App.copyEmojiImages(emoji.Id, emojiImagePath, pathToDir)
   142  	if copyError != nil {
   143  		t.Fatal(copyError)
   144  	}
   145  
   146  	if _, err := os.Stat(pathToDir + "/" + emoji.Id + "/image"); os.IsNotExist(err) {
   147  		t.Fatal("File should exist ", err)
   148  	}
   149  }
   150  
   151  func TestExportCustomEmoji(t *testing.T) {
   152  	th := Setup(t).InitBasic()
   153  	defer th.TearDown()
   154  
   155  	filePath := "../demo.json"
   156  
   157  	fileWriter, err := os.Create(filePath)
   158  	require.Nil(t, err)
   159  	defer os.Remove(filePath)
   160  
   161  	pathToEmojiDir := "../data/emoji/"
   162  	dirNameToExportEmoji := "exported_emoji_test"
   163  	defer os.RemoveAll("../" + dirNameToExportEmoji)
   164  
   165  	if err := th.App.ExportCustomEmoji(fileWriter, filePath, pathToEmojiDir, dirNameToExportEmoji); err != nil {
   166  		t.Fatal(err)
   167  	}
   168  }
   169  
   170  func TestExportAllUsers(t *testing.T) {
   171  	th1 := Setup(t).InitBasic()
   172  	defer th1.TearDown()
   173  
   174  	// Adding a user and deactivating it to check whether it gets included in bulk export
   175  	user := th1.CreateUser()
   176  	_, err := th1.App.UpdateActive(user, false)
   177  	require.Nil(t, err)
   178  
   179  	var b bytes.Buffer
   180  	err = th1.App.BulkExport(&b, "somefile", "somePath", "someDir")
   181  	require.Nil(t, err)
   182  
   183  	th2 := Setup(t)
   184  	defer th2.TearDown()
   185  	err, i := th2.App.BulkImport(&b, false, 5)
   186  	assert.Nil(t, err)
   187  	assert.Equal(t, 0, i)
   188  
   189  	users1, err := th1.App.GetUsers(&model.UserGetOptions{
   190  		Page:    0,
   191  		PerPage: 10,
   192  	})
   193  	assert.Nil(t, err)
   194  	users2, err := th2.App.GetUsers(&model.UserGetOptions{
   195  		Page:    0,
   196  		PerPage: 10,
   197  	})
   198  	assert.Nil(t, err)
   199  	assert.Equal(t, len(users1), len(users2))
   200  	assert.ElementsMatch(t, users1, users2)
   201  
   202  	// Checking whether deactivated users were included in bulk export
   203  	deletedUsers1, err := th1.App.GetUsers(&model.UserGetOptions{
   204  		Inactive: true,
   205  		Page:     0,
   206  		PerPage:  10,
   207  	})
   208  	assert.Nil(t, err)
   209  	deletedUsers2, err := th1.App.GetUsers(&model.UserGetOptions{
   210  		Inactive: true,
   211  		Page:     0,
   212  		PerPage:  10,
   213  	})
   214  	assert.Nil(t, err)
   215  	assert.Equal(t, len(deletedUsers1), len(deletedUsers2))
   216  	assert.ElementsMatch(t, deletedUsers1, deletedUsers2)
   217  }
   218  
   219  func TestExportDMChannel(t *testing.T) {
   220  	th1 := Setup(t).InitBasic()
   221  
   222  	// DM Channel
   223  	th1.CreateDmChannel(th1.BasicUser2)
   224  
   225  	var b bytes.Buffer
   226  	err := th1.App.BulkExport(&b, "somefile", "somePath", "someDir")
   227  	require.Nil(t, err)
   228  
   229  	result := <-th1.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
   230  	channels := result.Data.([]*model.DirectChannelForExport)
   231  	assert.Equal(t, 1, len(channels))
   232  
   233  	th1.TearDown()
   234  
   235  	th2 := Setup(t)
   236  	defer th2.TearDown()
   237  
   238  	result = <-th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
   239  	channels = result.Data.([]*model.DirectChannelForExport)
   240  	assert.Equal(t, 0, len(channels))
   241  
   242  	// import the exported channel
   243  	err, i := th2.App.BulkImport(&b, false, 5)
   244  	assert.Nil(t, err)
   245  	assert.Equal(t, 0, i)
   246  
   247  	// Ensure the Members of the imported DM channel is the same was from the exported
   248  	result = <-th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
   249  	channels = result.Data.([]*model.DirectChannelForExport)
   250  	assert.Equal(t, 1, len(channels))
   251  	assert.ElementsMatch(t, []string{th1.BasicUser.Username, th1.BasicUser2.Username}, *channels[0].Members)
   252  }
   253  
   254  func TestExportDMChannelToSelf(t *testing.T) {
   255  	th1 := Setup(t).InitBasic()
   256  	defer th1.TearDown()
   257  
   258  	// DM Channel with self (me channel)
   259  	th1.CreateDmChannel(th1.BasicUser)
   260  
   261  	var b bytes.Buffer
   262  	err := th1.App.BulkExport(&b, "somefile", "somePath", "someDir")
   263  	require.Nil(t, err)
   264  
   265  	result := <-th1.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
   266  	channels := result.Data.([]*model.DirectChannelForExport)
   267  	assert.Equal(t, 1, len(channels))
   268  
   269  	th2 := Setup(t)
   270  	defer th2.TearDown()
   271  
   272  	result = <-th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
   273  	channels = result.Data.([]*model.DirectChannelForExport)
   274  	assert.Equal(t, 0, len(channels))
   275  
   276  	// import the exported channel
   277  	err, i := th2.App.BulkImport(&b, false, 5)
   278  	assert.Nil(t, err)
   279  	assert.Equal(t, 0, i)
   280  
   281  	// Ensure no channels were imported
   282  	result = <-th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
   283  	channels = result.Data.([]*model.DirectChannelForExport)
   284  	assert.Equal(t, 0, len(channels))
   285  }
   286  
   287  func TestExportGMChannel(t *testing.T) {
   288  	th1 := Setup(t).InitBasic()
   289  
   290  	user1 := th1.CreateUser()
   291  	th1.LinkUserToTeam(user1, th1.BasicTeam)
   292  	user2 := th1.CreateUser()
   293  	th1.LinkUserToTeam(user2, th1.BasicTeam)
   294  
   295  	// GM Channel
   296  	th1.CreateGroupChannel(user1, user2)
   297  
   298  	var b bytes.Buffer
   299  	err := th1.App.BulkExport(&b, "somefile", "somePath", "someDir")
   300  	require.Nil(t, err)
   301  
   302  	result := <-th1.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
   303  	channels := result.Data.([]*model.DirectChannelForExport)
   304  	assert.Equal(t, 1, len(channels))
   305  
   306  	th1.TearDown()
   307  
   308  	th2 := Setup(t)
   309  	defer th2.TearDown()
   310  
   311  	result = <-th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
   312  	channels = result.Data.([]*model.DirectChannelForExport)
   313  	assert.Equal(t, 0, len(channels))
   314  }
   315  
   316  func TestExportGMandDMChannels(t *testing.T) {
   317  	th1 := Setup(t).InitBasic()
   318  
   319  	// DM Channel
   320  	th1.CreateDmChannel(th1.BasicUser2)
   321  
   322  	user1 := th1.CreateUser()
   323  	th1.LinkUserToTeam(user1, th1.BasicTeam)
   324  	user2 := th1.CreateUser()
   325  	th1.LinkUserToTeam(user2, th1.BasicTeam)
   326  
   327  	// GM Channel
   328  	th1.CreateGroupChannel(user1, user2)
   329  
   330  	var b bytes.Buffer
   331  	err := th1.App.BulkExport(&b, "somefile", "somePath", "someDir")
   332  	require.Nil(t, err)
   333  
   334  	result := <-th1.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
   335  	channels := result.Data.([]*model.DirectChannelForExport)
   336  	assert.Equal(t, 2, len(channels))
   337  
   338  	th1.TearDown()
   339  
   340  	th2 := Setup(t)
   341  	defer th2.TearDown()
   342  
   343  	result = <-th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
   344  	channels = result.Data.([]*model.DirectChannelForExport)
   345  	assert.Equal(t, 0, len(channels))
   346  
   347  	// import the exported channel
   348  	err, i := th2.App.BulkImport(&b, false, 5)
   349  	assert.Nil(t, err)
   350  	assert.Equal(t, 0, i)
   351  
   352  	// Ensure the Members of the imported GM channel is the same was from the exported
   353  	result = <-th2.App.Srv.Store.Channel().GetAllDirectChannelsForExportAfter(1000, "00000000")
   354  	channels = result.Data.([]*model.DirectChannelForExport)
   355  
   356  	// Adding some deteminism so its possible to assert on slice index
   357  	sort.Slice(channels, func(i, j int) bool { return channels[i].Type > channels[j].Type })
   358  	assert.Equal(t, 2, len(channels))
   359  	assert.ElementsMatch(t, []string{th1.BasicUser.Username, user1.Username, user2.Username}, *channels[0].Members)
   360  	assert.ElementsMatch(t, []string{th1.BasicUser.Username, th1.BasicUser2.Username}, *channels[1].Members)
   361  }
   362  
   363  func TestExportDMandGMPost(t *testing.T) {
   364  	th1 := Setup(t).InitBasic()
   365  
   366  	// DM Channel
   367  	dmChannel := th1.CreateDmChannel(th1.BasicUser2)
   368  	dmMembers := []string{th1.BasicUser.Username, th1.BasicUser2.Username}
   369  
   370  	user1 := th1.CreateUser()
   371  	th1.LinkUserToTeam(user1, th1.BasicTeam)
   372  	user2 := th1.CreateUser()
   373  	th1.LinkUserToTeam(user2, th1.BasicTeam)
   374  
   375  	// GM Channel
   376  	gmChannel := th1.CreateGroupChannel(user1, user2)
   377  	gmMembers := []string{th1.BasicUser.Username, user1.Username, user2.Username}
   378  
   379  	// DM posts
   380  	p1 := &model.Post{
   381  		ChannelId: dmChannel.Id,
   382  		Message:   "aa" + model.NewId() + "a",
   383  		UserId:    th1.BasicUser.Id,
   384  	}
   385  	th1.App.CreatePost(p1, dmChannel, false)
   386  
   387  	p2 := &model.Post{
   388  		ChannelId: dmChannel.Id,
   389  		Message:   "bb" + model.NewId() + "a",
   390  		UserId:    th1.BasicUser.Id,
   391  	}
   392  	th1.App.CreatePost(p2, dmChannel, false)
   393  
   394  	// GM posts
   395  	p3 := &model.Post{
   396  		ChannelId: gmChannel.Id,
   397  		Message:   "cc" + model.NewId() + "a",
   398  		UserId:    th1.BasicUser.Id,
   399  	}
   400  	th1.App.CreatePost(p3, gmChannel, false)
   401  
   402  	p4 := &model.Post{
   403  		ChannelId: gmChannel.Id,
   404  		Message:   "dd" + model.NewId() + "a",
   405  		UserId:    th1.BasicUser.Id,
   406  	}
   407  	th1.App.CreatePost(p4, gmChannel, false)
   408  
   409  	result := <-th1.App.Srv.Store.Post().GetDirectPostParentsForExportAfter(1000, "0000000")
   410  	posts := result.Data.([]*model.DirectPostForExport)
   411  	assert.Equal(t, 4, len(posts))
   412  
   413  	var b bytes.Buffer
   414  	err := th1.App.BulkExport(&b, "somefile", "somePath", "someDir")
   415  	require.Nil(t, err)
   416  
   417  	th1.TearDown()
   418  
   419  	th2 := Setup(t)
   420  	defer th2.TearDown()
   421  
   422  	result = <-th2.App.Srv.Store.Post().GetDirectPostParentsForExportAfter(1000, "0000000")
   423  	posts = result.Data.([]*model.DirectPostForExport)
   424  	assert.Equal(t, 0, len(posts))
   425  
   426  	// import the exported posts
   427  	err, i := th2.App.BulkImport(&b, false, 5)
   428  	assert.Nil(t, err)
   429  	assert.Equal(t, 0, i)
   430  
   431  	result = <-th2.App.Srv.Store.Post().GetDirectPostParentsForExportAfter(1000, "0000000")
   432  	posts = result.Data.([]*model.DirectPostForExport)
   433  
   434  	// Adding some deteminism so its possible to assert on slice index
   435  	sort.Slice(posts, func(i, j int) bool { return posts[i].Message > posts[j].Message })
   436  	assert.Equal(t, 4, len(posts))
   437  	assert.ElementsMatch(t, gmMembers, *posts[0].ChannelMembers)
   438  	assert.ElementsMatch(t, gmMembers, *posts[1].ChannelMembers)
   439  	assert.ElementsMatch(t, dmMembers, *posts[2].ChannelMembers)
   440  	assert.ElementsMatch(t, dmMembers, *posts[3].ChannelMembers)
   441  }
   442  
   443  func TestExportDMPostWithSelf(t *testing.T) {
   444  	th1 := Setup(t).InitBasic()
   445  
   446  	// DM Channel with self (me channel)
   447  	dmChannel := th1.CreateDmChannel(th1.BasicUser)
   448  
   449  	th1.CreatePost(dmChannel)
   450  
   451  	var b bytes.Buffer
   452  	err := th1.App.BulkExport(&b, "somefile", "somePath", "someDir")
   453  	require.Nil(t, err)
   454  
   455  	result := <-th1.App.Srv.Store.Post().GetDirectPostParentsForExportAfter(1000, "0000000")
   456  	posts := result.Data.([]*model.DirectPostForExport)
   457  	assert.Equal(t, 1, len(posts))
   458  
   459  	th1.TearDown()
   460  
   461  	th2 := Setup(t)
   462  	defer th2.TearDown()
   463  
   464  	result = <-th2.App.Srv.Store.Post().GetDirectPostParentsForExportAfter(1000, "0000000")
   465  	posts = result.Data.([]*model.DirectPostForExport)
   466  	assert.Equal(t, 0, len(posts))
   467  
   468  	// import the exported posts
   469  	err, i := th2.App.BulkImport(&b, false, 5)
   470  	assert.Nil(t, err)
   471  	assert.Equal(t, 0, i)
   472  
   473  	result = <-th2.App.Srv.Store.Post().GetDirectPostParentsForExportAfter(1000, "0000000")
   474  	posts = result.Data.([]*model.DirectPostForExport)
   475  	assert.Equal(t, 0, len(posts))
   476  }