From dc59929206a2fc24e931e25fe16856759db96372 Mon Sep 17 00:00:00 2001 From: Harshil Sharma <18575143+harshilsharma63@users.noreply.github.com> Date: Thu, 28 Jul 2022 03:04:52 +0530 Subject: [PATCH] Converted synthetic membership to natuaral for board's channel members (#3390) * Converted synthetic membership to natuaral if needed * Added unit tests for AddMemberToBoard * Update server/app/boards_test.go Co-authored-by: Miguel de la Cruz * Fix test Co-authored-by: Miguel de la Cruz Co-authored-by: Mattermod --- server/app/boards.go | 2 +- server/app/boards_test.go | 107 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 server/app/boards_test.go diff --git a/server/app/boards.go b/server/app/boards.go index 1e6b34fe0..a66686b1f 100644 --- a/server/app/boards.go +++ b/server/app/boards.go @@ -326,7 +326,7 @@ func (a *App) AddMemberToBoard(member *model.BoardMember) (*model.BoardMember, e return nil, err } - if existingMembership != nil { + if existingMembership != nil && !existingMembership.Synthetic { return existingMembership, nil } diff --git a/server/app/boards_test.go b/server/app/boards_test.go new file mode 100644 index 000000000..0b70dda1b --- /dev/null +++ b/server/app/boards_test.go @@ -0,0 +1,107 @@ +package app + +import ( + "testing" + + "github.com/mattermost/focalboard/server/model" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestAddMemberToBoard(t *testing.T) { + th, tearDown := SetupTestHelper(t) + defer tearDown() + + t.Run("base case", func(t *testing.T) { + const boardID = "board_id_1" + const userID = "user_id_1" + + boardMember := &model.BoardMember{ + BoardID: boardID, + UserID: userID, + SchemeEditor: true, + } + + th.Store.EXPECT().GetBoard(boardID).Return(&model.Board{ + TeamID: "team_id_1", + }, nil) + + th.Store.EXPECT().GetMemberForBoard(boardID, userID).Return(nil, nil) + + th.Store.EXPECT().SaveMember(mock.MatchedBy(func(i interface{}) bool { + p := i.(*model.BoardMember) + return p.BoardID == boardID && p.UserID == userID + })).Return(&model.BoardMember{ + BoardID: boardID, + }, nil) + + // for WS change broadcast + th.Store.EXPECT().GetMembersForBoard(boardID).Return([]*model.BoardMember{}, nil) + + addedBoardMember, err := th.App.AddMemberToBoard(boardMember) + require.NoError(t, err) + require.Equal(t, boardID, addedBoardMember.BoardID) + }) + + t.Run("return existing non-synthetic membership if any", func(t *testing.T) { + const boardID = "board_id_1" + const userID = "user_id_1" + + boardMember := &model.BoardMember{ + BoardID: boardID, + UserID: userID, + SchemeEditor: true, + } + + th.Store.EXPECT().GetBoard(boardID).Return(&model.Board{ + TeamID: "team_id_1", + }, nil) + + th.Store.EXPECT().GetMemberForBoard(boardID, userID).Return(&model.BoardMember{ + UserID: userID, + BoardID: boardID, + Synthetic: false, + }, nil) + + addedBoardMember, err := th.App.AddMemberToBoard(boardMember) + require.NoError(t, err) + require.Equal(t, boardID, addedBoardMember.BoardID) + }) + + t.Run("should convert synthetic membership into natural membership", func(t *testing.T) { + const boardID = "board_id_1" + const userID = "user_id_1" + + boardMember := &model.BoardMember{ + BoardID: boardID, + UserID: userID, + SchemeEditor: true, + } + + th.Store.EXPECT().GetBoard(boardID).Return(&model.Board{ + TeamID: "team_id_1", + }, nil) + + th.Store.EXPECT().GetMemberForBoard(boardID, userID).Return(&model.BoardMember{ + UserID: userID, + BoardID: boardID, + Synthetic: true, + }, nil) + + th.Store.EXPECT().SaveMember(mock.MatchedBy(func(i interface{}) bool { + p := i.(*model.BoardMember) + return p.BoardID == boardID && p.UserID == userID + })).Return(&model.BoardMember{ + UserID: userID, + BoardID: boardID, + Synthetic: false, + }, nil) + + // for WS change broadcast + th.Store.EXPECT().GetMembersForBoard(boardID).Return([]*model.BoardMember{}, nil) + + addedBoardMember, err := th.App.AddMemberToBoard(boardMember) + require.NoError(t, err) + require.Equal(t, boardID, addedBoardMember.BoardID) + }) +}