1
1
package coderd_test
2
2
3
3
import (
4
- "context"
5
- "net/http"
6
4
"slices"
7
5
"testing"
8
6
@@ -11,164 +9,13 @@ import (
11
9
12
10
"github.com/coder/coder/v2/coderd/coderdtest"
13
11
"github.com/coder/coder/v2/coderd/database"
14
- "github.com/coder/coder/v2/coderd/database/db2sdk"
15
12
"github.com/coder/coder/v2/coderd/database/dbgen"
16
13
"github.com/coder/coder/v2/coderd/rbac"
17
14
"github.com/coder/coder/v2/coderd/rbac/policy"
18
15
"github.com/coder/coder/v2/codersdk"
19
16
"github.com/coder/coder/v2/testutil"
20
17
)
21
18
22
- func TestListRoles (t * testing.T ) {
23
- t .Parallel ()
24
-
25
- client := coderdtest .New (t , nil )
26
- // Create owner, member, and org admin
27
- owner := coderdtest .CreateFirstUser (t , client )
28
- member , _ := coderdtest .CreateAnotherUser (t , client , owner .OrganizationID )
29
- orgAdmin , _ := coderdtest .CreateAnotherUser (t , client , owner .OrganizationID , rbac .ScopedRoleOrgAdmin (owner .OrganizationID ))
30
-
31
- ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
32
- t .Cleanup (cancel )
33
-
34
- otherOrg , err := client .CreateOrganization (ctx , codersdk.CreateOrganizationRequest {
35
- Name : "other" ,
36
- })
37
- require .NoError (t , err , "create org" )
38
-
39
- const notFound = "Resource not found"
40
- testCases := []struct {
41
- Name string
42
- Client * codersdk.Client
43
- APICall func (context.Context ) ([]codersdk.AssignableRoles , error )
44
- ExpectedRoles []codersdk.AssignableRoles
45
- AuthorizedError string
46
- }{
47
- {
48
- // Members cannot assign any roles
49
- Name : "MemberListSite" ,
50
- APICall : func (ctx context.Context ) ([]codersdk.AssignableRoles , error ) {
51
- x , err := member .ListSiteRoles (ctx )
52
- return x , err
53
- },
54
- ExpectedRoles : convertRoles (map [rbac.RoleIdentifier ]bool {
55
- {Name : codersdk .RoleOwner }: false ,
56
- {Name : codersdk .RoleAuditor }: false ,
57
- {Name : codersdk .RoleTemplateAdmin }: false ,
58
- {Name : codersdk .RoleUserAdmin }: false ,
59
- }),
60
- },
61
- {
62
- Name : "OrgMemberListOrg" ,
63
- APICall : func (ctx context.Context ) ([]codersdk.AssignableRoles , error ) {
64
- return member .ListOrganizationRoles (ctx , owner .OrganizationID )
65
- },
66
- ExpectedRoles : convertRoles (map [rbac.RoleIdentifier ]bool {
67
- {Name : codersdk .RoleOrganizationAdmin , OrganizationID : owner .OrganizationID }: false ,
68
- {Name : codersdk .RoleOrganizationAuditor , OrganizationID : owner .OrganizationID }: false ,
69
- {Name : codersdk .RoleOrganizationTemplateAdmin , OrganizationID : owner .OrganizationID }: false ,
70
- {Name : codersdk .RoleOrganizationUserAdmin , OrganizationID : owner .OrganizationID }: false ,
71
- }),
72
- },
73
- {
74
- Name : "NonOrgMemberListOrg" ,
75
- APICall : func (ctx context.Context ) ([]codersdk.AssignableRoles , error ) {
76
- return member .ListOrganizationRoles (ctx , otherOrg .ID )
77
- },
78
- AuthorizedError : notFound ,
79
- },
80
- // Org admin
81
- {
82
- Name : "OrgAdminListSite" ,
83
- APICall : func (ctx context.Context ) ([]codersdk.AssignableRoles , error ) {
84
- return orgAdmin .ListSiteRoles (ctx )
85
- },
86
- ExpectedRoles : convertRoles (map [rbac.RoleIdentifier ]bool {
87
- {Name : codersdk .RoleOwner }: false ,
88
- {Name : codersdk .RoleAuditor }: false ,
89
- {Name : codersdk .RoleTemplateAdmin }: false ,
90
- {Name : codersdk .RoleUserAdmin }: false ,
91
- }),
92
- },
93
- {
94
- Name : "OrgAdminListOrg" ,
95
- APICall : func (ctx context.Context ) ([]codersdk.AssignableRoles , error ) {
96
- return orgAdmin .ListOrganizationRoles (ctx , owner .OrganizationID )
97
- },
98
- ExpectedRoles : convertRoles (map [rbac.RoleIdentifier ]bool {
99
- {Name : codersdk .RoleOrganizationAdmin , OrganizationID : owner .OrganizationID }: true ,
100
- {Name : codersdk .RoleOrganizationAuditor , OrganizationID : owner .OrganizationID }: true ,
101
- {Name : codersdk .RoleOrganizationTemplateAdmin , OrganizationID : owner .OrganizationID }: true ,
102
- {Name : codersdk .RoleOrganizationUserAdmin , OrganizationID : owner .OrganizationID }: true ,
103
- }),
104
- },
105
- {
106
- Name : "OrgAdminListOtherOrg" ,
107
- APICall : func (ctx context.Context ) ([]codersdk.AssignableRoles , error ) {
108
- return orgAdmin .ListOrganizationRoles (ctx , otherOrg .ID )
109
- },
110
- AuthorizedError : notFound ,
111
- },
112
- // Admin
113
- {
114
- Name : "AdminListSite" ,
115
- APICall : func (ctx context.Context ) ([]codersdk.AssignableRoles , error ) {
116
- return client .ListSiteRoles (ctx )
117
- },
118
- ExpectedRoles : convertRoles (map [rbac.RoleIdentifier ]bool {
119
- {Name : codersdk .RoleOwner }: true ,
120
- {Name : codersdk .RoleAuditor }: true ,
121
- {Name : codersdk .RoleTemplateAdmin }: true ,
122
- {Name : codersdk .RoleUserAdmin }: true ,
123
- }),
124
- },
125
- {
126
- Name : "AdminListOrg" ,
127
- APICall : func (ctx context.Context ) ([]codersdk.AssignableRoles , error ) {
128
- return client .ListOrganizationRoles (ctx , owner .OrganizationID )
129
- },
130
- ExpectedRoles : convertRoles (map [rbac.RoleIdentifier ]bool {
131
- {Name : codersdk .RoleOrganizationAdmin , OrganizationID : owner .OrganizationID }: true ,
132
- {Name : codersdk .RoleOrganizationAuditor , OrganizationID : owner .OrganizationID }: true ,
133
- {Name : codersdk .RoleOrganizationTemplateAdmin , OrganizationID : owner .OrganizationID }: true ,
134
- {Name : codersdk .RoleOrganizationUserAdmin , OrganizationID : owner .OrganizationID }: true ,
135
- }),
136
- },
137
- }
138
-
139
- for _ , c := range testCases {
140
- c := c
141
- t .Run (c .Name , func (t * testing.T ) {
142
- t .Parallel ()
143
-
144
- ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
145
- defer cancel ()
146
-
147
- roles , err := c .APICall (ctx )
148
- if c .AuthorizedError != "" {
149
- var apiErr * codersdk.Error
150
- require .ErrorAs (t , err , & apiErr )
151
- require .Equal (t , http .StatusNotFound , apiErr .StatusCode ())
152
- require .Contains (t , apiErr .Message , c .AuthorizedError )
153
- } else {
154
- require .NoError (t , err )
155
- ignorePerms := func (f codersdk.AssignableRoles ) codersdk.AssignableRoles {
156
- return codersdk.AssignableRoles {
157
- Role : codersdk.Role {
158
- Name : f .Name ,
159
- DisplayName : f .DisplayName ,
160
- },
161
- Assignable : f .Assignable ,
162
- BuiltIn : true ,
163
- }
164
- }
165
- expected := db2sdk .List (c .ExpectedRoles , ignorePerms )
166
- found := db2sdk .List (roles , ignorePerms )
167
- require .ElementsMatch (t , expected , found )
168
- }
169
- })
170
- }
171
- }
172
19
173
20
func TestListCustomRoles (t * testing.T ) {
174
21
t .Parallel ()
@@ -209,19 +56,3 @@ func TestListCustomRoles(t *testing.T) {
209
56
})
210
57
}
211
58
212
- func convertRole (roleName rbac.RoleIdentifier ) codersdk.Role {
213
- role , _ := rbac .RoleByName (roleName )
214
- return db2sdk .RBACRole (role )
215
- }
216
-
217
- func convertRoles (assignableRoles map [rbac.RoleIdentifier ]bool ) []codersdk.AssignableRoles {
218
- converted := make ([]codersdk.AssignableRoles , 0 , len (assignableRoles ))
219
- for roleName , assignable := range assignableRoles {
220
- role := convertRole (roleName )
221
- converted = append (converted , codersdk.AssignableRoles {
222
- Role : role ,
223
- Assignable : assignable ,
224
- })
225
- }
226
- return converted
227
- }
0 commit comments