@@ -3723,6 +3723,116 @@ func TestWorkspacesFiltering(t *testing.T) {
3723
3723
require .Equal (t ,1 ,workspaces .Count ,"expected only one workspace" )
3724
3724
require .Equal (t ,workspaces .Workspaces [0 ].ID ,notSharedWorkspace .ID )
3725
3725
})
3726
+
3727
+ t .Run ("SharedWithGroupByID" ,func (t * testing.T ) {
3728
+ t .Parallel ()
3729
+
3730
+ dv := coderdtest .DeploymentValues (t )
3731
+ dv .Experiments = []string {string (codersdk .ExperimentWorkspaceSharing )}
3732
+
3733
+ var (
3734
+ client ,db ,orgOwner = coderdenttest .NewWithDatabase (t ,& coderdenttest.Options {
3735
+ Options :& coderdtest.Options {
3736
+ DeploymentValues :dv ,
3737
+ },
3738
+ LicenseOptions :& coderdenttest.LicenseOptions {
3739
+ Features : license.Features {
3740
+ codersdk .FeatureTemplateRBAC :1 ,
3741
+ },
3742
+ },
3743
+ })
3744
+ _ ,workspaceOwner = coderdtest .CreateAnotherUser (t ,client ,orgOwner .OrganizationID ,rbac .ScopedRoleOrgAuditor (orgOwner .OrganizationID ))
3745
+ sharedWorkspace = dbfake .WorkspaceBuild (t ,db , database.WorkspaceTable {
3746
+ OwnerID :workspaceOwner .ID ,
3747
+ OrganizationID :orgOwner .OrganizationID ,
3748
+ }).Do ().Workspace
3749
+ _ = dbfake .WorkspaceBuild (t ,db , database.WorkspaceTable {
3750
+ OwnerID :workspaceOwner .ID ,
3751
+ OrganizationID :orgOwner .OrganizationID ,
3752
+ }).Do ().Workspace
3753
+ ctx = testutil .Context (t ,testutil .WaitMedium )
3754
+ )
3755
+
3756
+ group ,err := client .CreateGroup (ctx ,orgOwner .OrganizationID , codersdk.CreateGroupRequest {
3757
+ Name :"wibble" ,
3758
+ })
3759
+ require .NoError (t ,err ,"create group" )
3760
+ err = client .UpdateWorkspaceACL (ctx ,sharedWorkspace .ID , codersdk.UpdateWorkspaceACL {
3761
+ GroupRoles :map [string ]codersdk.WorkspaceRole {
3762
+ group .ID .String ():codersdk .WorkspaceRoleUse ,
3763
+ },
3764
+ })
3765
+ require .NoError (t ,err )
3766
+
3767
+ workspaces ,err := client .Workspaces (ctx , codersdk.WorkspaceFilter {
3768
+ SharedWithGroup :group .ID .String (),
3769
+ })
3770
+ require .NoError (t ,err )
3771
+ require .Equal (t ,1 ,workspaces .Count )
3772
+ require .Equal (t ,sharedWorkspace .ID ,workspaces .Workspaces [0 ].ID )
3773
+ })
3774
+
3775
+ t .Run ("SharedWithGroupFilter" ,func (t * testing.T ) {
3776
+ t .Parallel ()
3777
+
3778
+ dv := coderdtest .DeploymentValues (t )
3779
+ dv .Experiments = []string {string (codersdk .ExperimentWorkspaceSharing )}
3780
+
3781
+ var (
3782
+ client ,db ,orgOwner = coderdenttest .NewWithDatabase (t ,& coderdenttest.Options {
3783
+ Options :& coderdtest.Options {
3784
+ DeploymentValues :dv ,
3785
+ },
3786
+ LicenseOptions :& coderdenttest.LicenseOptions {
3787
+ Features : license.Features {
3788
+ codersdk .FeatureTemplateRBAC :1 ,
3789
+ },
3790
+ },
3791
+ })
3792
+ _ ,workspaceOwner = coderdtest .CreateAnotherUser (t ,client ,orgOwner .OrganizationID ,rbac .ScopedRoleOrgAuditor (orgOwner .OrganizationID ))
3793
+ sharedWorkspace = dbfake .WorkspaceBuild (t ,db , database.WorkspaceTable {
3794
+ OwnerID :workspaceOwner .ID ,
3795
+ OrganizationID :orgOwner .OrganizationID ,
3796
+ }).Do ().Workspace
3797
+ _ = dbfake .WorkspaceBuild (t ,db , database.WorkspaceTable {
3798
+ OwnerID :workspaceOwner .ID ,
3799
+ OrganizationID :orgOwner .OrganizationID ,
3800
+ }).Do ().Workspace
3801
+ ctx = testutil .Context (t ,testutil .WaitMedium )
3802
+ )
3803
+
3804
+ group ,err := client .CreateGroup (ctx ,orgOwner .OrganizationID , codersdk.CreateGroupRequest {
3805
+ Name :"wibble" ,
3806
+ })
3807
+ require .NoError (t ,err ,"create group" )
3808
+ err = client .UpdateWorkspaceACL (ctx ,sharedWorkspace .ID , codersdk.UpdateWorkspaceACL {
3809
+ GroupRoles :map [string ]codersdk.WorkspaceRole {
3810
+ group .ID .String ():codersdk .WorkspaceRoleUse ,
3811
+ },
3812
+ })
3813
+ require .NoError (t ,err )
3814
+
3815
+ workspacesByID ,err := client .Workspaces (ctx , codersdk.WorkspaceFilter {
3816
+ SharedWithGroup :group .ID .String (),
3817
+ })
3818
+ require .NoError (t ,err )
3819
+ require .Equal (t ,1 ,workspacesByID .Count )
3820
+ require .Equal (t ,sharedWorkspace .ID ,workspacesByID .Workspaces [0 ].ID )
3821
+
3822
+ workspacesByName ,err := client .Workspaces (ctx , codersdk.WorkspaceFilter {
3823
+ SharedWithGroup :group .Name ,
3824
+ })
3825
+ require .NoError (t ,err )
3826
+ require .Equal (t ,1 ,workspacesByName .Count )
3827
+ require .Equal (t ,sharedWorkspace .ID ,workspacesByName .Workspaces [0 ].ID )
3828
+
3829
+ workspacesByOrgAndName ,err := client .Workspaces (ctx , codersdk.WorkspaceFilter {
3830
+ SharedWithGroup :fmt .Sprintf ("coder/%s" ,group .Name ),
3831
+ })
3832
+ require .NoError (t ,err )
3833
+ require .Equal (t ,1 ,workspacesByOrgAndName .Count )
3834
+ require .Equal (t ,sharedWorkspace .ID ,workspacesByOrgAndName .Workspaces [0 ].ID )
3835
+ })
3726
3836
}
3727
3837
3728
3838
// TestWorkspacesWithoutTemplatePerms creates a workspace for a user, then drops