Skip to content

Commit d1b948d

Browse files
committed
Add workspace tests
1 parent 6763fbf commit d1b948d

File tree

2 files changed

+333
-13
lines changed

2 files changed

+333
-13
lines changed

coderd/authzquery/workspace.go

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,9 @@ func (q *AuthzQuerier) GetWorkspaceResourcesByJobID(ctx context.Context, jobID u
255255
var obj rbac.Objecter
256256
switch job.Type {
257257
case database.ProvisionerJobTypeTemplateVersionDryRun, database.ProvisionerJobTypeTemplateVersionImport:
258-
// We need to check if the actor is authorized to read the related template.
258+
// We don't need to do an authorized check, but this helper function
259+
// handles the job type for us.
260+
// TODO: Do not duplicate auth checks.
259261
tv, err := authorizedTemplateVersionFromJob(ctx, q, job)
260262
if err != nil {
261263
return nil, err
@@ -264,14 +266,22 @@ func (q *AuthzQuerier) GetWorkspaceResourcesByJobID(ctx context.Context, jobID u
264266
// Orphaned template version
265267
obj = tv.RBACObjectNoTemplate()
266268
} else {
267-
template, err := q.GetTemplateByID(ctx, tv.TemplateID.UUID)
269+
template, err := q.database.GetTemplateByID(ctx, tv.TemplateID.UUID)
268270
if err != nil {
269271
return nil, err
270272
}
271273
obj = template.RBACObject()
272274
}
273275
case database.ProvisionerJobTypeWorkspaceBuild:
274-
obj = rbac.ResourceWorkspace.InOrg(job.OrganizationID).WithOwner(job.InitiatorID.String())
276+
build, err := q.database.GetWorkspaceBuildByJobID(ctx, jobID)
277+
if err != nil {
278+
return nil, err
279+
}
280+
workspace, err := q.database.GetWorkspaceByID(ctx, build.WorkspaceID)
281+
if err != nil {
282+
return nil, err
283+
}
284+
obj = workspace
275285
default:
276286
return nil, xerrors.Errorf("unknown job type: %s", job.Type)
277287
}
@@ -316,22 +326,17 @@ func (q *AuthzQuerier) InsertWorkspaceBuild(ctx context.Context, arg database.In
316326

317327
func (q *AuthzQuerier) InsertWorkspaceBuildParameters(ctx context.Context, arg database.InsertWorkspaceBuildParametersParams) error {
318328
// TODO: Optimize this. We always have the workspace and build already fetched.
319-
build, err := q.GetWorkspaceBuildByID(ctx, arg.WorkspaceBuildID)
329+
build, err := q.database.GetWorkspaceBuildByID(ctx, arg.WorkspaceBuildID)
320330
if err != nil {
321331
return err
322332
}
323333

324-
var action rbac.Action = rbac.ActionUpdate
325-
if build.Transition == database.WorkspaceTransitionDelete {
326-
action = rbac.ActionDelete
327-
}
328-
329-
workspace, err := q.GetWorkspaceByID(ctx, build.WorkspaceID)
334+
workspace, err := q.database.GetWorkspaceByID(ctx, build.WorkspaceID)
330335
if err != nil {
331336
return err
332337
}
333338

334-
err = q.authorizeContext(ctx, action, workspace)
339+
err = q.authorizeContext(ctx, rbac.ActionUpdate, workspace)
335340
if err != nil {
336341
return err
337342
}
@@ -356,8 +361,12 @@ func (q *AuthzQuerier) UpdateWorkspaceAgentConnectionByID(ctx context.Context, a
356361

357362
func (q *AuthzQuerier) InsertAgentStat(ctx context.Context, arg database.InsertAgentStatParams) (database.AgentStat, error) {
358363
// TODO: This is a workspace agent operation. Should users be able to query this?
359-
resource := rbac.ResourceWorkspace.WithID(arg.WorkspaceID).WithOwner(arg.UserID.String())
360-
err := q.authorizeContext(ctx, rbac.ActionUpdate, resource)
364+
// Not really sure what this is for.
365+
workspace, err := q.database.GetWorkspaceByID(ctx, arg.WorkspaceID)
366+
if err != nil {
367+
return database.AgentStat{}, err
368+
}
369+
err = q.authorizeContext(ctx, rbac.ActionUpdate, workspace)
361370
if err != nil {
362371
return database.AgentStat{}, err
363372
}

coderd/authzquery/workspace_test.go

Lines changed: 311 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,315 @@ func (s *MethodTestSuite) TestWorkspace() {
6868
return methodCase(inputs([]uuid.UUID{res.ID}), asserts(ws, rbac.ActionRead))
6969
})
7070
})
71+
s.Run("UpdateWorkspaceAgentLifecycleStateByID", func() {
72+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
73+
ws := dbgen.Workspace(t, db, database.Workspace{})
74+
build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID, JobID: uuid.New()})
75+
res := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{JobID: build.JobID})
76+
agt := dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{ResourceID: res.ID})
77+
return methodCase(inputs(database.UpdateWorkspaceAgentLifecycleStateByIDParams{
78+
ID: agt.ID,
79+
LifecycleState: database.WorkspaceAgentLifecycleStateCreated,
80+
}), asserts(ws, rbac.ActionUpdate))
81+
})
82+
})
83+
s.Run("GetWorkspaceAppByAgentIDAndSlug", func() {
84+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
85+
ws := dbgen.Workspace(t, db, database.Workspace{})
86+
build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID, JobID: uuid.New()})
87+
res := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{JobID: build.JobID})
88+
agt := dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{ResourceID: res.ID})
89+
app := dbgen.WorkspaceApp(t, db, database.WorkspaceApp{AgentID: agt.ID})
90+
91+
return methodCase(inputs(database.GetWorkspaceAppByAgentIDAndSlugParams{
92+
AgentID: agt.ID,
93+
Slug: app.Slug,
94+
}), asserts(ws, rbac.ActionRead))
95+
})
96+
})
97+
s.Run("GetWorkspaceAppsByAgentID", func() {
98+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
99+
ws := dbgen.Workspace(t, db, database.Workspace{})
100+
build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID, JobID: uuid.New()})
101+
res := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{JobID: build.JobID})
102+
agt := dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{ResourceID: res.ID})
103+
_ = dbgen.WorkspaceApp(t, db, database.WorkspaceApp{AgentID: agt.ID})
104+
_ = dbgen.WorkspaceApp(t, db, database.WorkspaceApp{AgentID: agt.ID})
105+
106+
return methodCase(inputs(agt.ID), asserts(ws, rbac.ActionRead))
107+
})
108+
})
109+
s.Run("GetWorkspaceAppsByAgentIDs", func() {
110+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
111+
aWs := dbgen.Workspace(t, db, database.Workspace{})
112+
aBuild := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: aWs.ID, JobID: uuid.New()})
113+
aRes := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{JobID: aBuild.JobID})
114+
aAgt := dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{ResourceID: aRes.ID})
115+
a := dbgen.WorkspaceApp(t, db, database.WorkspaceApp{AgentID: aAgt.ID})
116+
117+
bWs := dbgen.Workspace(t, db, database.Workspace{})
118+
bBuild := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: bWs.ID, JobID: uuid.New()})
119+
bRes := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{JobID: bBuild.JobID})
120+
bAgt := dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{ResourceID: bRes.ID})
121+
b := dbgen.WorkspaceApp(t, db, database.WorkspaceApp{AgentID: bAgt.ID})
122+
123+
return methodCase(inputs([]uuid.UUID{a.AgentID, b.AgentID}), asserts(aWs, rbac.ActionRead, bWs, rbac.ActionRead))
124+
})
125+
})
126+
s.Run("GetWorkspaceBuildByID", func() {
127+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
128+
ws := dbgen.Workspace(t, db, database.Workspace{})
129+
build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID})
130+
return methodCase(inputs(build.ID), asserts(ws, rbac.ActionRead))
131+
})
132+
})
133+
s.Run("GetWorkspaceBuildByJobID", func() {
134+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
135+
ws := dbgen.Workspace(t, db, database.Workspace{})
136+
build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID})
137+
return methodCase(inputs(build.JobID), asserts(ws, rbac.ActionRead))
138+
})
139+
})
140+
s.Run("GetWorkspaceBuildByWorkspaceIDAndBuildNumber", func() {
141+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
142+
ws := dbgen.Workspace(t, db, database.Workspace{})
143+
build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID, BuildNumber: 10})
144+
return methodCase(inputs(database.GetWorkspaceBuildByWorkspaceIDAndBuildNumberParams{
145+
WorkspaceID: ws.ID,
146+
BuildNumber: build.BuildNumber,
147+
}), asserts(ws, rbac.ActionRead))
148+
})
149+
})
150+
s.Run("GetWorkspaceBuildParameters", func() {
151+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
152+
ws := dbgen.Workspace(t, db, database.Workspace{})
153+
build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID})
154+
return methodCase(inputs(build.ID), asserts(ws, rbac.ActionRead))
155+
})
156+
})
157+
s.Run("GetWorkspaceBuildsByWorkspaceID", func() {
158+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
159+
ws := dbgen.Workspace(t, db, database.Workspace{})
160+
_ = dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID, BuildNumber: 1})
161+
_ = dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID, BuildNumber: 2})
162+
_ = dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID, BuildNumber: 3})
163+
return methodCase(inputs(database.GetWorkspaceBuildsByWorkspaceIDParams{WorkspaceID: ws.ID}), asserts(ws, rbac.ActionRead))
164+
})
165+
})
166+
s.Run("GetWorkspaceByAgentID", func() {
167+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
168+
ws := dbgen.Workspace(t, db, database.Workspace{})
169+
build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID, JobID: uuid.New()})
170+
res := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{JobID: build.JobID})
171+
agt := dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{ResourceID: res.ID})
172+
return methodCase(inputs(agt.ID), asserts(ws, rbac.ActionRead))
173+
})
174+
})
175+
s.Run("GetWorkspaceByOwnerIDAndName", func() {
176+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
177+
ws := dbgen.Workspace(t, db, database.Workspace{})
178+
return methodCase(inputs(database.GetWorkspaceByOwnerIDAndNameParams{
179+
OwnerID: ws.OwnerID,
180+
Deleted: ws.Deleted,
181+
Name: ws.Name,
182+
}), asserts(ws, rbac.ActionRead))
183+
})
184+
})
185+
s.Run("GetWorkspaceResourceByID", func() {
186+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
187+
ws := dbgen.Workspace(t, db, database.Workspace{})
188+
build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID, JobID: uuid.New()})
189+
res := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{JobID: build.JobID})
190+
return methodCase(inputs(res.ID), asserts(ws, rbac.ActionRead))
191+
})
192+
})
193+
s.Run("GetWorkspaceResourceMetadataByResourceIDs", func() {
194+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
195+
ws := dbgen.Workspace(t, db, database.Workspace{})
196+
build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID, JobID: uuid.New()})
197+
a := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{JobID: build.JobID})
198+
b := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{JobID: build.JobID})
199+
return methodCase(inputs([]uuid.UUID{a.ID, b.ID}), asserts(ws, []rbac.Action{rbac.ActionRead, rbac.ActionRead}))
200+
})
201+
})
202+
s.Run("Build/GetWorkspaceResourcesByJobID", func() {
203+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
204+
ws := dbgen.Workspace(t, db, database.Workspace{})
205+
build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID, JobID: uuid.New()})
206+
job := dbgen.ProvisionerJob(t, db, database.ProvisionerJob{ID: build.JobID, Type: database.ProvisionerJobTypeWorkspaceBuild})
207+
return methodCase(inputs(job.ID), asserts(ws, rbac.ActionRead))
208+
})
209+
})
210+
s.Run("Template/GetWorkspaceResourcesByJobID", func() {
211+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
212+
tpl := dbgen.Template(t, db, database.Template{})
213+
v := dbgen.TemplateVersion(t, db, database.TemplateVersion{TemplateID: uuid.NullUUID{UUID: tpl.ID, Valid: true}, JobID: uuid.New()})
214+
job := dbgen.ProvisionerJob(t, db, database.ProvisionerJob{ID: v.JobID, Type: database.ProvisionerJobTypeTemplateVersionImport})
215+
return methodCase(inputs(job.ID), asserts(v.RBACObject(tpl), []rbac.Action{rbac.ActionRead, rbac.ActionRead}))
216+
})
217+
})
218+
s.Run("GetWorkspaceResourcesByJobIDs", func() {
219+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
220+
tpl := dbgen.Template(t, db, database.Template{})
221+
v := dbgen.TemplateVersion(t, db, database.TemplateVersion{TemplateID: uuid.NullUUID{UUID: tpl.ID, Valid: true}, JobID: uuid.New()})
222+
tJob := dbgen.ProvisionerJob(t, db, database.ProvisionerJob{ID: v.JobID, Type: database.ProvisionerJobTypeTemplateVersionImport})
223+
224+
ws := dbgen.Workspace(t, db, database.Workspace{})
225+
build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID, JobID: uuid.New()})
226+
wJob := dbgen.ProvisionerJob(t, db, database.ProvisionerJob{ID: build.JobID, Type: database.ProvisionerJobTypeWorkspaceBuild})
227+
return methodCase(inputs([]uuid.UUID{tJob.ID, wJob.ID}), asserts(v.RBACObject(tpl), rbac.ActionRead, ws, rbac.ActionRead))
228+
})
229+
})
230+
s.Run("InsertWorkspace", func() {
231+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
232+
u := dbgen.User(t, db, database.User{})
233+
o := dbgen.Organization(t, db, database.Organization{})
234+
return methodCase(inputs(database.InsertWorkspaceParams{
235+
ID: uuid.New(),
236+
OwnerID: u.ID,
237+
OrganizationID: o.ID,
238+
}), asserts(rbac.ResourceWorkspace.WithOwner(u.ID.String()).InOrg(o.ID), rbac.ActionCreate))
239+
})
240+
})
241+
s.Run("Start/InsertWorkspaceBuild", func() {
242+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
243+
w := dbgen.Workspace(t, db, database.Workspace{})
244+
return methodCase(inputs(database.InsertWorkspaceBuildParams{
245+
WorkspaceID: w.ID,
246+
Transition: database.WorkspaceTransitionStart,
247+
Reason: database.BuildReasonInitiator,
248+
}), asserts(w, rbac.ActionUpdate))
249+
})
250+
})
251+
s.Run("Delete/InsertWorkspaceBuild", func() {
252+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
253+
w := dbgen.Workspace(t, db, database.Workspace{})
254+
return methodCase(inputs(database.InsertWorkspaceBuildParams{
255+
WorkspaceID: w.ID,
256+
Transition: database.WorkspaceTransitionDelete,
257+
Reason: database.BuildReasonInitiator,
258+
}), asserts(w, rbac.ActionDelete))
259+
})
260+
})
261+
s.Run("InsertWorkspaceBuildParameters", func() {
262+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
263+
w := dbgen.Workspace(t, db, database.Workspace{})
264+
b := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: w.ID})
265+
return methodCase(inputs(database.InsertWorkspaceBuildParametersParams{
266+
WorkspaceBuildID: b.ID,
267+
Name: []string{"foo", "bar"},
268+
Value: []string{"baz", "qux"},
269+
}), asserts(w, rbac.ActionUpdate))
270+
})
271+
})
272+
s.Run("UpdateWorkspace", func() {
273+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
274+
w := dbgen.Workspace(t, db, database.Workspace{})
275+
return methodCase(inputs(database.UpdateWorkspaceParams{
276+
ID: w.ID,
277+
}), asserts(w, rbac.ActionUpdate))
278+
})
279+
})
280+
s.Run("UpdateWorkspaceAgentConnectionByID", func() {
281+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
282+
ws := dbgen.Workspace(t, db, database.Workspace{})
283+
build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID, JobID: uuid.New()})
284+
res := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{JobID: build.JobID})
285+
agt := dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{ResourceID: res.ID})
286+
return methodCase(inputs(database.UpdateWorkspaceAgentConnectionByIDParams{
287+
ID: agt.ID,
288+
}), asserts(ws, rbac.ActionUpdate))
289+
})
290+
})
291+
s.Run("InsertAgentStat", func() {
292+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
293+
ws := dbgen.Workspace(t, db, database.Workspace{})
294+
return methodCase(inputs(database.InsertAgentStatParams{
295+
WorkspaceID: ws.ID,
296+
}), asserts(ws, rbac.ActionUpdate))
297+
})
298+
})
299+
s.Run("UpdateWorkspaceAgentVersionByID", func() {
300+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
301+
ws := dbgen.Workspace(t, db, database.Workspace{})
302+
build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID, JobID: uuid.New()})
303+
res := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{JobID: build.JobID})
304+
agt := dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{ResourceID: res.ID})
305+
return methodCase(inputs(database.UpdateWorkspaceAgentVersionByIDParams{
306+
ID: agt.ID,
307+
Version: "test",
308+
}), asserts(ws, rbac.ActionUpdate))
309+
})
310+
})
311+
s.Run("UpdateWorkspaceAppHealthByID", func() {
312+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
313+
ws := dbgen.Workspace(t, db, database.Workspace{})
314+
build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID, JobID: uuid.New()})
315+
res := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{JobID: build.JobID})
316+
agt := dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{ResourceID: res.ID})
317+
app := dbgen.WorkspaceApp(t, db, database.WorkspaceApp{AgentID: agt.ID})
318+
return methodCase(inputs(database.UpdateWorkspaceAppHealthByIDParams{
319+
ID: app.ID,
320+
Health: database.WorkspaceAppHealthHealthy,
321+
}), asserts(ws, rbac.ActionUpdate))
322+
})
323+
})
324+
s.Run("UpdateWorkspaceAutostart", func() {
325+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
326+
ws := dbgen.Workspace(t, db, database.Workspace{})
327+
return methodCase(inputs(database.UpdateWorkspaceAutostartParams{
328+
ID: ws.ID,
329+
}), asserts(ws, rbac.ActionUpdate))
330+
})
331+
})
332+
s.Run("UpdateWorkspaceBuildByID", func() {
333+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
334+
ws := dbgen.Workspace(t, db, database.Workspace{})
335+
build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID, JobID: uuid.New()})
336+
return methodCase(inputs(database.UpdateWorkspaceBuildByIDParams{
337+
ID: build.ID,
338+
}), asserts(ws, rbac.ActionUpdate))
339+
})
340+
})
341+
s.Run("SoftDeleteWorkspaceByID", func() {
342+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
343+
ws := dbgen.Workspace(t, db, database.Workspace{})
344+
return methodCase(inputs(ws.ID), asserts(ws, rbac.ActionDelete))
345+
})
346+
})
347+
s.Run("UpdateWorkspaceDeletedByID", func() {
348+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
349+
ws := dbgen.Workspace(t, db, database.Workspace{})
350+
return methodCase(inputs(database.UpdateWorkspaceDeletedByIDParams{
351+
ID: ws.ID,
352+
Deleted: true,
353+
}), asserts(ws, rbac.ActionDelete))
354+
})
355+
})
356+
s.Run("UpdateWorkspaceLastUsedAt", func() {
357+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
358+
ws := dbgen.Workspace(t, db, database.Workspace{})
359+
return methodCase(inputs(database.UpdateWorkspaceLastUsedAtParams{
360+
ID: ws.ID,
361+
}), asserts(ws, rbac.ActionUpdate))
362+
})
363+
})
364+
s.Run("UpdateWorkspaceTTL", func() {
365+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
366+
ws := dbgen.Workspace(t, db, database.Workspace{})
367+
return methodCase(inputs(database.UpdateWorkspaceTTLParams{
368+
ID: ws.ID,
369+
}), asserts(ws, rbac.ActionUpdate))
370+
})
371+
})
372+
s.Run("GetWorkspaceByWorkspaceAppID", func() {
373+
s.RunMethodTest(func(t *testing.T, db database.Store) MethodCase {
374+
ws := dbgen.Workspace(t, db, database.Workspace{})
375+
build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: ws.ID, JobID: uuid.New()})
376+
res := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{JobID: build.JobID})
377+
agt := dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{ResourceID: res.ID})
378+
app := dbgen.WorkspaceApp(t, db, database.WorkspaceApp{AgentID: agt.ID})
379+
return methodCase(inputs(app.ID), asserts(ws, rbac.ActionRead))
380+
})
381+
})
71382
}

0 commit comments

Comments
 (0)