Skip to content

Commit bf13f37

Browse files
committed
add patch group endpoint w/ tests
1 parent b26cd97 commit bf13f37

File tree

5 files changed

+78
-25
lines changed

5 files changed

+78
-25
lines changed

coderd/database/databasefake/databasefake.go

Lines changed: 60 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,13 @@ func New() database.Store {
2424
return &fakeQuerier{
2525
mutex: &sync.RWMutex{},
2626
data: &data{
27-
apiKeys: make([]database.APIKey, 0),
28-
agentStats: make([]database.AgentStat, 0),
29-
organizationMembers: make([]database.OrganizationMember, 0),
30-
organizations: make([]database.Organization, 0),
31-
users: make([]database.User, 0),
32-
27+
apiKeys: make([]database.APIKey, 0),
28+
agentStats: make([]database.AgentStat, 0),
29+
organizationMembers: make([]database.OrganizationMember, 0),
30+
organizations: make([]database.Organization, 0),
31+
users: make([]database.User, 0),
32+
groups: make([]database.Group, 0),
33+
groupMembers: make([]database.GroupMember, 0),
3334
auditLogs: make([]database.AuditLog, 0),
3435
files: make([]database.File, 0),
3536
gitSSHKey: make([]database.GitSSHKey, 0),
@@ -86,6 +87,7 @@ type data struct {
8687
files []database.File
8788
gitSSHKey []database.GitSSHKey
8889
groups []database.Group
90+
groupMembers []database.GroupMember
8991
parameterSchemas []database.ParameterSchema
9092
parameterValues []database.ParameterValue
9193
provisionerDaemons []database.ProvisionerDaemon
@@ -2419,19 +2421,42 @@ func (q *fakeQuerier) UpdateGitSSHKey(_ context.Context, arg database.UpdateGitS
24192421
return sql.ErrNoRows
24202422
}
24212423

2422-
func (q *fakeQuerier) InsertGroupMember(ctx context.Context, arg database.InsertGroupMemberParams) error {
2423-
panic("not implemented")
2424+
func (q *fakeQuerier) InsertGroupMember(_ context.Context, arg database.InsertGroupMemberParams) error {
2425+
q.mutex.Lock()
2426+
defer q.mutex.Unlock()
2427+
2428+
q.groupMembers = append(q.groupMembers, database.GroupMember{
2429+
GroupID: arg.GroupID,
2430+
UserID: arg.UserID,
2431+
})
2432+
24242433
return nil
24252434
}
24262435

2427-
func (q *fakeQuerier) DeleteGroupMember(ctx context.Context, userID uuid.UUID) error {
2428-
panic("not implemented")
2436+
func (q *fakeQuerier) DeleteGroupMember(_ context.Context, userID uuid.UUID) error {
2437+
q.mutex.Lock()
2438+
defer q.mutex.Unlock()
2439+
2440+
for i, member := range q.groupMembers {
2441+
if member.UserID == userID {
2442+
q.groupMembers = append(q.groupMembers[:i], q.groupMembers[i+1:]...)
2443+
}
2444+
}
24292445
return nil
24302446
}
24312447

2432-
func (q *fakeQuerier) UpdateGroupByID(ctx context.Context, arg database.UpdateGroupByIDParams) (database.Group, error) {
2433-
panic("not implemented")
2434-
return database.Group{}, nil
2448+
func (q *fakeQuerier) UpdateGroupByID(_ context.Context, arg database.UpdateGroupByIDParams) (database.Group, error) {
2449+
q.mutex.Lock()
2450+
defer q.mutex.Unlock()
2451+
2452+
for i, group := range q.groups {
2453+
if group.ID == arg.ID {
2454+
group.Name = arg.Name
2455+
q.groups[i] = group
2456+
return group, nil
2457+
}
2458+
}
2459+
return database.Group{}, sql.ErrNoRows
24352460
}
24362461

24372462
func (q *fakeQuerier) DeleteGitSSHKey(_ context.Context, userID uuid.UUID) error {
@@ -2741,7 +2766,28 @@ func (q *fakeQuerier) GetUserGroups(_ context.Context, userID uuid.UUID) ([]data
27412766
}
27422767

27432768
func (q *fakeQuerier) GetGroupMembers(_ context.Context, groupID uuid.UUID) ([]database.User, error) {
2744-
panic("not implemented")
2769+
q.mutex.RLock()
2770+
defer q.mutex.RUnlock()
2771+
2772+
var members []database.GroupMember
2773+
for _, member := range q.groupMembers {
2774+
if member.GroupID == groupID {
2775+
members = append(members, member)
2776+
}
2777+
}
2778+
2779+
users := make([]database.User, 0, len(members))
2780+
2781+
for _, member := range members {
2782+
for _, user := range q.users {
2783+
if user.ID == member.UserID {
2784+
users = append(users, user)
2785+
break
2786+
}
2787+
}
2788+
}
2789+
2790+
return users, nil
27452791
}
27462792

27472793
func (q *fakeQuerier) GetGroupsByOrganizationID(ctx context.Context, organizationID uuid.UUID) ([]database.Group, error) {

coderd/database/dbtestutil/db.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@ import (
66
"os"
77
"testing"
88

9+
"github.com/stretchr/testify/require"
10+
911
"github.com/coder/coder/coderd/database"
1012
"github.com/coder/coder/coderd/database/databasefake"
1113
"github.com/coder/coder/coderd/database/postgres"
12-
"github.com/stretchr/testify/require"
1314
)
1415

1516
func NewDB(t *testing.T) (database.Store, database.Pubsub) {

coderd/groups.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/coder/coder/coderd/database"
1212
"github.com/coder/coder/coderd/httpapi"
1313
"github.com/coder/coder/coderd/httpmw"
14+
"github.com/coder/coder/coderd/rbac"
1415
"github.com/coder/coder/codersdk"
1516
)
1617

@@ -20,10 +21,10 @@ func (api *API) postGroupByOrganization(rw http.ResponseWriter, r *http.Request)
2021
org = httpmw.OrganizationParam(r)
2122
)
2223

23-
// if api.Authorize(r, rbac.ActionCreate, rbac.ResourceGroup.InOrg(org.ID)) {
24-
// http.NotFound(rw, r)
25-
// return
26-
// }
24+
if !api.Authorize(r, rbac.ActionCreate, rbac.ResourceGroup.InOrg(org.ID)) {
25+
http.NotFound(rw, r)
26+
return
27+
}
2728

2829
var req codersdk.CreateGroupRequest
2930
if !httpapi.Read(rw, r, &req) {
@@ -46,7 +47,7 @@ func (api *API) postGroupByOrganization(rw http.ResponseWriter, r *http.Request)
4647
return
4748
}
4849

49-
httpapi.Write(rw, http.StatusCreated, group)
50+
httpapi.Write(rw, http.StatusCreated, convertGroup(group, nil))
5051
}
5152

5253
func (api *API) patchGroup(rw http.ResponseWriter, r *http.Request) {
@@ -55,10 +56,10 @@ func (api *API) patchGroup(rw http.ResponseWriter, r *http.Request) {
5556
group = httpmw.GroupParam(r)
5657
)
5758

58-
// if api.Authorize(r, rbac.ActionUpdate, rbac.ResourceGroup.InOrg(group.OrganizationID)) {
59-
// http.NotFound(rw, r)
60-
// return
61-
// }
59+
if !api.Authorize(r, rbac.ActionUpdate, rbac.ResourceGroup.InOrg(group.OrganizationID)) {
60+
http.NotFound(rw, r)
61+
return
62+
}
6263

6364
var req codersdk.PatchGroupRequest
6465
if !httpapi.Read(rw, r, &req) {
@@ -141,6 +142,10 @@ func (api *API) patchGroup(rw http.ResponseWriter, r *http.Request) {
141142
})
142143
return
143144
}
145+
if err != nil {
146+
httpapi.InternalServerError(rw, err)
147+
return
148+
}
144149

145150
members, err := api.Database.GetGroupMembers(ctx, group.ID)
146151
if err != nil {

coderd/groups_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ func TestCreateGroup(t *testing.T) {
2828
require.NoError(t, err)
2929
require.Equal(t, "hi", group.Name)
3030
require.Empty(t, group.Members)
31+
require.NotEqual(t, uuid.Nil.String(), group.ID.String())
3132
})
3233

3334
t.Run("Conflict", func(t *testing.T) {

codersdk/groups.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ func (c *Client) PatchGroup(ctx context.Context, group uuid.UUID, req PatchGroup
8888
}
8989
defer res.Body.Close()
9090

91-
if res.StatusCode != http.StatusCreated {
91+
if res.StatusCode != http.StatusOK {
9292
return Group{}, readBodyAsError(res)
9393
}
9494
var resp Group

0 commit comments

Comments
 (0)