Skip to content

Commit 8d3caa9

Browse files
committed
fix: Dbfake delete group member fixed
1 parent 2fce66a commit 8d3caa9

File tree

4 files changed

+86
-9
lines changed

4 files changed

+86
-9
lines changed

coderd/database/dbfake/databasefake.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3905,13 +3905,22 @@ func (q *fakeQuerier) DeleteGroupMembersByOrgAndUser(_ context.Context, arg data
39053905

39063906
newMembers := q.groupMembers[:0]
39073907
for _, member := range q.groupMembers {
3908-
if member.UserID == arg.UserID {
3908+
if member.UserID != arg.UserID {
3909+
// Do not delete the other members
3910+
newMembers = append(newMembers, member)
3911+
} else if member.UserID == arg.UserID {
3912+
// We only want to delete from groups in the organization in the args.
39093913
for _, group := range q.groups {
3910-
if group.ID == member.GroupID && group.OrganizationID == arg.OrganizationID {
3911-
continue
3914+
// Find the group that the member is apartof.
3915+
if group.ID == member.GroupID {
3916+
// Only add back the member if the organization ID does not match
3917+
// the arg organization ID. Since the arg is saying which
3918+
// org to delete.
3919+
if group.OrganizationID != arg.OrganizationID {
3920+
newMembers = append(newMembers, member)
3921+
}
3922+
break
39123923
}
3913-
3914-
newMembers = append(newMembers, member)
39153924
}
39163925
}
39173926
}

coderd/database/queries.sql.go

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/groupmembers.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ FROM
3737
DELETE FROM
3838
group_members
3939
WHERE
40-
group_members.user_id = @user_id
41-
AND group_id = ANY(SELECT id FROM groups WHERE organization_id = @organization_id);
40+
group_members.user_id = @user_id
41+
AND group_id = ANY(SELECT id FROM groups WHERE organization_id = @organization_id);
4242

4343
-- name: InsertGroupMember :exec
4444
INSERT INTO

enterprise/coderd/userauth_test.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77
"net/http"
88
"testing"
99

10+
"github.com/google/uuid"
11+
1012
"github.com/golang-jwt/jwt"
1113
"github.com/stretchr/testify/assert"
1214
"github.com/stretchr/testify/require"
@@ -66,6 +68,72 @@ func TestUserOIDC(t *testing.T) {
6668
require.NoError(t, err)
6769
require.Len(t, group.Members, 1)
6870
})
71+
t.Run("AddThenRemove", func(t *testing.T) {
72+
t.Parallel()
73+
74+
ctx, _ := testutil.Context(t)
75+
conf := coderdtest.NewOIDCConfig(t, "")
76+
77+
config := conf.OIDCConfig(t, jwt.MapClaims{})
78+
config.AllowSignups = true
79+
80+
client := coderdenttest.New(t, &coderdenttest.Options{
81+
Options: &coderdtest.Options{
82+
OIDCConfig: config,
83+
},
84+
})
85+
firstUser := coderdtest.CreateFirstUser(t, client)
86+
coderdenttest.AddLicense(t, client, coderdenttest.LicenseOptions{
87+
AllFeatures: true,
88+
})
89+
90+
// Add some extra users/groups that should be asserted after.
91+
// Adding this user as there was a bug that removing 1 user removed
92+
// all users from the group.
93+
_, extra := coderdtest.CreateAnotherUser(t, client, firstUser.OrganizationID)
94+
groupName := "bingbong"
95+
group, err := client.CreateGroup(ctx, firstUser.OrganizationID, codersdk.CreateGroupRequest{
96+
Name: groupName,
97+
})
98+
require.NoError(t, err, "create group")
99+
100+
group, err = client.PatchGroup(ctx, group.ID, codersdk.PatchGroupRequest{
101+
AddUsers: []string{
102+
firstUser.UserID.String(),
103+
extra.ID.String(),
104+
},
105+
})
106+
require.NoError(t, err, "patch group")
107+
require.Len(t, group.Members, 2, "expect both members")
108+
109+
// Now add OIDC user into the group
110+
resp := oidcCallback(t, client, conf.EncodeClaims(t, jwt.MapClaims{
111+
"email": "colin@coder.com",
112+
"groups": []string{groupName},
113+
}))
114+
assert.Equal(t, http.StatusTemporaryRedirect, resp.StatusCode)
115+
116+
group, err = client.Group(ctx, group.ID)
117+
require.NoError(t, err)
118+
require.Len(t, group.Members, 3)
119+
120+
// Login to remove the OIDC user from the group
121+
resp = oidcCallback(t, client, conf.EncodeClaims(t, jwt.MapClaims{
122+
"email": "colin@coder.com",
123+
"groups": []string{},
124+
}))
125+
assert.Equal(t, http.StatusTemporaryRedirect, resp.StatusCode)
126+
127+
group, err = client.Group(ctx, group.ID)
128+
require.NoError(t, err)
129+
require.Len(t, group.Members, 2)
130+
var expected []uuid.UUID
131+
for _, mem := range group.Members {
132+
expected = append(expected, mem.ID)
133+
}
134+
require.ElementsMatchf(t, expected, []uuid.UUID{firstUser.UserID, extra.ID}, "expected members")
135+
})
136+
69137
t.Run("NoneMatch", func(t *testing.T) {
70138
t.Parallel()
71139

0 commit comments

Comments
 (0)