From 0e6ec05d5c7c415372c43ffc763ad12946de243c Mon Sep 17 00:00:00 2001 From: Ibrahim Serdar Acikgoz Date: Fri, 15 Nov 2024 09:45:14 +0100 Subject: [PATCH] [MM-53339] import: dont miss out reactions from replies (#29060) --- server/channels/app/import_functions.go | 36 +- server/channels/app/import_functions_test.go | 1300 ++++++++++-------- 2 files changed, 772 insertions(+), 564 deletions(-) diff --git a/server/channels/app/import_functions.go b/server/channels/app/import_functions.go index 9f6960d5da..c86bad772f 100644 --- a/server/channels/app/import_functions.go +++ b/server/channels/app/import_functions.go @@ -1369,10 +1369,17 @@ func (a *App) importReplies(rctx request.CTX, data []imports.ReplyImportData, po return err } + type postAndReactions struct { + post *model.Post + reactions *[]imports.ReactionImportData + } + var ( postsWithData = []postAndData{} postsForCreateList = []*model.Post{} postsForOverwriteList = []*model.Post{} + reactionsForCreateMap = make(map[string]postAndReactions) + interimReactionsMap = map[int64]*[]imports.ReactionImportData{} ) for _, replyData := range data { @@ -1428,14 +1435,25 @@ func (a *App) importReplies(rctx request.CTX, data []imports.ReplyImportData, po if reply.Id == "" { postsForCreateList = append(postsForCreateList, reply) + if replyData.Reactions != nil && len(*replyData.Reactions) > 0 { + // although createAt is not unique, I think it is safe to + // assume that it could be near-unique especially for the same thread. + // If this assumption fails, the last reactions would be used for the + // posts that share same createAt value. + interimReactionsMap[reply.CreateAt] = replyData.Reactions + } } else { postsForOverwriteList = append(postsForOverwriteList, reply) + if replyData.Reactions != nil && len(*replyData.Reactions) > 0 { + reactionsForCreateMap[reply.Id] = postAndReactions{post: reply, reactions: replyData.Reactions} + } } postsWithData = append(postsWithData, postAndData{post: reply, replyData: &replyData}) } if len(postsForCreateList) > 0 { - if _, _, err := a.Srv().Store().Post().SaveMultiple(postsForCreateList); err != nil { + postsCreated, _, err := a.Srv().Store().Post().SaveMultiple(postsForCreateList) + if err != nil { var appErr *model.AppError var invErr *store.ErrInvalidInput switch { @@ -1447,12 +1465,28 @@ func (a *App) importReplies(rctx request.CTX, data []imports.ReplyImportData, po return model.NewAppError("importReplies", "app.post.save.app_error", nil, "", http.StatusInternalServerError).Wrap(err) } } + for _, created := range postsCreated { + reactions, ok := interimReactionsMap[created.CreateAt] + if !ok || reactions == nil { + continue + } + + reactionsForCreateMap[created.Id] = postAndReactions{post: created, reactions: reactions} + } } if _, _, nErr := a.Srv().Store().Post().OverwriteMultiple(postsForOverwriteList); nErr != nil { return model.NewAppError("importReplies", "app.post.overwrite.app_error", nil, "", http.StatusInternalServerError).Wrap(nErr) } + for _, postAndReactions := range reactionsForCreateMap { + for _, reaction := range *postAndReactions.reactions { + if err := a.importReaction(&reaction, postAndReactions.post); err != nil { + return err + } + } + } + for _, postWithData := range postsWithData { a.updateFileInfoWithPostId(rctx, postWithData.post) diff --git a/server/channels/app/import_functions_test.go b/server/channels/app/import_functions_test.go index 0c936ec2f2..2ebd6b44dd 100644 --- a/server/channels/app/import_functions_test.go +++ b/server/channels/app/import_functions_test.go @@ -2013,246 +2013,6 @@ func TestImportimportMultiplePostLines(t *testing.T) { user, err := th.App.GetUserByUsername(username) require.Nil(t, err, "Failed to get user from database.") - // Count the number of posts in the testing team. - initialPostCount, nErr := th.App.Srv().Store().Post().AnalyticsPostCount(&model.PostCountOptions{TeamId: team.Id}) - require.NoError(t, nErr) - - // Try adding an invalid post in dry run mode. - data := imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: &teamName, - Channel: &channelName, - User: &username, - }, - }, - LineNumber: 25, - } - errLine, err := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, true, true) - assert.NotNil(t, err) - assert.Equal(t, data.LineNumber, errLine) - AssertAllPostsCount(t, th.App, initialPostCount, 0, team.Id) - - // Try adding a valid post in dry run mode. - data = imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: &teamName, - Channel: &channelName, - User: &username, - Message: model.NewPointer("Hello"), - CreateAt: model.NewPointer(model.GetMillis()), - }, - }, - LineNumber: 1, - } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, true, true) - assert.Nil(t, err) - assert.Equal(t, 0, errLine) - AssertAllPostsCount(t, th.App, initialPostCount, 0, team.Id) - - // Try adding an invalid post in apply mode. - data = imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: &teamName, - Channel: &channelName, - User: &username, - CreateAt: model.NewPointer(model.GetMillis()), - }, - }, - LineNumber: 35, - } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) - assert.NotNil(t, err) - assert.Equal(t, data.LineNumber, errLine) - AssertAllPostsCount(t, th.App, initialPostCount, 0, team.Id) - - // Try adding a valid post with invalid team in apply mode. - data = imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: model.NewPointer(NewTestId()), - Channel: &channelName, - User: &username, - Message: model.NewPointer("Message"), - CreateAt: model.NewPointer(model.GetMillis()), - }, - }, - LineNumber: 10, - } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) - assert.NotNil(t, err) - // Batch will fail when searching for teams, so no specific line - // is associated with the error - assert.Equal(t, 0, errLine) - AssertAllPostsCount(t, th.App, initialPostCount, 0, team.Id) - - // Try adding a valid post with invalid channel in apply mode. - data = imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: &teamName, - Channel: model.NewPointer(NewTestId()), - User: &username, - Message: model.NewPointer("Message"), - CreateAt: model.NewPointer(model.GetMillis()), - }, - }, - LineNumber: 7, - } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) - assert.NotNil(t, err) - // Batch will fail when searching for channels, so no specific - // line is associated with the error - assert.Equal(t, 0, errLine) - AssertAllPostsCount(t, th.App, initialPostCount, 0, team.Id) - - // Try adding a valid post with invalid user in apply mode. - data = imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: &teamName, - Channel: &channelName, - User: model.NewPointer(model.NewId()), - Message: model.NewPointer("Message"), - CreateAt: model.NewPointer(model.GetMillis()), - }, - }, - LineNumber: 2, - } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) - assert.NotNil(t, err) - // Batch will fail when searching for users, so no specific line - // is associated with the error - assert.Equal(t, 0, errLine) - AssertAllPostsCount(t, th.App, initialPostCount, 0, team.Id) - - // Try adding a valid post in apply mode. - createAt := model.GetMillis() - data = imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: &teamName, - Channel: &channelName, - User: &username, - Message: model.NewPointer("Message"), - CreateAt: &createAt, - }, - }, - LineNumber: 1, - } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) - assert.Nil(t, err) - assert.Equal(t, 0, errLine) - AssertAllPostsCount(t, th.App, initialPostCount, 1, team.Id) - - // Check the post values. - posts, nErr := th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, createAt) - require.NoError(t, nErr) - - require.Len(t, posts, 1, "Unexpected number of posts found.") - - post := posts[0] - postBool := post.Message != *data.Post.Message || post.CreateAt != *data.Post.CreateAt || post.UserId != user.Id - require.False(t, postBool, "Post properties not as expected") - - // Update the post. - data = imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: &teamName, - Channel: &channelName, - User: &username, - Message: model.NewPointer("Message"), - CreateAt: &createAt, - }, - }, - LineNumber: 1, - } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) - assert.Nil(t, err) - assert.Equal(t, 0, errLine) - AssertAllPostsCount(t, th.App, initialPostCount, 1, team.Id) - - // Check the post values. - posts, nErr = th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, createAt) - require.NoError(t, nErr) - - require.Len(t, posts, 1, "Unexpected number of posts found.") - - post = posts[0] - postBool = post.Message != *data.Post.Message || post.CreateAt != *data.Post.CreateAt || post.UserId != user.Id - require.False(t, postBool, "Post properties not as expected") - - // Save the post with a different time. - newTime := createAt + 1 - data = imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: &teamName, - Channel: &channelName, - User: &username, - Message: model.NewPointer("Message"), - CreateAt: &newTime, - }, - }, - LineNumber: 1, - } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) - assert.Nil(t, err) - assert.Equal(t, 0, errLine) - AssertAllPostsCount(t, th.App, initialPostCount, 2, team.Id) - - // Save the post with a different message. - data = imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: &teamName, - Channel: &channelName, - User: &username, - Message: model.NewPointer("Message 2"), - CreateAt: &createAt, - }, - }, - LineNumber: 1, - } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) - assert.Nil(t, err) - assert.Equal(t, 0, errLine) - AssertAllPostsCount(t, th.App, initialPostCount, 3, team.Id) - - // Test with hashtags - hashtagTime := createAt + 2 - data = imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: &teamName, - Channel: &channelName, - User: &username, - Message: model.NewPointer("Message 2 #hashtagmashupcity"), - CreateAt: &hashtagTime, - }, - }, - LineNumber: 1, - } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) - assert.Nil(t, err) - assert.Equal(t, 0, errLine) - AssertAllPostsCount(t, th.App, initialPostCount, 4, team.Id) - - posts, nErr = th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, hashtagTime) - require.NoError(t, nErr) - - require.Len(t, posts, 1, "Unexpected number of posts found.") - - post = posts[0] - postBool = post.Message != *data.Post.Message || post.CreateAt != *data.Post.CreateAt || post.UserId != user.Id - require.False(t, postBool, "Post properties not as expected") - - require.Equal(t, "#hashtagmashupcity", post.Hashtags, "Hashtags not as expected: %s", post.Hashtags) - - // Post with flags. username2 := model.NewUsername() th.App.importUser(th.Context, &imports.UserImportData{ Username: &username2, @@ -2261,331 +2021,745 @@ func TestImportimportMultiplePostLines(t *testing.T) { user2, err := th.App.GetUserByUsername(username2) require.Nil(t, err, "Failed to get user from database.") - flagsTime := hashtagTime + 1 - data = imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: &teamName, - Channel: &channelName, - User: &username, - Message: model.NewPointer("Message with Favorites"), - CreateAt: &flagsTime, - FlaggedBy: &[]string{ - username, - username2, - }, - }, - }, - LineNumber: 1, - } - - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) - assert.Nil(t, err, "Expected success.") - assert.Equal(t, 0, errLine) - - AssertAllPostsCount(t, th.App, initialPostCount, 5, team.Id) - - // Check the post values. - posts, nErr = th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, flagsTime) + // Count the number of posts in the testing team. + initialPostCount, nErr := th.App.Srv().Store().Post().AnalyticsPostCount(&model.PostCountOptions{TeamId: team.Id}) require.NoError(t, nErr) - require.Len(t, posts, 1, "Unexpected number of posts found.") - - post = posts[0] - postBool = post.Message != *data.Post.Message || post.CreateAt != *data.Post.CreateAt || post.UserId != user.Id - require.False(t, postBool, "Post properties not as expected") - - checkPreference(t, th.App, user.Id, model.PreferenceCategoryFlaggedPost, post.Id, "true") - checkPreference(t, th.App, user2.Id, model.PreferenceCategoryFlaggedPost, post.Id, "true") - - // Post with reaction. - reactionPostTime := hashtagTime + 2 - reactionTime := hashtagTime + 3 - data = imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: &teamName, - Channel: &channelName, - User: &username, - Message: model.NewPointer("Message with reaction"), - CreateAt: &reactionPostTime, - Reactions: &[]imports.ReactionImportData{{ - User: &user2.Username, - EmojiName: model.NewPointer("+1"), - CreateAt: &reactionTime, - }}, - }, - }, - LineNumber: 1, - } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) - assert.Nil(t, err, "Expected success.") - assert.Equal(t, 0, errLine) - - AssertAllPostsCount(t, th.App, initialPostCount, 6, team.Id) - - // Check the post values. - posts, nErr = th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, reactionPostTime) - require.NoError(t, nErr) - - require.Len(t, posts, 1, "Unexpected number of posts found.") - - post = posts[0] - postBool = post.Message != *data.Post.Message || post.CreateAt != *data.Post.CreateAt || post.UserId != user.Id || !post.HasReactions - require.False(t, postBool, "Post properties not as expected") - - reactions, nErr := th.App.Srv().Store().Reaction().GetForPost(post.Id, false) - require.NoError(t, nErr, "Can't get reaction") - - require.Len(t, reactions, 1, "Invalid number of reactions") - - // Post with reply. + createAt := model.GetMillis() + hashtagTime := createAt + 2 replyPostTime := hashtagTime + 4 replyTime := hashtagTime + 5 - data = imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: &teamName, - Channel: &channelName, - User: &username, - Message: model.NewPointer("Message with reply"), - CreateAt: &replyPostTime, - Replies: &[]imports.ReplyImportData{{ + + var assertionCount int64 + + t.Run("invalid post in dry run mode", func(t *testing.T) { + // Try adding an invalid post in dry run mode. + data := imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, + User: &username, + }, + }, + LineNumber: 25, + } + errLine, err2 := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, true, true) + assert.NotNil(t, err2) + assert.Equal(t, data.LineNumber, errLine) + AssertAllPostsCount(t, th.App, initialPostCount, 0, team.Id) + }) + + t.Run("valid post in dry run mode", func(t *testing.T) { + // Try adding a valid post in dry run mode. + data := imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, + User: &username, + Message: model.NewPointer("Hello"), + CreateAt: model.NewPointer(model.GetMillis()), + }, + }, + LineNumber: 1, + } + errLine, err2 := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, true, true) + assert.Nil(t, err2) + assert.Equal(t, 0, errLine) + AssertAllPostsCount(t, th.App, initialPostCount, 0, team.Id) + }) + + t.Run("invalid post in apply mode", func(t *testing.T) { + // Try adding an invalid post in apply mode. + data := imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, + User: &username, + CreateAt: model.NewPointer(model.GetMillis()), + }, + }, + LineNumber: 35, + } + errLine, err2 := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + assert.NotNil(t, err2) + assert.Equal(t, data.LineNumber, errLine) + AssertAllPostsCount(t, th.App, initialPostCount, 0, team.Id) + }) + + t.Run("valid post with invalid team in apply mode", func(t *testing.T) { + // Try adding a valid post with invalid team in apply mode. + data := imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: model.NewPointer(NewTestId()), + Channel: &channelName, + User: &username, + Message: model.NewPointer("Message"), + CreateAt: model.NewPointer(model.GetMillis()), + }, + }, + LineNumber: 10, + } + errLine, err2 := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + assert.NotNil(t, err2) + // Batch will fail when searching for teams, so no specific line + // is associated with the error + assert.Equal(t, 0, errLine) + AssertAllPostsCount(t, th.App, initialPostCount, 0, team.Id) + }) + + t.Run("valid post with invalid channel in apply mode", func(t *testing.T) { + // Try adding a valid post with invalid channel in apply mode. + data := imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: model.NewPointer(NewTestId()), + User: &username, + Message: model.NewPointer("Message"), + CreateAt: model.NewPointer(model.GetMillis()), + }, + }, + LineNumber: 7, + } + errLine, err2 := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + assert.NotNil(t, err2) + // Batch will fail when searching for channels, so no specific + // line is associated with the error + assert.Equal(t, 0, errLine) + AssertAllPostsCount(t, th.App, initialPostCount, 0, team.Id) + }) + + t.Run("valid post with invalid user in apply mode", func(t *testing.T) { + // Try adding a valid post with invalid user in apply mode. + data := imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, + User: model.NewPointer(model.NewId()), + Message: model.NewPointer("Message"), + CreateAt: model.NewPointer(model.GetMillis()), + }, + }, + LineNumber: 2, + } + errLine, err2 := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + assert.NotNil(t, err2) + // Batch will fail when searching for users, so no specific line + // is associated with the error + assert.Equal(t, 0, errLine) + AssertAllPostsCount(t, th.App, initialPostCount, 0, team.Id) + }) + + t.Run("valid post in apply mode", func(t *testing.T) { + // Try adding a valid post in apply mode. + data := imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, + User: &username, + Message: model.NewPointer("Message"), + CreateAt: &createAt, + }, + }, + LineNumber: 1, + } + errLine, err2 := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + assert.Nil(t, err2) + assert.Equal(t, 0, errLine) + assertionCount++ + AssertAllPostsCount(t, th.App, initialPostCount, assertionCount, team.Id) + + // Check the post values. + posts, nErr := th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, createAt) + require.NoError(t, nErr) + + require.Len(t, posts, 1, "Unexpected number of posts found.") + + post := posts[0] + postBool := post.Message != *data.Post.Message || post.CreateAt != *data.Post.CreateAt || post.UserId != user.Id + require.False(t, postBool, "Post properties not as expected") + + // Update the post. + data = imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, + User: &username, + Message: model.NewPointer("Message"), + CreateAt: &createAt, + }, + }, + LineNumber: 1, + } + errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + assert.Nil(t, err) + assert.Equal(t, 0, errLine) + AssertAllPostsCount(t, th.App, initialPostCount, assertionCount, team.Id) + + // Check the post values. + posts, nErr = th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, createAt) + require.NoError(t, nErr) + + require.Len(t, posts, 1, "Unexpected number of posts found.") + + post = posts[0] + postBool = post.Message != *data.Post.Message || post.CreateAt != *data.Post.CreateAt || post.UserId != user.Id + require.False(t, postBool, "Post properties not as expected") + }) + + t.Run("import the post with a different time", func(t *testing.T) { + // Save the post with a different time. + newTime := createAt + 1 + data := imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, + User: &username, + Message: model.NewPointer("Message"), + CreateAt: &newTime, + }, + }, + LineNumber: 1, + } + errLine, err2 := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + assert.Nil(t, err2) + assert.Equal(t, 0, errLine) + assertionCount++ + AssertAllPostsCount(t, th.App, initialPostCount, assertionCount, team.Id) + }) + + t.Run("import the post with a different message", func(t *testing.T) { + // Save the post with a different message. + data := imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, + User: &username, + Message: model.NewPointer("Message 2"), + CreateAt: &createAt, + }, + }, + LineNumber: 1, + } + errLine, err2 := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + assert.Nil(t, err2) + assert.Equal(t, 0, errLine) + assertionCount++ + AssertAllPostsCount(t, th.App, initialPostCount, assertionCount, team.Id) + }) + + t.Run("import post with hashtags", func(t *testing.T) { + // Test with hashtags + data := imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, + User: &username, + Message: model.NewPointer("Message 2 #hashtagmashupcity"), + CreateAt: &hashtagTime, + }, + }, + LineNumber: 1, + } + errLine, err2 := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + assert.Nil(t, err2) + assert.Equal(t, 0, errLine) + assertionCount++ + AssertAllPostsCount(t, th.App, initialPostCount, assertionCount, team.Id) + + posts, nErr := th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, hashtagTime) + require.NoError(t, nErr) + + require.Len(t, posts, 1, "Unexpected number of posts found.") + + post := posts[0] + postBool := post.Message != *data.Post.Message || post.CreateAt != *data.Post.CreateAt || post.UserId != user.Id + require.False(t, postBool, "Post properties not as expected") + + require.Equal(t, "#hashtagmashupcity", post.Hashtags, "Hashtags not as expected: %s", post.Hashtags) + }) + + t.Run("import post with flags", func(t *testing.T) { + // Post with flags. + flagsTime := hashtagTime + 1 + data := imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, + User: &username, + Message: model.NewPointer("Message with Favorites"), + CreateAt: &flagsTime, + FlaggedBy: &[]string{ + username, + username2, + }, + }, + }, + LineNumber: 1, + } + + errLine, err2 := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + assert.Nil(t, err2, "Expected success.") + assert.Equal(t, 0, errLine) + assertionCount++ + AssertAllPostsCount(t, th.App, initialPostCount, assertionCount, team.Id) + + // Check the post values. + posts, nErr := th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, flagsTime) + require.NoError(t, nErr) + + require.Len(t, posts, 1, "Unexpected number of posts found.") + + post := posts[0] + postBool := post.Message != *data.Post.Message || post.CreateAt != *data.Post.CreateAt || post.UserId != user.Id + require.False(t, postBool, "Post properties not as expected") + + checkPreference(t, th.App, user.Id, model.PreferenceCategoryFlaggedPost, post.Id, "true") + checkPreference(t, th.App, user2.Id, model.PreferenceCategoryFlaggedPost, post.Id, "true") + }) + + t.Run("import new post with reactions", func(t *testing.T) { + // Post with reaction. + reactionPostTime := hashtagTime + 2 + reactionTime := hashtagTime + 3 + data := imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, + User: &username, + Message: model.NewPointer("Message with reactions"), + CreateAt: &reactionPostTime, + Reactions: &[]imports.ReactionImportData{{ + User: &user2.Username, + EmojiName: model.NewPointer("+1"), + CreateAt: &reactionTime, + }, { + User: &user.Username, + EmojiName: model.NewPointer("+1"), + CreateAt: &reactionTime, + }}, + }, + }, + LineNumber: 1, + } + errLine, err2 := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + assert.Nil(t, err2, "Expected success.") + assert.Equal(t, 0, errLine) + assertionCount++ + AssertAllPostsCount(t, th.App, initialPostCount, assertionCount, team.Id) + + // Check the post values. + posts, nErr := th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, reactionPostTime) + require.NoError(t, nErr) + + require.Len(t, posts, 1, "Unexpected number of posts found.") + + post := posts[0] + postBool := post.Message != *data.Post.Message || post.CreateAt != *data.Post.CreateAt || post.UserId != user.Id || !post.HasReactions + require.False(t, postBool, "Post properties not as expected") + + reactions, nErr := th.App.Srv().Store().Reaction().GetForPost(post.Id, false) + require.NoError(t, nErr, "Can't get reaction") + + require.Len(t, reactions, 2, "Invalid number of reactions") + + // Update post with replies with reactions. + newReactionTime := reactionTime + 1 + newReplyTime := reactionPostTime + 1 + data = imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, + User: &username, + Message: model.NewPointer("Message with reactions"), + CreateAt: &reactionPostTime, + Replies: &[]imports.ReplyImportData{{ + User: &username, + Message: model.NewPointer("Message reply"), + CreateAt: &newReplyTime, + Reactions: &[]imports.ReactionImportData{{ + User: &user2.Username, + EmojiName: model.NewPointer("+1"), + CreateAt: &newReactionTime, + }}, + }}, + }, + }, + LineNumber: 1, + } + errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + assert.Nil(t, err, "Expected success.") + assert.Equal(t, 0, errLine) + // No new post created, only the reply is added. + assertionCount++ + AssertAllPostsCount(t, th.App, initialPostCount, assertionCount, team.Id) + + // Check the post values. + posts, nErr = th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, newReplyTime) + require.NoError(t, nErr) + + require.Len(t, posts, 1, "Unexpected number of posts found.") + + post = posts[0] + + reactions, nErr = th.App.Srv().Store().Reaction().GetForPost(post.Id, false) + require.NoError(t, nErr, "Can't get reaction") + + require.Len(t, reactions, 1, "Invalid number of reactions") + }) + + t.Run("import post with reactions with new replies", func(t *testing.T) { + // Post with reaction. + reactionPostTime := hashtagTime + 11 + reactionTime := hashtagTime + 12 + newReplyTime := reactionPostTime + 1 + newReactionTime := reactionTime + 1 + data := imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, + User: &username, + Message: model.NewPointer("Message with reaction"), + CreateAt: &reactionPostTime, + Reactions: &[]imports.ReactionImportData{{ + User: &user2.Username, + EmojiName: model.NewPointer("+1"), + CreateAt: &reactionTime, + }}, + Replies: &[]imports.ReplyImportData{{ + User: &username, + Message: model.NewPointer("Message reply"), + CreateAt: &newReplyTime, + Reactions: &[]imports.ReactionImportData{{ + User: &user2.Username, + EmojiName: model.NewPointer("+1"), + CreateAt: &newReactionTime, + }}, + }}, + }, + }, + LineNumber: 1, + } + errLine, err2 := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + assert.Nil(t, err2, "Expected success.") + assert.Equal(t, 0, errLine) + assertionCount += 2 + AssertAllPostsCount(t, th.App, initialPostCount, assertionCount, team.Id) + + // Check the post values. + posts, nErr := th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, reactionPostTime) + require.NoError(t, nErr) + + require.Len(t, posts, 1, "Unexpected number of posts found.") + + post := posts[0] + postBool := post.Message != *data.Post.Message || post.CreateAt != *data.Post.CreateAt || post.UserId != user.Id || !post.HasReactions + require.False(t, postBool, "Post properties not as expected") + + reactions, nErr := th.App.Srv().Store().Reaction().GetForPost(post.Id, false) + require.NoError(t, nErr, "Can't get reaction") + + require.Len(t, reactions, 1, "Invalid number of reactions") + + // Check the post values. + posts, nErr = th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, newReplyTime) + require.NoError(t, nErr) + + require.Len(t, posts, 1, "Unexpected number of posts found.") + + post = posts[0] + + reactions, nErr = th.App.Srv().Store().Reaction().GetForPost(post.Id, false) + require.NoError(t, nErr, "Can't get reaction") + + require.Len(t, reactions, 1, "Invalid number of reactions") + }) + + t.Run("import post with replies", func(t *testing.T) { + // Post with reply. + data := imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, + User: &username, + Message: model.NewPointer("Message with reply"), + CreateAt: &replyPostTime, + Replies: &[]imports.ReplyImportData{{ + User: &user2.Username, + Message: model.NewPointer("Message reply"), + CreateAt: &replyTime, + }}, + }, + }, + LineNumber: 1, + } + errLine, err2 := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + assert.Nil(t, err2, "Expected success.") + assert.Equal(t, 0, errLine) + assertionCount += 2 + AssertAllPostsCount(t, th.App, initialPostCount, assertionCount, team.Id) + + // Check the post values. + posts, nErr := th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, replyPostTime) + require.NoError(t, nErr) + + require.Len(t, posts, 1, "Unexpected number of posts found.") + + post := posts[0] + postBool := post.Message != *data.Post.Message || post.CreateAt != *data.Post.CreateAt || post.UserId != user.Id + require.False(t, postBool, "Post properties not as expected") + + // Check the reply values. + replies, nErr := th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, replyTime) + require.NoError(t, nErr) + + require.Len(t, replies, 1, "Unexpected number of posts found.") + + reply := replies[0] + replyBool := reply.Message != *(*data.Post.Replies)[0].Message || reply.CreateAt != *(*data.Post.Replies)[0].CreateAt || reply.UserId != user2.Id + require.False(t, replyBool, "Post properties not as expected") + + require.Equal(t, post.Id, reply.RootId, "Unexpected reply RootId") + }) + + t.Run("update post with replies", func(t *testing.T) { + replyPostTime2 := replyPostTime + 1 + // Create post without replies. + data := imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, User: &user2.Username, - Message: model.NewPointer("Message reply"), - CreateAt: &replyTime, - }}, + Message: model.NewPointer("Message with reply"), + CreateAt: &replyPostTime2, + }, }, - }, - LineNumber: 1, - } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) - assert.Nil(t, err, "Expected success.") - assert.Equal(t, 0, errLine) + LineNumber: 1, + } + errLine, err2 := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + assert.Nil(t, err2, "Expected success.") + assert.Equal(t, 0, errLine) + assertionCount++ + AssertAllPostsCount(t, th.App, initialPostCount, assertionCount, team.Id) - AssertAllPostsCount(t, th.App, initialPostCount, 8, team.Id) + // Update post with replies. + data = imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, + User: &user2.Username, + Message: model.NewPointer("Message with reply"), + CreateAt: &replyPostTime2, + Replies: &[]imports.ReplyImportData{{ + User: &username, + Message: model.NewPointer("Message reply"), + CreateAt: &replyTime, + }}, + }, + }, + LineNumber: 1, + } + errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + assert.Nil(t, err, "Expected success.") + assert.Equal(t, 0, errLine) + // No new post created, only the reply is added. + assertionCount++ + AssertAllPostsCount(t, th.App, initialPostCount, assertionCount, team.Id) - // Check the post values. - posts, nErr = th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, replyPostTime) - require.NoError(t, nErr) + // Create new post with replies based on the previous one. + data = imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, + User: &user2.Username, + Message: model.NewPointer("Message with reply 2"), + CreateAt: &replyPostTime2, + Replies: &[]imports.ReplyImportData{{ + User: &username, + Message: model.NewPointer("Message reply"), + CreateAt: &replyTime, + }}, + }, + }, + LineNumber: 1, + } + errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + assert.Nil(t, err, "Expected success.") + assert.Equal(t, 0, errLine) + assertionCount += 2 + AssertAllPostsCount(t, th.App, initialPostCount, assertionCount, team.Id) - require.Len(t, posts, 1, "Unexpected number of posts found.") + // Create new reply for existing post with replies. + data = imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, + User: &user2.Username, + Message: model.NewPointer("Message with reply"), + CreateAt: &replyPostTime2, + Replies: &[]imports.ReplyImportData{{ + User: &username, + Message: model.NewPointer("Message reply 2"), + CreateAt: &replyTime, + }}, + }, + }, + LineNumber: 1, + } + errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + assert.Nil(t, err, "Expected success.") + assert.Equal(t, 0, errLine) + assertionCount++ + AssertAllPostsCount(t, th.App, initialPostCount, assertionCount, team.Id) - post = posts[0] - postBool = post.Message != *data.Post.Message || post.CreateAt != *data.Post.CreateAt || post.UserId != user.Id - require.False(t, postBool, "Post properties not as expected") + // Create new reply with type and edit_at for existing post with replies. + editedReplyPostTime := hashtagTime + 6 + editedReplyTime := hashtagTime + 7 + editedReplyEditTime := hashtagTime + 8 - // Check the reply values. - replies, nErr := th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, replyTime) - require.NoError(t, nErr) + data = imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, + User: &user2.Username, + Message: model.NewPointer("Message with reply"), + CreateAt: &editedReplyPostTime, + Replies: &[]imports.ReplyImportData{{ + User: &username, + Type: model.NewPointer(model.PostTypeSystemGeneric), + Message: model.NewPointer("Message reply 3"), + CreateAt: &editedReplyTime, + EditAt: &editedReplyEditTime, + }}, + }, + }, + LineNumber: 1, + } + errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + assert.Nil(t, err, "Expected success.") + assert.Equal(t, 0, errLine) + assertionCount += 2 + AssertAllPostsCount(t, th.App, initialPostCount, assertionCount, team.Id) - require.Len(t, replies, 1, "Unexpected number of posts found.") + // Check the reply values. + replies, nErr := th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, editedReplyTime) + assert.NoError(t, nErr, "Expected success.") + reply := replies[0] + importReply := (*data.Post.Replies)[0] + replyBool := reply.Type != *importReply.Type || reply.Message != *importReply.Message || reply.CreateAt != *importReply.CreateAt || reply.EditAt != *importReply.EditAt || reply.UserId != user.Id + require.False(t, replyBool, "Post properties not as expected") + }) - reply := replies[0] - replyBool := reply.Message != *(*data.Post.Replies)[0].Message || reply.CreateAt != *(*data.Post.Replies)[0].CreateAt || reply.UserId != user2.Id - require.False(t, replyBool, "Post properties not as expected") + t.Run("import post with pinned message", func(t *testing.T) { + // Create another Team. + teamName2 := model.NewRandomTeamName() + th.App.importTeam(th.Context, &imports.TeamImportData{ + Name: &teamName2, + DisplayName: model.NewPointer("Display Name 2"), + Type: model.NewPointer("O"), + }, false) + team2, err2 := th.App.GetTeamByName(teamName2) + require.Nil(t, err2, "Failed to get team from database.") - require.Equal(t, post.Id, reply.RootId, "Unexpected reply RootId") + // Create another Channel for the another team. + th.App.importChannel(th.Context, &imports.ChannelImportData{ + Team: &teamName2, + Name: &channelName, + DisplayName: model.NewPointer("Display Name"), + Type: &chanTypeOpen, + }, false) + _, err = th.App.GetChannelByName(th.Context, channelName, team2.Id, false) + require.Nil(t, err, "Failed to get channel from database.") - // Update post with replies. - data = imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: &teamName, - Channel: &channelName, - User: &user2.Username, - Message: model.NewPointer("Message with reply"), - CreateAt: &replyPostTime, - Replies: &[]imports.ReplyImportData{{ + // Count the number of posts in the team2. + initialPostCountForTeam2, nErr := th.App.Srv().Store().Post().AnalyticsPostCount(&model.PostCountOptions{TeamId: team2.Id}) + require.NoError(t, nErr) + + // Try adding two valid posts in apply mode. + data := imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, User: &username, - Message: model.NewPointer("Message reply"), - CreateAt: &replyTime, - }}, + Message: model.NewPointer("another message"), + CreateAt: &createAt, + }, }, - }, - LineNumber: 1, - } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) - assert.Nil(t, err, "Expected success.") - assert.Equal(t, 0, errLine) - - AssertAllPostsCount(t, th.App, initialPostCount, 8, team.Id) - - // Create new post with replies based on the previous one. - data = imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: &teamName, - Channel: &channelName, - User: &user2.Username, - Message: model.NewPointer("Message with reply 2"), - CreateAt: &replyPostTime, - Replies: &[]imports.ReplyImportData{{ + LineNumber: 1, + } + data2 := imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName2, + Channel: &channelName, User: &username, - Message: model.NewPointer("Message reply"), - CreateAt: &replyTime, - }}, + Message: model.NewPointer("another message"), + CreateAt: &createAt, + }, }, - }, - LineNumber: 1, - } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) - assert.Nil(t, err, "Expected success.") - assert.Equal(t, 0, errLine) + LineNumber: 1, + } + errLine, err2 := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data, data2}, false, true) + assert.Nil(t, err2) + assert.Equal(t, 0, errLine) - AssertAllPostsCount(t, th.App, initialPostCount, 10, team.Id) - - // Create new reply for existing post with replies. - data = imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: &teamName, - Channel: &channelName, - User: &user2.Username, - Message: model.NewPointer("Message with reply"), - CreateAt: &replyPostTime, - Replies: &[]imports.ReplyImportData{{ - User: &username, - Message: model.NewPointer("Message reply 2"), - CreateAt: &replyTime, - }}, + // Create a pinned message. + data = imports.LineImportWorkerData{ + LineImportData: imports.LineImportData{ + Post: &imports.PostImportData{ + Team: &teamName, + Channel: &channelName, + User: &user2.Username, + Message: model.NewPointer("Pinned Message"), + CreateAt: model.NewPointer(model.GetMillis()), + IsPinned: model.NewPointer(true), + }, }, - }, - LineNumber: 1, - } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) - assert.Nil(t, err, "Expected success.") - assert.Equal(t, 0, errLine) + LineNumber: 1, + } + errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + require.Nil(t, err) + require.Equal(t, 0, errLine) - AssertAllPostsCount(t, th.App, initialPostCount, 11, team.Id) + resultPosts, nErr := th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, *data.Post.CreateAt) + require.NoError(t, nErr, "Expected success.") + // Should be one post only created at this time. + require.Equal(t, 1, len(resultPosts)) + resultPost := resultPosts[0] + require.True(t, resultPost.IsPinned, "This post should be pinned.") - // Create new reply with type and edit_at for existing post with replies. - - // Post with reply. - editedReplyPostTime := hashtagTime + 6 - editedReplyTime := hashtagTime + 7 - editedReplyEditTime := hashtagTime + 8 - - data = imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: &teamName, - Channel: &channelName, - User: &user2.Username, - Message: model.NewPointer("Message with reply"), - CreateAt: &editedReplyPostTime, - Replies: &[]imports.ReplyImportData{{ - User: &username, - Type: model.NewPointer(model.PostTypeSystemGeneric), - Message: model.NewPointer("Message reply 3"), - CreateAt: &editedReplyTime, - EditAt: &editedReplyEditTime, - }}, - }, - }, - LineNumber: 1, - } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) - assert.Nil(t, err, "Expected success.") - assert.Equal(t, 0, errLine) - - AssertAllPostsCount(t, th.App, initialPostCount, 13, team.Id) - - // Check the reply values. - replies, nErr = th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, editedReplyTime) - assert.NoError(t, nErr, "Expected success.") - reply = replies[0] - importReply := (*data.Post.Replies)[0] - replyBool = reply.Type != *importReply.Type || reply.Message != *importReply.Message || reply.CreateAt != *importReply.CreateAt || reply.EditAt != *importReply.EditAt || reply.UserId != user.Id - require.False(t, replyBool, "Post properties not as expected") - - // Create another Team. - teamName2 := model.NewRandomTeamName() - th.App.importTeam(th.Context, &imports.TeamImportData{ - Name: &teamName2, - DisplayName: model.NewPointer("Display Name 2"), - Type: model.NewPointer("O"), - }, false) - team2, err := th.App.GetTeamByName(teamName2) - require.Nil(t, err, "Failed to get team from database.") - - // Create another Channel for the another team. - th.App.importChannel(th.Context, &imports.ChannelImportData{ - Team: &teamName2, - Name: &channelName, - DisplayName: model.NewPointer("Display Name"), - Type: &chanTypeOpen, - }, false) - _, err = th.App.GetChannelByName(th.Context, channelName, team2.Id, false) - require.Nil(t, err, "Failed to get channel from database.") - - // Count the number of posts in the team2. - initialPostCountForTeam2, nErr := th.App.Srv().Store().Post().AnalyticsPostCount(&model.PostCountOptions{TeamId: team2.Id}) - require.NoError(t, nErr) - - // Try adding two valid posts in apply mode. - data = imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: &teamName, - Channel: &channelName, - User: &username, - Message: model.NewPointer("another message"), - CreateAt: &createAt, - }, - }, - LineNumber: 1, - } - data2 := imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: &teamName2, - Channel: &channelName, - User: &username, - Message: model.NewPointer("another message"), - CreateAt: &createAt, - }, - }, - LineNumber: 1, - } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data, data2}, false, true) - assert.Nil(t, err) - assert.Equal(t, 0, errLine) - - // Create a pinned message. - data = imports.LineImportWorkerData{ - LineImportData: imports.LineImportData{ - Post: &imports.PostImportData{ - Team: &teamName, - Channel: &channelName, - User: &user2.Username, - Message: model.NewPointer("Pinned Message"), - CreateAt: model.NewPointer(model.GetMillis()), - IsPinned: model.NewPointer(true), - }, - }, - LineNumber: 1, - } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) - require.Nil(t, err) - require.Equal(t, 0, errLine) - - resultPosts, nErr := th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, *data.Post.CreateAt) - require.NoError(t, nErr, "Expected success.") - // Should be one post only created at this time. - require.Equal(t, 1, len(resultPosts)) - resultPost := resultPosts[0] - require.True(t, resultPost.IsPinned, "This post should be pinned.") - - // Posts should be added to the right team - AssertAllPostsCount(t, th.App, initialPostCountForTeam2, 1, team2.Id) - AssertAllPostsCount(t, th.App, initialPostCount, 15, team.Id) + // Posts should be added to the right team + AssertAllPostsCount(t, th.App, initialPostCountForTeam2, 1, team2.Id) + assertionCount += 2 + AssertAllPostsCount(t, th.App, initialPostCount, assertionCount, team.Id) + }) t.Run("Importing a post with a reply both pinned", func(t *testing.T) { // Create a thread. importCreate := time.Now().Add(-1 * time.Minute).UnixMilli() replyCreate := time.Now().Add(-30 * time.Second).UnixMilli() - data = imports.LineImportWorkerData{ + data := imports.LineImportWorkerData{ LineImportData: imports.LineImportData{ Post: &imports.PostImportData{ Team: &teamName, @@ -2608,7 +2782,7 @@ func TestImportimportMultiplePostLines(t *testing.T) { _, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) require.Nil(t, err) - resultPosts, nErr = th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, importCreate) + resultPosts, nErr := th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, importCreate) require.NoError(t, nErr) require.Equal(t, 1, len(resultPosts)) require.True(t, resultPosts[0].IsPinned) @@ -2622,7 +2796,7 @@ func TestImportimportMultiplePostLines(t *testing.T) { t.Run("Importing a post with a thread", func(t *testing.T) { // Create a thread. importCreate := time.Now().Add(-1 * time.Minute).UnixMilli() - data = imports.LineImportWorkerData{ + data := imports.LineImportWorkerData{ LineImportData: imports.LineImportData{ Post: &imports.PostImportData{ Team: &teamName, @@ -2647,16 +2821,16 @@ func TestImportimportMultiplePostLines(t *testing.T) { LineNumber: 1, } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) - require.Nil(t, err) + errLine, err2 := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + require.Nil(t, err2) require.Equal(t, 0, errLine) - resultPosts, nErr = th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, importCreate) + resultPosts, nErr := th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, importCreate) require.NoError(t, nErr) require.Equal(t, 1, len(resultPosts)) - followers, err := th.App.Srv().Store().Thread().GetThreadFollowers(resultPosts[0].Id, true) - require.NoError(t, err) + followers, nErr := th.App.Srv().Store().Thread().GetThreadFollowers(resultPosts[0].Id, true) + require.NoError(t, nErr) assert.ElementsMatch(t, []string{user.Id, user2.Id}, followers) }) @@ -2664,7 +2838,7 @@ func TestImportimportMultiplePostLines(t *testing.T) { t.Run("Importing a post with a non existent follower", func(t *testing.T) { // Create a thread. importCreate := time.Now().Add(-1 * time.Minute).UnixMilli() - data = imports.LineImportWorkerData{ + data := imports.LineImportWorkerData{ LineImportData: imports.LineImportData{ Post: &imports.PostImportData{ Team: &teamName, @@ -2688,14 +2862,14 @@ func TestImportimportMultiplePostLines(t *testing.T) { LineNumber: 1, } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + errLine, err := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) require.NotNil(t, err) require.Equal(t, 1, errLine) }) t.Run("Importing a post with a non existent follower", func(t *testing.T) { importCreate := time.Now().Add(-1 * time.Minute).UnixMilli() - data = imports.LineImportWorkerData{ + data := imports.LineImportWorkerData{ LineImportData: imports.LineImportData{ Post: &imports.PostImportData{ Team: &teamName, @@ -2719,14 +2893,14 @@ func TestImportimportMultiplePostLines(t *testing.T) { LineNumber: 1, } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + errLine, err := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) require.NotNil(t, err) require.Equal(t, 1, errLine) }) t.Run("Importing a post with new followers", func(t *testing.T) { importCreate := time.Now().Add(-5 * time.Minute).UnixMilli() - data = imports.LineImportWorkerData{ + data := imports.LineImportWorkerData{ LineImportData: imports.LineImportData{ Post: &imports.PostImportData{ Team: &teamName, @@ -2739,11 +2913,11 @@ func TestImportimportMultiplePostLines(t *testing.T) { LineNumber: 1, } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + errLine, err := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) require.Nil(t, err) require.Equal(t, 0, errLine) - resultPosts, nErr = th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, importCreate) + resultPosts, nErr := th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, importCreate) require.NoError(t, nErr) require.Equal(t, 1, len(resultPosts)) @@ -2773,8 +2947,8 @@ func TestImportimportMultiplePostLines(t *testing.T) { require.Nil(t, err) require.Equal(t, 0, errLine) - followers, err := th.App.Srv().Store().Thread().GetThreadFollowers(resultPosts[0].Id, true) - require.NoError(t, err) + followers, nErr := th.App.Srv().Store().Thread().GetThreadFollowers(resultPosts[0].Id, true) + require.NoError(t, nErr) assert.ElementsMatch(t, []string{user.Id}, followers) }) @@ -2782,7 +2956,7 @@ func TestImportimportMultiplePostLines(t *testing.T) { t.Run("Importing a post that someone flagged", func(t *testing.T) { // Create a thread. importCreate := time.Now().Add(-1 * time.Minute).UnixMilli() - data = imports.LineImportWorkerData{ + data := imports.LineImportWorkerData{ LineImportData: imports.LineImportData{ Post: &imports.PostImportData{ Team: &teamName, @@ -2796,16 +2970,16 @@ func TestImportimportMultiplePostLines(t *testing.T) { LineNumber: 1, } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + errLine, err := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) require.Nil(t, err) require.Equal(t, 0, errLine) - resultPosts, nErr = th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, importCreate) + resultPosts, nErr := th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, importCreate) require.NoError(t, nErr) require.Equal(t, 1, len(resultPosts)) - pref, err := th.App.ch.srv.Store().Preference().GetCategoryAndName(model.PreferenceCategoryFlaggedPost, resultPosts[0].Id) - require.NoError(t, err) + pref, nErr := th.App.ch.srv.Store().Preference().GetCategoryAndName(model.PreferenceCategoryFlaggedPost, resultPosts[0].Id) + require.NoError(t, nErr) require.Len(t, pref, 1) assert.Equal(t, user.Id, pref[0].UserId) @@ -2815,7 +2989,7 @@ func TestImportimportMultiplePostLines(t *testing.T) { // Create a thread. importCreate := time.Now().Add(-1 * time.Minute).UnixMilli() replyCreate := time.Now().Add(-30 * time.Second).UnixMilli() - data = imports.LineImportWorkerData{ + data := imports.LineImportWorkerData{ LineImportData: imports.LineImportData{ Post: &imports.PostImportData{ Team: &teamName, @@ -2834,16 +3008,16 @@ func TestImportimportMultiplePostLines(t *testing.T) { LineNumber: 1, } - errLine, err = th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) + errLine, err := th.App.importMultiplePostLines(th.Context, []imports.LineImportWorkerData{data}, false, true) require.Nil(t, err) require.Equal(t, 0, errLine) - resultPosts, nErr = th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, replyCreate) + resultPosts, nErr := th.App.Srv().Store().Post().GetPostsCreatedAt(channel.Id, replyCreate) require.NoError(t, nErr) require.Equal(t, 1, len(resultPosts)) - pref, err := th.App.ch.srv.Store().Preference().GetCategoryAndName(model.PreferenceCategoryFlaggedPost, resultPosts[0].Id) - require.NoError(t, err) + pref, nErr := th.App.ch.srv.Store().Preference().GetCategoryAndName(model.PreferenceCategoryFlaggedPost, resultPosts[0].Id) + require.NoError(t, nErr) require.Len(t, pref, 1) assert.Equal(t, user2.Id, pref[0].UserId)