Skip to content

Commit 395edca

Browse files
committed
fix codersdk, work on test
1 parent 190bd90 commit 395edca

File tree

3 files changed

+62
-9
lines changed

3 files changed

+62
-9
lines changed

codersdk/groups.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"encoding/json"
66
"fmt"
77
"net/http"
8+
"net/url"
89

910
"github.com/google/uuid"
1011
"golang.org/x/xerrors"
@@ -60,9 +61,30 @@ func (c *Client) CreateGroup(ctx context.Context, orgID uuid.UUID, req CreateGro
6061
return resp, json.NewDecoder(res.Body).Decode(&resp)
6162
}
6263

64+
// GroupsByOrganization
65+
// Deprecated: use Groups with GroupArguments instead.
6366
func (c *Client) GroupsByOrganization(ctx context.Context, orgID uuid.UUID) ([]Group, error) {
67+
return c.Groups(ctx, GroupArguments{Organization: orgID.String()})
68+
}
69+
70+
type GroupArguments struct {
71+
// Organization can be an org UUID or name
72+
Organization string
73+
// HasMember can be a user uuid or username
74+
HasMember string
75+
}
76+
77+
func (c *Client) Groups(ctx context.Context, args GroupArguments) ([]Group, error) {
78+
qp := url.Values{}
79+
if args.Organization != "" {
80+
qp.Set("organization", args.Organization)
81+
}
82+
if args.HasMember != "" {
83+
qp.Set("has_member", args.HasMember)
84+
}
85+
6486
res, err := c.Request(ctx, http.MethodGet,
65-
fmt.Sprintf("/api/v2/organizations/%s/groups", orgID.String()),
87+
fmt.Sprintf("/api/v2/groups?%s", qp.Encode()),
6688
nil,
6789
)
6890
if err != nil {

enterprise/coderd/groups.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ func (api *API) groups(rw http.ResponseWriter, r *http.Request) {
419419
var filter database.GetGroupsParams
420420
parser := httpapi.NewQueryParamParser()
421421
// Organization selector can be an org ID or name
422-
filter.OrganizationID = parser.UUIDorName(r.URL.Query(), uuid.Nil, "has_member", func(orgName string) (uuid.UUID, error) {
422+
filter.OrganizationID = parser.UUIDorName(r.URL.Query(), uuid.Nil, "organization", func(orgName string) (uuid.UUID, error) {
423423
org, err := api.Database.GetOrganizationByName(ctx, orgName)
424424
if err != nil {
425425
return uuid.Nil, xerrors.Errorf("organization %q not found", orgName)
@@ -438,6 +438,14 @@ func (api *API) groups(rw http.ResponseWriter, r *http.Request) {
438438
}
439439
return user.ID, nil
440440
})
441+
parser.ErrorExcessParams(r.URL.Query())
442+
if len(parser.Errors) > 0 {
443+
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
444+
Message: "Query parameters have invalid values.",
445+
Validations: parser.Errors,
446+
})
447+
return
448+
}
441449

442450
groups, err := api.Database.GetGroups(ctx, filter)
443451
if httpapi.Is404Error(err) {

enterprise/coderd/groups_test.go

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,12 @@ func TestPatchGroup(t *testing.T) {
568568
})
569569
}
570570

571+
func sortAllGroups(groups []codersdk.Group) {
572+
for i := range groups {
573+
sortGroupMembers(&groups[i])
574+
}
575+
}
576+
571577
func sortGroupMembers(group *codersdk.Group) {
572578
sort.Slice(group.Members, func(i, j int) bool {
573579
return group.Members[i].ID.String() < group.Members[j].ID.String()
@@ -793,6 +799,8 @@ func TestGroup(t *testing.T) {
793799
func TestGroups(t *testing.T) {
794800
t.Parallel()
795801

802+
// 5 users
803+
// 2 custom groups + original org group
796804
t.Run("OK", func(t *testing.T) {
797805
t.Parallel()
798806

@@ -822,26 +830,41 @@ func TestGroups(t *testing.T) {
822830
AddUsers: []string{user2.ID.String(), user3.ID.String()},
823831
})
824832
require.NoError(t, err)
833+
sortGroupMembers(&group1)
825834

826835
group2, err = userAdminClient.PatchGroup(ctx, group2.ID, codersdk.PatchGroupRequest{
827836
AddUsers: []string{user4.ID.String(), user5.ID.String()},
828837
})
829838
require.NoError(t, err)
839+
sortGroupMembers(&group2)
830840

831-
groups, err := userAdminClient.GroupsByOrganization(ctx, user.OrganizationID)
841+
// Fetch everyone group for comparison
842+
everyoneGroup, err := userAdminClient.Group(ctx, user.OrganizationID)
832843
require.NoError(t, err)
844+
sortGroupMembers(&everyoneGroup)
833845

834-
// sort group members so we can compare them
835-
allGroups := append([]codersdk.Group{}, groups...)
836-
allGroups = append(allGroups, group1, group2)
837-
for i := range allGroups {
838-
sortGroupMembers(&allGroups[i])
839-
}
846+
groups, err := userAdminClient.Groups(ctx, codersdk.GroupArguments{
847+
Organization: user.OrganizationID.String(),
848+
})
849+
require.NoError(t, err)
850+
sortAllGroups(groups)
840851

841852
// 'Everyone' group + 2 custom groups.
842853
require.Len(t, groups, 3)
843854
require.Contains(t, groups, group1)
844855
require.Contains(t, groups, group2)
856+
857+
// Filter by user
858+
user5Groups, err := userAdminClient.Groups(ctx, codersdk.GroupArguments{
859+
HasMember: user5.Username,
860+
})
861+
require.NoError(t, err)
862+
// Everyone group and group 2
863+
require.ElementsMatch(t, user5Groups, []codersdk.Group{
864+
everyoneGroup,
865+
group2,
866+
})
867+
845868
})
846869
}
847870

0 commit comments

Comments
 (0)