Skip to content

Commit 7bb52e1

Browse files
authored
test: add tests for updating workspace acl (#19240)
1 parent d1e64af commit 7bb52e1

File tree

3 files changed

+196
-27
lines changed

3 files changed

+196
-27
lines changed

coderd/workspaces_test.go

Lines changed: 105 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2678,8 +2678,7 @@ func TestWorkspaceUpdateAutostart(t *testing.T) {
26782678
// ensure test invariant: new workspaces have no autostart schedule.
26792679
require.Empty(t, workspace.AutostartSchedule, "expected newly-minted workspace to have no autostart schedule")
26802680

2681-
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
2682-
defer cancel()
2681+
ctx := testutil.Context(t, testutil.WaitLong)
26832682

26842683
err := client.UpdateWorkspaceAutostart(ctx, workspace.ID, codersdk.UpdateWorkspaceAutostartRequest{
26852684
Schedule: ptr.Ref("CRON_TZ=Europe/Dublin 30 9 * * 1-5"),
@@ -2698,8 +2697,7 @@ func TestWorkspaceUpdateAutostart(t *testing.T) {
26982697
}
26992698
)
27002699

2701-
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
2702-
defer cancel()
2700+
ctx := testutil.Context(t, testutil.WaitLong)
27032701

27042702
err := client.UpdateWorkspaceAutostart(ctx, wsid, req)
27052703
require.IsType(t, err, &codersdk.Error{}, "expected codersdk.Error")
@@ -4813,3 +4811,106 @@ func TestMultipleAITasksDisallowed(t *testing.T) {
48134811
require.NoError(t, err)
48144812
require.Contains(t, pj.Error.String, "only one 'coder_ai_task' resource can be provisioned per template")
48154813
}
4814+
4815+
func TestUpdateWorkspaceACL(t *testing.T) {
4816+
t.Parallel()
4817+
4818+
t.Run("OK", func(t *testing.T) {
4819+
t.Parallel()
4820+
4821+
dv := coderdtest.DeploymentValues(t)
4822+
dv.Experiments = []string{string(codersdk.ExperimentWorkspaceSharing)}
4823+
adminClient := coderdtest.New(t, &coderdtest.Options{
4824+
IncludeProvisionerDaemon: true,
4825+
DeploymentValues: dv,
4826+
})
4827+
adminUser := coderdtest.CreateFirstUser(t, adminClient)
4828+
orgID := adminUser.OrganizationID
4829+
client, _ := coderdtest.CreateAnotherUser(t, adminClient, orgID)
4830+
_, friend := coderdtest.CreateAnotherUser(t, adminClient, orgID)
4831+
4832+
tv := coderdtest.CreateTemplateVersion(t, adminClient, orgID, nil)
4833+
coderdtest.AwaitTemplateVersionJobCompleted(t, adminClient, tv.ID)
4834+
template := coderdtest.CreateTemplate(t, adminClient, orgID, tv.ID)
4835+
4836+
ws := coderdtest.CreateWorkspace(t, client, template.ID)
4837+
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, ws.LatestBuild.ID)
4838+
4839+
ctx := testutil.Context(t, testutil.WaitMedium)
4840+
err := client.UpdateWorkspaceACL(ctx, ws.ID, codersdk.UpdateWorkspaceACL{
4841+
UserRoles: map[string]codersdk.WorkspaceRole{
4842+
friend.ID.String(): codersdk.WorkspaceRoleAdmin,
4843+
},
4844+
})
4845+
require.NoError(t, err)
4846+
})
4847+
4848+
t.Run("UnknownUserID", func(t *testing.T) {
4849+
t.Parallel()
4850+
4851+
dv := coderdtest.DeploymentValues(t)
4852+
dv.Experiments = []string{string(codersdk.ExperimentWorkspaceSharing)}
4853+
adminClient := coderdtest.New(t, &coderdtest.Options{
4854+
IncludeProvisionerDaemon: true,
4855+
DeploymentValues: dv,
4856+
})
4857+
adminUser := coderdtest.CreateFirstUser(t, adminClient)
4858+
orgID := adminUser.OrganizationID
4859+
client, _ := coderdtest.CreateAnotherUser(t, adminClient, orgID)
4860+
4861+
tv := coderdtest.CreateTemplateVersion(t, adminClient, orgID, nil)
4862+
coderdtest.AwaitTemplateVersionJobCompleted(t, adminClient, tv.ID)
4863+
template := coderdtest.CreateTemplate(t, adminClient, orgID, tv.ID)
4864+
4865+
ws := coderdtest.CreateWorkspace(t, client, template.ID)
4866+
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, ws.LatestBuild.ID)
4867+
4868+
ctx := testutil.Context(t, testutil.WaitMedium)
4869+
err := client.UpdateWorkspaceACL(ctx, ws.ID, codersdk.UpdateWorkspaceACL{
4870+
UserRoles: map[string]codersdk.WorkspaceRole{
4871+
uuid.NewString(): codersdk.WorkspaceRoleAdmin,
4872+
},
4873+
})
4874+
require.Error(t, err)
4875+
cerr, ok := codersdk.AsError(err)
4876+
require.True(t, ok)
4877+
require.Len(t, cerr.Validations, 1)
4878+
require.Equal(t, cerr.Validations[0].Field, "user_roles")
4879+
})
4880+
4881+
t.Run("DeletedUser", func(t *testing.T) {
4882+
t.Parallel()
4883+
4884+
dv := coderdtest.DeploymentValues(t)
4885+
dv.Experiments = []string{string(codersdk.ExperimentWorkspaceSharing)}
4886+
adminClient := coderdtest.New(t, &coderdtest.Options{
4887+
IncludeProvisionerDaemon: true,
4888+
DeploymentValues: dv,
4889+
})
4890+
adminUser := coderdtest.CreateFirstUser(t, adminClient)
4891+
orgID := adminUser.OrganizationID
4892+
client, _ := coderdtest.CreateAnotherUser(t, adminClient, orgID)
4893+
_, mike := coderdtest.CreateAnotherUser(t, adminClient, orgID)
4894+
4895+
tv := coderdtest.CreateTemplateVersion(t, adminClient, orgID, nil)
4896+
coderdtest.AwaitTemplateVersionJobCompleted(t, adminClient, tv.ID)
4897+
template := coderdtest.CreateTemplate(t, adminClient, orgID, tv.ID)
4898+
4899+
ws := coderdtest.CreateWorkspace(t, client, template.ID)
4900+
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, ws.LatestBuild.ID)
4901+
4902+
ctx := testutil.Context(t, testutil.WaitMedium)
4903+
err := adminClient.DeleteUser(ctx, mike.ID)
4904+
require.NoError(t, err)
4905+
err = client.UpdateWorkspaceACL(ctx, ws.ID, codersdk.UpdateWorkspaceACL{
4906+
UserRoles: map[string]codersdk.WorkspaceRole{
4907+
mike.ID.String(): codersdk.WorkspaceRoleAdmin,
4908+
},
4909+
})
4910+
require.Error(t, err)
4911+
cerr, ok := codersdk.AsError(err)
4912+
require.True(t, ok)
4913+
require.Len(t, cerr.Validations, 1)
4914+
require.Equal(t, cerr.Validations[0].Field, "user_roles")
4915+
})
4916+
}

enterprise/coderd/templates_test.go

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,7 @@ func TestTemplates(t *testing.T) {
7070

7171
_ = coderdtest.CreateWorkspace(t, otherClient, secondTemplate.ID)
7272

73-
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
74-
defer cancel()
73+
ctx := testutil.Context(t, testutil.WaitLong)
7574

7675
updated, err := client.UpdateTemplateMeta(ctx, template.ID, codersdk.UpdateTemplateMeta{
7776
DeprecationMessage: ptr.Ref("Stop using this template"),
@@ -185,8 +184,7 @@ func TestTemplates(t *testing.T) {
185184
ws, err := client.Workspace(context.Background(), ws.ID)
186185
require.NoError(t, err)
187186

188-
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
189-
defer cancel()
187+
ctx := testutil.Context(t, testutil.WaitLong)
190188

191189
// OK
192190
var level codersdk.WorkspaceAgentPortShareLevel = codersdk.WorkspaceAgentPortShareLevelPublic
@@ -704,8 +702,7 @@ func TestTemplates(t *testing.T) {
704702
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID)
705703
require.True(t, template.RequireActiveVersion)
706704

707-
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
708-
defer cancel()
705+
ctx := testutil.Context(t, testutil.WaitLong)
709706

710707
// Update the field and assert it persists.
711708
updatedTemplate, err := anotherClient.UpdateTemplateMeta(ctx, template.ID, codersdk.UpdateTemplateMeta{
@@ -761,9 +758,6 @@ func TestTemplates(t *testing.T) {
761758
})
762759
require.NoError(t, err)
763760

764-
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
765-
defer cancel()
766-
767761
_, err = owner.Template(ctx, template.ID)
768762
require.NoError(t, err)
769763
})
@@ -932,8 +926,7 @@ func TestTemplateACL(t *testing.T) {
932926
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
933927
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
934928

935-
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
936-
defer cancel()
929+
ctx := testutil.Context(t, testutil.WaitLong)
937930

938931
acl, err := anotherClient.TemplateACL(ctx, template.ID)
939932
require.NoError(t, err)
@@ -955,8 +948,7 @@ func TestTemplateACL(t *testing.T) {
955948
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
956949
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
957950

958-
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
959-
defer cancel()
951+
ctx := testutil.Context(t, testutil.WaitLong)
960952

961953
//nolint:gocritic // non-template-admin cannot update template acl
962954
acl, err := client.TemplateACL(ctx, template.ID)
@@ -1004,8 +996,7 @@ func TestTemplateACL(t *testing.T) {
1004996
version := coderdtest.CreateTemplateVersion(t, client, admin.OrganizationID, nil)
1005997
template := coderdtest.CreateTemplate(t, client, admin.OrganizationID, version.ID)
1006998

1007-
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
1008-
defer cancel()
999+
ctx := testutil.Context(t, testutil.WaitLong)
10091000

10101001
//nolint:gocritic // non-template-admin cannot get template acl
10111002
acl, err := client.TemplateACL(ctx, template.ID)
@@ -1267,8 +1258,7 @@ func TestUpdateTemplateACL(t *testing.T) {
12671258
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
12681259
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
12691260

1270-
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
1271-
defer cancel()
1261+
ctx := testutil.Context(t, testutil.WaitLong)
12721262

12731263
err := anotherClient.UpdateTemplateACL(ctx, template.ID, codersdk.UpdateTemplateACL{
12741264
UserPerms: map[string]codersdk.TemplateRole{
@@ -1359,8 +1349,7 @@ func TestUpdateTemplateACL(t *testing.T) {
13591349
},
13601350
}
13611351

1362-
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
1363-
defer cancel()
1352+
ctx := testutil.Context(t, testutil.WaitLong)
13641353

13651354
err := anotherClient.UpdateTemplateACL(ctx, template.ID, req)
13661355
require.NoError(t, err)
@@ -1679,8 +1668,7 @@ func TestUpdateTemplateACL(t *testing.T) {
16791668
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
16801669
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
16811670

1682-
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
1683-
defer cancel()
1671+
ctx := testutil.Context(t, testutil.WaitLong)
16841672

16851673
acl, err := anotherClient.TemplateACL(ctx, template.ID)
16861674
require.NoError(t, err)
@@ -1769,8 +1757,7 @@ func TestUpdateTemplateACL(t *testing.T) {
17691757
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
17701758
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
17711759

1772-
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
1773-
defer cancel()
1760+
ctx := testutil.Context(t, testutil.WaitLong)
17741761

17751762
acl, err := anotherClient.TemplateACL(ctx, template.ID)
17761763
require.NoError(t, err)

enterprise/coderd/workspaces_test.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3523,3 +3523,84 @@ func must[T any](value T, err error) T {
35233523
}
35243524
return value
35253525
}
3526+
3527+
func TestUpdateWorkspaceACL(t *testing.T) {
3528+
t.Parallel()
3529+
3530+
t.Run("OKWithGroup", func(t *testing.T) {
3531+
t.Parallel()
3532+
3533+
dv := coderdtest.DeploymentValues(t)
3534+
dv.Experiments = []string{string(codersdk.ExperimentWorkspaceSharing)}
3535+
adminClient, adminUser := coderdenttest.New(t, &coderdenttest.Options{
3536+
Options: &coderdtest.Options{
3537+
IncludeProvisionerDaemon: true,
3538+
DeploymentValues: dv,
3539+
},
3540+
LicenseOptions: &coderdenttest.LicenseOptions{
3541+
Features: license.Features{
3542+
codersdk.FeatureTemplateRBAC: 1,
3543+
},
3544+
},
3545+
})
3546+
orgID := adminUser.OrganizationID
3547+
client, _ := coderdtest.CreateAnotherUser(t, adminClient, orgID)
3548+
_, friend := coderdtest.CreateAnotherUser(t, adminClient, orgID)
3549+
group := coderdtest.CreateGroup(t, adminClient, orgID, "bloob")
3550+
3551+
tv := coderdtest.CreateTemplateVersion(t, adminClient, orgID, nil)
3552+
coderdtest.AwaitTemplateVersionJobCompleted(t, adminClient, tv.ID)
3553+
template := coderdtest.CreateTemplate(t, adminClient, orgID, tv.ID)
3554+
3555+
ws := coderdtest.CreateWorkspace(t, client, template.ID)
3556+
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, ws.LatestBuild.ID)
3557+
3558+
ctx := testutil.Context(t, testutil.WaitMedium)
3559+
err := client.UpdateWorkspaceACL(ctx, ws.ID, codersdk.UpdateWorkspaceACL{
3560+
UserRoles: map[string]codersdk.WorkspaceRole{
3561+
friend.ID.String(): codersdk.WorkspaceRoleAdmin,
3562+
},
3563+
GroupRoles: map[string]codersdk.WorkspaceRole{
3564+
group.ID.String(): codersdk.WorkspaceRoleAdmin,
3565+
},
3566+
})
3567+
require.NoError(t, err)
3568+
})
3569+
3570+
t.Run("UnknownIDs", func(t *testing.T) {
3571+
t.Parallel()
3572+
3573+
dv := coderdtest.DeploymentValues(t)
3574+
dv.Experiments = []string{string(codersdk.ExperimentWorkspaceSharing)}
3575+
adminClient := coderdtest.New(t, &coderdtest.Options{
3576+
IncludeProvisionerDaemon: true,
3577+
DeploymentValues: dv,
3578+
})
3579+
adminUser := coderdtest.CreateFirstUser(t, adminClient)
3580+
orgID := adminUser.OrganizationID
3581+
client, _ := coderdtest.CreateAnotherUser(t, adminClient, orgID)
3582+
3583+
tv := coderdtest.CreateTemplateVersion(t, adminClient, orgID, nil)
3584+
coderdtest.AwaitTemplateVersionJobCompleted(t, adminClient, tv.ID)
3585+
template := coderdtest.CreateTemplate(t, adminClient, orgID, tv.ID)
3586+
3587+
ws := coderdtest.CreateWorkspace(t, client, template.ID)
3588+
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, ws.LatestBuild.ID)
3589+
3590+
ctx := testutil.Context(t, testutil.WaitMedium)
3591+
err := client.UpdateWorkspaceACL(ctx, ws.ID, codersdk.UpdateWorkspaceACL{
3592+
UserRoles: map[string]codersdk.WorkspaceRole{
3593+
uuid.NewString(): codersdk.WorkspaceRoleAdmin,
3594+
},
3595+
GroupRoles: map[string]codersdk.WorkspaceRole{
3596+
uuid.NewString(): codersdk.WorkspaceRoleAdmin,
3597+
},
3598+
})
3599+
require.Error(t, err)
3600+
cerr, ok := codersdk.AsError(err)
3601+
require.True(t, ok)
3602+
require.Len(t, cerr.Validations, 2)
3603+
require.Equal(t, cerr.Validations[0].Field, "group_roles")
3604+
require.Equal(t, cerr.Validations[1].Field, "user_roles")
3605+
})
3606+
}

0 commit comments

Comments
 (0)