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 }