Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit aa2c2be

Browse files
committed
chore: add tests for sharing remove command
1 parent fd8844b commit aa2c2be

File tree

2 files changed

+266
-1
lines changed

2 files changed

+266
-1
lines changed

cli/sharing_test.go

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,3 +217,117 @@ func TestSharingStatus(t *testing.T) {
217217
assert.True(t, found, "expected to find username %s with role %s in the output: %s", toShareWithUser.Username, codersdk.WorkspaceRoleUse, out.String())
218218
})
219219
}
220+
221+
func TestSharingRemove(t *testing.T) {
222+
t.Parallel()
223+
224+
dv := coderdtest.DeploymentValues(t)
225+
dv.Experiments = []string{string(codersdk.ExperimentWorkspaceSharing)}
226+
227+
t.Run("RemoveSharedUser_Simple", func(t *testing.T) {
228+
t.Parallel()
229+
230+
var (
231+
client, db = coderdtest.NewWithDatabase(t, &coderdtest.Options{
232+
DeploymentValues: dv,
233+
})
234+
orgOwner = coderdtest.CreateFirstUser(t, client)
235+
workspaceOwnerClient, workspaceOwner = coderdtest.CreateAnotherUser(t, client, orgOwner.OrganizationID, rbac.ScopedRoleOrgAuditor(orgOwner.OrganizationID))
236+
workspace = dbfake.WorkspaceBuild(t, db, database.WorkspaceTable{
237+
OwnerID: workspaceOwner.ID,
238+
OrganizationID: orgOwner.OrganizationID,
239+
}).Do().Workspace
240+
_, toRemoveUser = coderdtest.CreateAnotherUser(t, client, orgOwner.OrganizationID)
241+
_, toShareWithUser = coderdtest.CreateAnotherUser(t, client, orgOwner.OrganizationID)
242+
)
243+
244+
ctx := testutil.Context(t, testutil.WaitMedium)
245+
246+
// Share the workspace with a user to later remove
247+
err := client.UpdateWorkspaceACL(ctx, workspace.ID, codersdk.UpdateWorkspaceACL{
248+
UserRoles: map[string]codersdk.WorkspaceRole{
249+
toShareWithUser.ID.String(): codersdk.WorkspaceRoleUse,
250+
toRemoveUser.ID.String(): codersdk.WorkspaceRoleUse,
251+
},
252+
})
253+
require.NoError(t, err)
254+
255+
inv, root := clitest.New(t,
256+
"sharing",
257+
"remove",
258+
workspace.Name,
259+
"--org", orgOwner.OrganizationID.String(),
260+
"--user", toRemoveUser.Username,
261+
)
262+
clitest.SetupConfig(t, workspaceOwnerClient, root)
263+
264+
out := bytes.NewBuffer(nil)
265+
inv.Stdout = out
266+
err = inv.WithContext(ctx).Run()
267+
require.NoError(t, err)
268+
269+
acl, err := workspaceOwnerClient.WorkspaceACL(inv.Context(), workspace.ID)
270+
require.NoError(t, err)
271+
272+
removedCorrectUser := true
273+
keptOtherUser := false
274+
for _, user := range acl.Users {
275+
if user.ID == toRemoveUser.ID {
276+
removedCorrectUser = false
277+
}
278+
279+
if user.ID == toShareWithUser.ID {
280+
keptOtherUser = true
281+
}
282+
}
283+
assert.True(t, removedCorrectUser)
284+
assert.True(t, keptOtherUser)
285+
})
286+
287+
t.Run("RemoveSharedUser_Multiple", func(t *testing.T) {
288+
t.Parallel()
289+
290+
var (
291+
client, db = coderdtest.NewWithDatabase(t, &coderdtest.Options{
292+
DeploymentValues: dv,
293+
})
294+
orgOwner = coderdtest.CreateFirstUser(t, client)
295+
workspaceOwnerClient, workspaceOwner = coderdtest.CreateAnotherUser(t, client, orgOwner.OrganizationID, rbac.ScopedRoleOrgAuditor(orgOwner.OrganizationID))
296+
workspace = dbfake.WorkspaceBuild(t, db, database.WorkspaceTable{
297+
OwnerID: workspaceOwner.ID,
298+
OrganizationID: orgOwner.OrganizationID,
299+
}).Do().Workspace
300+
_, toRemoveUser1 = coderdtest.CreateAnotherUser(t, client, orgOwner.OrganizationID)
301+
_, toRemoveUser2 = coderdtest.CreateAnotherUser(t, client, orgOwner.OrganizationID)
302+
)
303+
304+
ctx := testutil.Context(t, testutil.WaitMedium)
305+
306+
// Share the workspace with a user to later remove
307+
err := client.UpdateWorkspaceACL(ctx, workspace.ID, codersdk.UpdateWorkspaceACL{
308+
UserRoles: map[string]codersdk.WorkspaceRole{
309+
toRemoveUser2.ID.String(): codersdk.WorkspaceRoleUse,
310+
toRemoveUser1.ID.String(): codersdk.WorkspaceRoleUse,
311+
},
312+
})
313+
require.NoError(t, err)
314+
315+
inv, root := clitest.New(t,
316+
"sharing",
317+
"remove",
318+
workspace.Name,
319+
"--org", orgOwner.OrganizationID.String(),
320+
fmt.Sprintf("--user=%s,%s", toRemoveUser1.Username, toRemoveUser2.Username),
321+
)
322+
clitest.SetupConfig(t, workspaceOwnerClient, root)
323+
324+
out := bytes.NewBuffer(nil)
325+
inv.Stdout = out
326+
err = inv.WithContext(ctx).Run()
327+
require.NoError(t, err)
328+
329+
acl, err := workspaceOwnerClient.WorkspaceACL(inv.Context(), workspace.ID)
330+
require.NoError(t, err)
331+
assert.Empty(t, acl.Users)
332+
})
333+
}

enterprise/cli/sharing_test.go

Lines changed: 152 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323
"github.com/coder/coder/v2/testutil"
2424
)
2525

26-
func TestSharingShareEnterprise(t *testing.T) {
26+
func TestSharingShare(t *testing.T) {
2727
t.Parallel()
2828

2929
dv := coderdtest.DeploymentValues(t)
@@ -245,6 +245,157 @@ func TestSharingStatus(t *testing.T) {
245245
})
246246
}
247247

248+
func TestSharingRemove(t *testing.T) {
249+
t.Parallel()
250+
251+
dv := coderdtest.DeploymentValues(t)
252+
dv.Experiments = []string{string(codersdk.ExperimentWorkspaceSharing)}
253+
254+
t.Run("RemoveSharedGroup_Single", func(t *testing.T) {
255+
t.Parallel()
256+
257+
var (
258+
client, db, orgOwner = coderdenttest.NewWithDatabase(t, &coderdenttest.Options{
259+
Options: &coderdtest.Options{
260+
DeploymentValues: dv,
261+
},
262+
LicenseOptions: &coderdenttest.LicenseOptions{
263+
Features: license.Features{
264+
codersdk.FeatureTemplateRBAC: 1,
265+
},
266+
},
267+
})
268+
workspaceOwnerClient, workspaceOwner = coderdtest.CreateAnotherUser(t, client, orgOwner.OrganizationID, rbac.ScopedRoleOrgAuditor(orgOwner.OrganizationID))
269+
workspace = dbfake.WorkspaceBuild(t, db, database.WorkspaceTable{
270+
OwnerID: workspaceOwner.ID,
271+
OrganizationID: orgOwner.OrganizationID,
272+
}).Do().Workspace
273+
_, groupUser1 = coderdtest.CreateAnotherUser(t, client, orgOwner.OrganizationID)
274+
_, groupUser2 = coderdtest.CreateAnotherUser(t, client, orgOwner.OrganizationID)
275+
)
276+
277+
ctx := testutil.Context(t, testutil.WaitMedium)
278+
279+
group1, err := createGroupWithMembers(ctx, client, orgOwner.OrganizationID, "group-1", []uuid.UUID{groupUser1.ID, groupUser2.ID})
280+
require.NoError(t, err)
281+
282+
group2, err := createGroupWithMembers(ctx, client, orgOwner.OrganizationID, "group-2", []uuid.UUID{groupUser1.ID, groupUser2.ID})
283+
require.NoError(t, err)
284+
285+
// Share the workspace with a user to later remove
286+
err = client.UpdateWorkspaceACL(ctx, workspace.ID, codersdk.UpdateWorkspaceACL{
287+
GroupRoles: map[string]codersdk.WorkspaceRole{
288+
group1.ID.String(): codersdk.WorkspaceRoleUse,
289+
group2.ID.String(): codersdk.WorkspaceRoleUse,
290+
},
291+
})
292+
require.NoError(t, err)
293+
294+
inv, root := clitest.New(t,
295+
"sharing",
296+
"remove",
297+
workspace.Name,
298+
"--org", orgOwner.OrganizationID.String(),
299+
"--group", group1.Name,
300+
)
301+
clitest.SetupConfig(t, workspaceOwnerClient, root)
302+
303+
err = inv.WithContext(ctx).Run()
304+
require.NoError(t, err)
305+
306+
acl, err := workspaceOwnerClient.WorkspaceACL(inv.Context(), workspace.ID)
307+
require.NoError(t, err)
308+
309+
removedGroup1 := true
310+
removedGroup2 := true
311+
for _, group := range acl.Groups {
312+
if group.ID == group1.ID {
313+
removedGroup1 = false
314+
continue
315+
}
316+
317+
if group.ID == group2.ID {
318+
removedGroup2 = false
319+
continue
320+
}
321+
}
322+
assert.True(t, removedGroup1)
323+
assert.False(t, removedGroup2)
324+
})
325+
326+
t.Run("RemoveSharedGroup_Multiple", func(t *testing.T) {
327+
t.Parallel()
328+
329+
var (
330+
client, db, orgOwner = coderdenttest.NewWithDatabase(t, &coderdenttest.Options{
331+
Options: &coderdtest.Options{
332+
DeploymentValues: dv,
333+
},
334+
LicenseOptions: &coderdenttest.LicenseOptions{
335+
Features: license.Features{
336+
codersdk.FeatureTemplateRBAC: 1,
337+
},
338+
},
339+
})
340+
workspaceOwnerClient, workspaceOwner = coderdtest.CreateAnotherUser(t, client, orgOwner.OrganizationID, rbac.ScopedRoleOrgAuditor(orgOwner.OrganizationID))
341+
workspace = dbfake.WorkspaceBuild(t, db, database.WorkspaceTable{
342+
OwnerID: workspaceOwner.ID,
343+
OrganizationID: orgOwner.OrganizationID,
344+
}).Do().Workspace
345+
_, groupUser1 = coderdtest.CreateAnotherUser(t, client, orgOwner.OrganizationID)
346+
_, groupUser2 = coderdtest.CreateAnotherUser(t, client, orgOwner.OrganizationID)
347+
)
348+
349+
ctx := testutil.Context(t, testutil.WaitMedium)
350+
351+
group1, err := createGroupWithMembers(ctx, client, orgOwner.OrganizationID, "group-1", []uuid.UUID{groupUser1.ID, groupUser2.ID})
352+
require.NoError(t, err)
353+
354+
group2, err := createGroupWithMembers(ctx, client, orgOwner.OrganizationID, "group-2", []uuid.UUID{groupUser1.ID, groupUser2.ID})
355+
require.NoError(t, err)
356+
357+
// Share the workspace with a user to later remove
358+
err = client.UpdateWorkspaceACL(ctx, workspace.ID, codersdk.UpdateWorkspaceACL{
359+
GroupRoles: map[string]codersdk.WorkspaceRole{
360+
group1.ID.String(): codersdk.WorkspaceRoleUse,
361+
group2.ID.String(): codersdk.WorkspaceRoleUse,
362+
},
363+
})
364+
require.NoError(t, err)
365+
366+
inv, root := clitest.New(t,
367+
"sharing",
368+
"remove",
369+
workspace.Name,
370+
"--org", orgOwner.OrganizationID.String(),
371+
fmt.Sprintf("--group=%s,%s", group1.Name, group2.Name),
372+
)
373+
clitest.SetupConfig(t, workspaceOwnerClient, root)
374+
375+
err = inv.WithContext(ctx).Run()
376+
require.NoError(t, err)
377+
378+
acl, err := workspaceOwnerClient.WorkspaceACL(inv.Context(), workspace.ID)
379+
require.NoError(t, err)
380+
381+
removedGroup1 := true
382+
removedGroup2 := true
383+
for _, group := range acl.Groups {
384+
if group.ID == group1.ID {
385+
removedGroup1 = false
386+
continue
387+
}
388+
389+
if group.ID == group2.ID {
390+
removedGroup2 = false
391+
continue
392+
}
393+
}
394+
assert.True(t, removedGroup1)
395+
assert.True(t, removedGroup2)
396+
})
397+
}
398+
248399
func createGroupWithMembers(ctx context.Context, client *codersdk.Client, orgID uuid.UUID, name string, memberIDs []uuid.UUID) (codersdk.Group, error) {
249400
group, err := client.CreateGroup(ctx, orgID, codersdk.CreateGroupRequest{
250401
Name: name,

0 commit comments

Comments
 (0)