From d855916c6e2310dbb5cbd99b89fe64a64790f511 Mon Sep 17 00:00:00 2001 From: Ben Cooke Date: Fri, 4 Nov 2022 13:10:26 -0400 Subject: [PATCH] [MM-48049] Including users who were removed from group in not_in_group response (#21559) Automatic Merge --- api4/user_test.go | 41 ++++++++++++++++++++++++++++++++++ store/sqlstore/user_store.go | 2 +- store/storetest/group_store.go | 5 ++--- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/api4/user_test.go b/api4/user_test.go index ccfcee0be2..db15a06604 100644 --- a/api4/user_test.go +++ b/api4/user_test.go @@ -1215,6 +1215,47 @@ func TestSearchUsers(t *testing.T) { require.NoError(t, err) require.Equal(t, users[0].Id, th.BasicUser.Id) }) + + id = model.NewId() + group, appErr = th.App.CreateGroup(&model.Group{ + DisplayName: "dn-foo_" + id, + Name: model.NewString("name" + id), + Source: model.GroupSourceCustom, + Description: "description_" + id, + RemoteId: model.NewString(model.NewId()), + }) + assert.Nil(t, appErr) + + th.App.Srv().SetLicense(model.NewTestLicenseSKU(model.LicenseShortSkuProfessional, "ldap")) + + search = &model.UserSearch{Term: th.BasicUser.Username, NotInGroupId: group.Id} + t.Run("Returns users not in group", func(t *testing.T) { + users, _, err = th.Client.SearchUsers(search) + require.NoError(t, err) + require.Equal(t, users[0].Id, th.BasicUser.Id) + }) + + _, appErr = th.App.UpsertGroupMember(group.Id, th.BasicUser.Id) + assert.Nil(t, appErr) + + t.Run("Returns empty list for not in group", func(t *testing.T) { + users, _, err = th.Client.SearchUsers(search) + require.NoError(t, err) + assert.Len(t, users, 0) + }) + + members := &model.GroupModifyMembers{ + UserIds: []string{th.BasicUser.Id}, + } + + _, _, delErr := th.Client.DeleteGroupMembers(group.Id, members) + require.NoError(t, delErr) + + t.Run("Returns user not in group after they were deleted from group", func(t *testing.T) { + users, _, err = th.Client.SearchUsers(search) + require.NoError(t, err) + require.Equal(t, users[0].Id, th.BasicUser.Id) + }) } func findUserInList(id string, users []*model.User) bool { //nolint:unused diff --git a/store/sqlstore/user_store.go b/store/sqlstore/user_store.go index 9eb8535d90..a11977ba82 100644 --- a/store/sqlstore/user_store.go +++ b/store/sqlstore/user_store.go @@ -1527,7 +1527,7 @@ func (us SqlUserStore) SearchInGroup(groupID string, term string, options *model func (us SqlUserStore) SearchNotInGroup(groupID string, term string, options *model.UserSearchOptions) ([]*model.User, error) { query := us.usersQuery. LeftJoin("GroupMembers gm ON ( gm.UserId = u.Id AND gm.GroupId = ? )", groupID). - Where("gm.UserId IS NULL"). + Where("(gm.UserId IS NULL OR gm.deleteat != 0)"). OrderBy("Username ASC"). Limit(uint64(options.Limit)) diff --git a/store/storetest/group_store.go b/store/storetest/group_store.go index 8696e15bf1..dbd292f1d3 100644 --- a/store/storetest/group_store.go +++ b/store/storetest/group_store.go @@ -844,14 +844,13 @@ func testGroupGetMemberUsersPage(t *testing.T, ss store.Store) { groupMembers, err = ss.Group().GetMemberUsersPage(group.Id, 0, 2, nil) require.NoError(t, err) require.Equal(t, 2, len(groupMembers)) - require.Equal(t, user3.Id, groupMembers[0].Id) - require.Equal(t, user2.Id, groupMembers[1].Id) + require.ElementsMatch(t, []*model.User{user2, user3}, groupMembers) // Check page 2 groupMembers, err = ss.Group().GetMemberUsersPage(group.Id, 1, 2, nil) require.NoError(t, err) require.Equal(t, 1, len(groupMembers)) - require.Equal(t, user1.Id, groupMembers[0].Id) + require.ElementsMatch(t, []*model.User{user1}, groupMembers) // Check madeup id groupMembers, err = ss.Group().GetMemberUsersPage(model.NewId(), 0, 100, nil)