From 097d32f409fb345ea12af1daab4dd524db3c6970 Mon Sep 17 00:00:00 2001 From: Ashish Bhate Date: Tue, 26 Oct 2021 18:50:02 +0530 Subject: [PATCH] MM-38445: Set isFollowing to false only when explicitly unfollowed (#18740) Summary Set post.IsFollowing to false only if the post is explicitly unfollowed. Otherwise leave it as nil. Ticket Link https://mattermost.atlassian.net/browse/MM-38445 --- store/sqlstore/post_store.go | 8 ++-- store/storetest/post_store.go | 76 ++++++++++++++++++++++++++--------- 2 files changed, 61 insertions(+), 23 deletions(-) diff --git a/store/sqlstore/post_store.go b/store/sqlstore/post_store.go index 19176ebf99..cafca3d666 100644 --- a/store/sqlstore/post_store.go +++ b/store/sqlstore/post_store.go @@ -528,7 +528,7 @@ func (s *SqlPostStore) getPostWithCollapsedThreads(id, userID string, extended b "COALESCE(Threads.ReplyCount, 0) as ThreadReplyCount", "COALESCE(Threads.LastReplyAt, 0) as LastReplyAt", "COALESCE(Threads.Participants, '[]') as ThreadParticipants", - "COALESCE(ThreadMemberships.Following, false) as IsFollowing", + "ThreadMemberships.Following as IsFollowing", ) var post postWithExtra @@ -879,7 +879,7 @@ func (s *SqlPostStore) getPostsCollapsedThreads(options model.GetPostsOptions) ( "COALESCE(Threads.ReplyCount, 0) as ThreadReplyCount", "COALESCE(Threads.LastReplyAt, 0) as LastReplyAt", "COALESCE(Threads.Participants, '[]') as ThreadParticipants", - "COALESCE(ThreadMemberships.Following, false) as IsFollowing", + "ThreadMemberships.Following as IsFollowing", ) var posts []*postWithExtra offset := options.PerPage * options.Page @@ -965,7 +965,7 @@ func (s *SqlPostStore) getPostsSinceCollapsedThreads(options model.GetPostsSince "COALESCE(Threads.ReplyCount, 0) as ThreadReplyCount", "COALESCE(Threads.LastReplyAt, 0) as LastReplyAt", "COALESCE(Threads.Participants, '[]') as ThreadParticipants", - "COALESCE(ThreadMemberships.Following, false) as IsFollowing", + "ThreadMemberships.Following as IsFollowing", ) var posts []*postWithExtra @@ -1181,7 +1181,7 @@ func (s *SqlPostStore) getPostsAround(before bool, options model.GetPostsOptions "COALESCE(Threads.ReplyCount, 0) as ThreadReplyCount", "COALESCE(Threads.LastReplyAt, 0) as LastReplyAt", "COALESCE(Threads.Participants, '[]') as ThreadParticipants", - "COALESCE(ThreadMemberships.Following, false) as IsFollowing", + "ThreadMemberships.Following as IsFollowing", ) } query := s.getQueryBuilder().Select(columns...) diff --git a/store/storetest/post_store.go b/store/storetest/post_store.go index 43f9d4f4cd..732771ea31 100644 --- a/store/storetest/post_store.go +++ b/store/storetest/post_store.go @@ -502,26 +502,64 @@ func testPostStoreGet(t *testing.T, ss store.Store) { } func testPostStoreGetForThread(t *testing.T, ss store.Store) { - o1 := &model.Post{ChannelId: model.NewId(), UserId: model.NewId(), Message: NewTestId()} - o1, err := ss.Post().Save(o1) - require.NoError(t, err) - _, err = ss.Post().Save(&model.Post{ChannelId: o1.ChannelId, UserId: model.NewId(), Message: NewTestId(), RootId: o1.Id}) - require.NoError(t, err) + t.Run("Post thread is followed", func(t *testing.T) { + o1 := &model.Post{ChannelId: model.NewId(), UserId: model.NewId(), Message: NewTestId()} + o1, err := ss.Post().Save(o1) + require.NoError(t, err) + _, err = ss.Post().Save(&model.Post{ChannelId: o1.ChannelId, UserId: model.NewId(), Message: NewTestId(), RootId: o1.Id}) + require.NoError(t, err) - threadMembership := &model.ThreadMembership{ - PostId: o1.Id, - UserId: o1.UserId, - Following: true, - LastViewed: 0, - LastUpdated: 0, - UnreadMentions: 0, - } - _, err = ss.Thread().SaveMembership(threadMembership) - require.NoError(t, err) - r1, err := ss.Post().Get(context.Background(), o1.Id, false, true, false, o1.UserId) - require.NoError(t, err) - require.Equal(t, r1.Posts[o1.Id].CreateAt, o1.CreateAt, "invalid returned post") - require.True(t, *r1.Posts[o1.Id].IsFollowing) + threadMembership := &model.ThreadMembership{ + PostId: o1.Id, + UserId: o1.UserId, + Following: true, + LastViewed: 0, + LastUpdated: 0, + UnreadMentions: 0, + } + _, err = ss.Thread().SaveMembership(threadMembership) + require.NoError(t, err) + r1, err := ss.Post().Get(context.Background(), o1.Id, false, true, false, o1.UserId) + require.NoError(t, err) + require.Equal(t, r1.Posts[o1.Id].CreateAt, o1.CreateAt, "invalid returned post") + require.True(t, *r1.Posts[o1.Id].IsFollowing) + }) + + t.Run("Post thread is explicitly not followed", func(t *testing.T) { + o1 := &model.Post{ChannelId: model.NewId(), UserId: model.NewId(), Message: NewTestId()} + o1, err := ss.Post().Save(o1) + require.NoError(t, err) + _, err = ss.Post().Save(&model.Post{ChannelId: o1.ChannelId, UserId: model.NewId(), Message: NewTestId(), RootId: o1.Id}) + require.NoError(t, err) + + threadMembership := &model.ThreadMembership{ + PostId: o1.Id, + UserId: o1.UserId, + Following: false, + LastViewed: 0, + LastUpdated: 0, + UnreadMentions: 0, + } + _, err = ss.Thread().SaveMembership(threadMembership) + require.NoError(t, err) + r1, err := ss.Post().Get(context.Background(), o1.Id, false, true, false, o1.UserId) + require.NoError(t, err) + require.Equal(t, r1.Posts[o1.Id].CreateAt, o1.CreateAt, "invalid returned post") + require.False(t, *r1.Posts[o1.Id].IsFollowing) + }) + + t.Run("Post threadmembership does not exist", func(t *testing.T) { + o1 := &model.Post{ChannelId: model.NewId(), UserId: model.NewId(), Message: NewTestId()} + o1, err := ss.Post().Save(o1) + require.NoError(t, err) + _, err = ss.Post().Save(&model.Post{ChannelId: o1.ChannelId, UserId: model.NewId(), Message: NewTestId(), RootId: o1.Id}) + require.NoError(t, err) + + r1, err := ss.Post().Get(context.Background(), o1.Id, false, true, false, o1.UserId) + require.NoError(t, err) + require.Equal(t, r1.Posts[o1.Id].CreateAt, o1.CreateAt, "invalid returned post") + require.Nil(t, r1.Posts[o1.Id].IsFollowing) + }) } func testPostStoreGetSingle(t *testing.T, ss store.Store) {