Skip to content

Commit 501f103

Browse files
committed
add test
1 parent 95abf62 commit 501f103

File tree

5 files changed

+104
-15
lines changed

5 files changed

+104
-15
lines changed

coderd/database/dbauthz/dbauthz.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1429,7 +1429,11 @@ func (q *querier) GetTemplateVersionParameters(ctx context.Context, templateVers
14291429
}
14301430

14311431
func (q *querier) GetTemplateVersionParametersByVersionIDs(ctx context.Context, ids []uuid.UUID) ([]database.TemplateVersionParameter, error) {
1432-
panic("not implemented")
1432+
if err := q.authorizeContext(ctx, rbac.ActionRead, rbac.ResourceSystem); err != nil {
1433+
return nil, err
1434+
}
1435+
1436+
return q.db.GetTemplateVersionParametersByVersionIDs(ctx, ids)
14331437
}
14341438

14351439
func (q *querier) GetTemplateVersionVariables(ctx context.Context, templateVersionID uuid.UUID) ([]database.TemplateVersionVariable, error) {
@@ -1786,7 +1790,11 @@ func (q *querier) GetWorkspaceBuildParameters(ctx context.Context, workspaceBuil
17861790
}
17871791

17881792
func (q *querier) GetWorkspaceBuildParametersByBuildIDs(ctx context.Context, ids []uuid.UUID) ([]database.WorkspaceBuildParameter, error) {
1789-
panic("not implemented")
1793+
if err := q.authorizeContext(ctx, rbac.ActionRead, rbac.ResourceSystem); err != nil {
1794+
return nil, err
1795+
}
1796+
1797+
return q.db.GetWorkspaceBuildParametersByBuildIDs(ctx, ids)
17901798
}
17911799

17921800
func (q *querier) GetWorkspaceBuildsByWorkspaceID(ctx context.Context, arg database.GetWorkspaceBuildsByWorkspaceIDParams) ([]database.WorkspaceBuild, error) {

coderd/database/dbmem/dbmem.go

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2907,7 +2907,17 @@ func (q *FakeQuerier) GetTemplateVersionParameters(_ context.Context, templateVe
29072907
}
29082908

29092909
func (q *FakeQuerier) GetTemplateVersionParametersByVersionIDs(ctx context.Context, ids []uuid.UUID) ([]database.TemplateVersionParameter, error) {
2910-
panic("not implemented")
2910+
q.mutex.RLock()
2911+
defer q.mutex.RUnlock()
2912+
2913+
var params []database.TemplateVersionParameter
2914+
for _, p := range q.templateVersionParameters {
2915+
if slice.Contains(ids, p.TemplateVersionID) {
2916+
params = append(params, p)
2917+
}
2918+
}
2919+
2920+
return params, nil
29112921
}
29122922

29132923
func (q *FakeQuerier) GetTemplateVersionVariables(_ context.Context, templateVersionID uuid.UUID) ([]database.TemplateVersionVariable, error) {
@@ -3964,7 +3974,16 @@ func (q *FakeQuerier) GetWorkspaceBuildParameters(_ context.Context, workspaceBu
39643974
}
39653975

39663976
func (q *FakeQuerier) GetWorkspaceBuildParametersByBuildIDs(ctx context.Context, ids []uuid.UUID) ([]database.WorkspaceBuildParameter, error) {
3967-
panic("not implemented")
3977+
q.mutex.RLock()
3978+
defer q.mutex.RUnlock()
3979+
3980+
var params []database.WorkspaceBuildParameter
3981+
for _, param := range q.workspaceBuildParameters {
3982+
if slice.Contains(ids, param.WorkspaceBuildID) {
3983+
params = append(params, param)
3984+
}
3985+
}
3986+
return params, nil
39683987
}
39693988

39703989
func (q *FakeQuerier) GetWorkspaceBuildsByWorkspaceID(_ context.Context,

coderd/workspaces.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func (api *API) workspace(rw http.ResponseWriter, r *http.Request) {
7979

8080
if resolveStr != "" {
8181
var err error
82-
resolveParameters, err = strconv.ParseBool(deletedStr)
82+
resolveParameters, err = strconv.ParseBool(resolveStr)
8383
if err != nil {
8484
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
8585
Message: fmt.Sprintf("Invalid boolean value %q for \"resolve_parameters\" query param.", resolveStr),
@@ -1217,9 +1217,11 @@ func (api *API) watchWorkspace(rw http.ResponseWriter, r *http.Request) {
12171217
}
12181218

12191219
type workspaceData struct {
1220-
templates []database.Template
1221-
builds []codersdk.WorkspaceBuild
1222-
users []database.User
1220+
templates []database.Template
1221+
builds []codersdk.WorkspaceBuild
1222+
users []database.User
1223+
// The following fields will be nil if parameter resolution
1224+
// is not requested.
12231225
buildParameters []codersdk.WorkspaceBuildParameter
12241226
templateParameters []codersdk.TemplateVersionParameter
12251227
}
@@ -1228,6 +1230,8 @@ type workspaceData struct {
12281230
// does not have the correct perms to read a given template, the template will
12291231
// not be returned.
12301232
// So the caller must check the templates & users exist before using them.
1233+
//
1234+
//nolint:revive
12311235
func (api *API) workspaceData(ctx context.Context, workspaces []database.Workspace, resolveParameters bool) (workspaceData, error) {
12321236
workspaceIDs := make([]uuid.UUID, 0, len(workspaces))
12331237
templateIDs := make([]uuid.UUID, 0, len(workspaces))
@@ -1404,7 +1408,7 @@ func convertWorkspace(
14041408
}
14051409

14061410
var parameterMismatch bool
1407-
if len(buildParameters) > 0 && len(versionParameters) > 0 {
1411+
if len(buildParameters) > 0 || len(versionParameters) > 0 {
14081412
resolver := codersdk.ParameterResolver{
14091413
Rich: buildParameters,
14101414
}

coderd/workspaces_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ func TestWorkspace(t *testing.T) {
6060
require.NoError(t, err)
6161
require.Equal(t, user.UserID, ws.LatestBuild.InitiatorID)
6262
require.Equal(t, codersdk.BuildReasonInitiator, ws.LatestBuild.Reason)
63+
require.False(t, ws.ParameterMismatch)
6364
})
6465

6566
t.Run("Deleted", func(t *testing.T) {
@@ -338,6 +339,59 @@ func TestWorkspace(t *testing.T) {
338339
require.Error(t, err, "create workspace with archived version")
339340
require.ErrorContains(t, err, "Archived template versions cannot")
340341
})
342+
343+
t.Run("ResolveParameters", func(t *testing.T) {
344+
t.Parallel()
345+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
346+
user := coderdtest.CreateFirstUser(t, client)
347+
version1 := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
348+
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version1.ID)
349+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version1.ID)
350+
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
351+
cwr.AutomaticUpdates = codersdk.AutomaticUpdatesAlways
352+
})
353+
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID)
354+
355+
params := &echo.Responses{
356+
Parse: echo.ParseComplete,
357+
ProvisionPlan: []*proto.Response{
358+
{
359+
Type: &proto.Response_Plan{
360+
Plan: &proto.PlanComplete{
361+
Parameters: []*proto.RichParameter{
362+
{
363+
Name: "param",
364+
Description: "param",
365+
Required: true,
366+
Mutable: true,
367+
},
368+
},
369+
},
370+
},
371+
},
372+
},
373+
ProvisionApply: echo.ApplyComplete,
374+
}
375+
376+
version2 := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, params, func(ctvr *codersdk.CreateTemplateVersionRequest) {
377+
ctvr.TemplateID = template.ID
378+
})
379+
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version2.ID)
380+
381+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
382+
defer cancel()
383+
384+
err := client.UpdateActiveTemplateVersion(ctx, template.ID, codersdk.UpdateActiveTemplateVersion{
385+
ID: version2.ID,
386+
})
387+
require.NoError(t, err)
388+
389+
ws, err := client.Workspace(ctx, workspace.ID, (codersdk.WorkspaceOptions{
390+
ResolveParameters: true,
391+
}).AsRequestOption())
392+
require.NoError(t, err)
393+
require.True(t, ws.ParameterMismatch)
394+
})
341395
}
342396

343397
func TestAdminViewAllWorkspaces(t *testing.T) {

codersdk/workspaces.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,32 +106,36 @@ type CreateWorkspaceBuildRequest struct {
106106
}
107107

108108
type WorkspaceOptions struct {
109-
IncludeDeleted bool `json:"include_deleted,omitempty"`
109+
IncludeDeleted bool `json:"include_deleted,omitempty"`
110+
ResolveParameters bool `json:"resolve_parameters,omitempty"`
110111
}
111112

112-
// asRequestOption returns a function that can be used in (*Client).Request.
113+
// AsRequestOption returns a function that can be used in (*Client).Request.
113114
// It modifies the request query parameters.
114-
func (o WorkspaceOptions) asRequestOption() RequestOption {
115+
func (o WorkspaceOptions) AsRequestOption() RequestOption {
115116
return func(r *http.Request) {
116117
q := r.URL.Query()
117118
if o.IncludeDeleted {
118119
q.Set("include_deleted", "true")
119120
}
121+
if o.ResolveParameters {
122+
q.Set("resolve_parameters", "true")
123+
}
120124
r.URL.RawQuery = q.Encode()
121125
}
122126
}
123127

124128
// Workspace returns a single workspace.
125-
func (c *Client) Workspace(ctx context.Context, id uuid.UUID) (Workspace, error) {
126-
return c.getWorkspace(ctx, id)
129+
func (c *Client) Workspace(ctx context.Context, id uuid.UUID, opts ...RequestOption) (Workspace, error) {
130+
return c.getWorkspace(ctx, id, opts...)
127131
}
128132

129133
// DeletedWorkspace returns a single workspace that was deleted.
130134
func (c *Client) DeletedWorkspace(ctx context.Context, id uuid.UUID) (Workspace, error) {
131135
o := WorkspaceOptions{
132136
IncludeDeleted: true,
133137
}
134-
return c.getWorkspace(ctx, id, o.asRequestOption())
138+
return c.getWorkspace(ctx, id, o.AsRequestOption())
135139
}
136140

137141
func (c *Client) getWorkspace(ctx context.Context, id uuid.UUID, opts ...RequestOption) (Workspace, error) {

0 commit comments

Comments
 (0)