Skip to content

Commit 2015837

Browse files
committed
add unit test for user_id query param
1 parent 3ddc7a9 commit 2015837

File tree

4 files changed

+47
-6
lines changed

4 files changed

+47
-6
lines changed

coderd/parameters.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,25 @@ func (api *API) templateVersionDynamicParametersEvaluate(rw http.ResponseWriter,
5858
// @Router /templateversions/{templateversion}/dynamic-parameters [get]
5959
func (api *API) templateVersionDynamicParametersWebsocket(rw http.ResponseWriter, r *http.Request) {
6060
apikey := httpmw.APIKey(r)
61+
userID := apikey.UserID
62+
63+
qUserID := r.URL.Query().Get("user_id")
64+
if qUserID != "" {
65+
uid, err := uuid.Parse(qUserID)
66+
if err != nil {
67+
httpapi.Write(r.Context(), rw, http.StatusBadRequest, codersdk.Response{
68+
Message: "Invalid user_id query parameter",
69+
Detail: err.Error(),
70+
})
71+
return
72+
}
73+
userID = uid
74+
}
6175

6276
api.templateVersionDynamicParameters(true, codersdk.DynamicParametersRequest{
6377
ID: -1,
6478
Inputs: map[string]string{},
65-
OwnerID: apikey.UserID,
79+
OwnerID: userID,
6680
})(rw, r)
6781
}
6882

coderd/parameters_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func TestDynamicParametersOwnerSSHPublicKey(t *testing.T) {
5656
_ = coderdtest.CreateTemplate(t, templateAdmin, owner.OrganizationID, version.ID)
5757

5858
ctx := testutil.Context(t, testutil.WaitShort)
59-
stream, err := templateAdmin.TemplateVersionDynamicParameters(ctx, version.ID)
59+
stream, err := templateAdmin.TemplateVersionDynamicParameters(ctx, codersdk.Me, version.ID)
6060
require.NoError(t, err)
6161
defer stream.Close(websocket.StatusGoingAway)
6262

@@ -387,7 +387,7 @@ func setupDynamicParamsTest(t *testing.T, args setupDynamicParamsTestParams) dyn
387387
require.NoError(t, err)
388388

389389
ctx := testutil.Context(t, testutil.WaitShort)
390-
stream, err := templateAdmin.TemplateVersionDynamicParameters(ctx, version.ID)
390+
stream, err := templateAdmin.TemplateVersionDynamicParameters(ctx, codersdk.Me, version.ID)
391391
if args.expectWebsocketError {
392392
require.Errorf(t, err, "expected error forming websocket")
393393
} else {

codersdk/parameters.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,17 @@ type DynamicParametersResponse struct {
125125
// TODO: Workspace tags
126126
}
127127

128-
func (c *Client) TemplateVersionDynamicParameters(ctx context.Context, version uuid.UUID) (*wsjson.Stream[DynamicParametersResponse, DynamicParametersRequest], error) {
129-
conn, err := c.Dial(ctx, fmt.Sprintf("/api/v2/templateversions/%s/dynamic-parameters", version), nil)
128+
func (c *Client) TemplateVersionDynamicParameters(ctx context.Context, userID string, version uuid.UUID) (*wsjson.Stream[DynamicParametersResponse, DynamicParametersRequest], error) {
129+
endpoint := fmt.Sprintf("/api/v2/templateversions/%s/dynamic-parameters", version)
130+
if userID != Me {
131+
uid, err := uuid.Parse(userID)
132+
if err != nil {
133+
return nil, fmt.Errorf("invalid user ID: %w", err)
134+
}
135+
endpoint += fmt.Sprintf("?user_id=%s", uid.String())
136+
}
137+
138+
conn, err := c.Dial(ctx, endpoint, nil)
130139
if err != nil {
131140
return nil, err
132141
}

enterprise/coderd/parameters_test.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ func TestDynamicParametersOwnerGroups(t *testing.T) {
3232
},
3333
)
3434
templateAdmin, templateAdminUser := coderdtest.CreateAnotherUser(t, ownerClient, owner.OrganizationID, rbac.RoleTemplateAdmin())
35+
_, noGroupUser := coderdtest.CreateAnotherUser(t, ownerClient, owner.OrganizationID)
3536

3637
// Create the group to be asserted
3738
group := coderdtest.CreateGroup(t, ownerClient, owner.OrganizationID, "bloob", templateAdminUser)
@@ -57,7 +58,24 @@ func TestDynamicParametersOwnerGroups(t *testing.T) {
5758
_ = coderdtest.CreateTemplate(t, templateAdmin, owner.OrganizationID, version.ID)
5859

5960
ctx := testutil.Context(t, testutil.WaitShort)
60-
stream, err := templateAdmin.TemplateVersionDynamicParameters(ctx, version.ID)
61+
62+
// First check with a no group admin user, that they do not see the extra group
63+
// Use the admin client, as the user might not have access to the template.
64+
// Also checking that the admin can see the form for the other user.
65+
noGroupStream, err := templateAdmin.TemplateVersionDynamicParameters(ctx, noGroupUser.ID.String(), version.ID)
66+
require.NoError(t, err)
67+
defer noGroupStream.Close(websocket.StatusGoingAway)
68+
noGroupPreviews := noGroupStream.Chan()
69+
noGroupPreview := testutil.RequireReceive(ctx, t, noGroupPreviews)
70+
require.Equal(t, -1, noGroupPreview.ID)
71+
require.Empty(t, noGroupPreview.Diagnostics)
72+
require.Equal(t, "group", noGroupPreview.Parameters[0].Name)
73+
require.Equal(t, database.EveryoneGroup, noGroupPreview.Parameters[0].Value.Value)
74+
require.Equal(t, 1, len(noGroupPreview.Parameters[0].Options)) // Only 1 group
75+
noGroupStream.Close(websocket.StatusGoingAway)
76+
77+
// Now try with a user with more than 1 group
78+
stream, err := templateAdmin.TemplateVersionDynamicParameters(ctx, codersdk.Me, version.ID)
6179
require.NoError(t, err)
6280
defer stream.Close(websocket.StatusGoingAway)
6381

0 commit comments

Comments
 (0)