Skip to content

Commit 8530cdf

Browse files
committed
test: Easy method for assigning roles in unit tests
1 parent e584a16 commit 8530cdf

File tree

2 files changed

+42
-29
lines changed

2 files changed

+42
-29
lines changed

coderd/coderdtest/coderdtest.go

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"encoding/base64"
1414
"encoding/json"
1515
"encoding/pem"
16+
"fmt"
1617
"io"
1718
"math/big"
1819
"net"
@@ -24,6 +25,8 @@ import (
2425
"testing"
2526
"time"
2627

28+
"github.com/coder/coder/coderd/rbac"
29+
2730
"cloud.google.com/go/compute/metadata"
2831
"github.com/fullsailor/pkcs7"
2932
"github.com/golang-jwt/jwt"
@@ -197,14 +200,14 @@ func CreateFirstUser(t *testing.T, client *codersdk.Client) codersdk.CreateFirst
197200
}
198201

199202
// CreateAnotherUser creates and authenticates a new user.
200-
func CreateAnotherUser(t *testing.T, client *codersdk.Client, organizationID uuid.UUID) *codersdk.Client {
203+
func CreateAnotherUser(t *testing.T, client *codersdk.Client, organizationID uuid.UUID, roles ...string) *codersdk.Client {
201204
req := codersdk.CreateUserRequest{
202205
Email: namesgenerator.GetRandomName(1) + "@coder.com",
203206
Username: randomUsername(),
204207
Password: "testpass",
205208
OrganizationID: organizationID,
206209
}
207-
_, err := client.CreateUser(context.Background(), req)
210+
user, err := client.CreateUser(context.Background(), req)
208211
require.NoError(t, err)
209212

210213
login, err := client.LoginWithPassword(context.Background(), codersdk.LoginWithPasswordRequest{
@@ -215,6 +218,40 @@ func CreateAnotherUser(t *testing.T, client *codersdk.Client, organizationID uui
215218

216219
other := codersdk.New(client.URL)
217220
other.SessionToken = login.SessionToken
221+
222+
if len(roles) > 0 {
223+
// Find the roles for the org vs the site wide roles
224+
orgRoles := make(map[string][]string)
225+
var siteRoles []string
226+
227+
for _, roleName := range roles {
228+
roleName := roleName
229+
orgID, ok := rbac.IsOrgRole(roleName)
230+
if ok {
231+
orgRoles[orgID] = append(orgRoles[orgID], roleName)
232+
} else {
233+
siteRoles = append(siteRoles, roleName)
234+
}
235+
}
236+
// Update the roles
237+
for _, r := range user.Roles {
238+
siteRoles = append(siteRoles, r.Name)
239+
}
240+
// TODO: @emyrk switch "other" to "client" when we support updating other
241+
// users.
242+
_, err := other.UpdateUserRoles(context.Background(), user.ID, codersdk.UpdateRoles{Roles: siteRoles})
243+
require.NoError(t, err, "update site roles")
244+
245+
// Update org roles
246+
for orgID, roles := range orgRoles {
247+
organizationID, err := uuid.Parse(orgID)
248+
require.NoError(t, err, fmt.Sprintf("parse org id %q", orgID))
249+
// TODO: @Emyrk add the member to the organization if they do not already belong.
250+
_, err = other.UpdateOrganizationMemberRoles(context.Background(), organizationID, user.ID,
251+
codersdk.UpdateRoles{Roles: append(roles, rbac.RoleOrgMember(organizationID))})
252+
require.NoError(t, err, "update org membership roles")
253+
}
254+
}
218255
return other
219256
}
220257

coderd/roles_test.go

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,11 @@ import (
1515
func TestPermissionCheck(t *testing.T) {
1616
t.Parallel()
1717

18-
ctx := context.Background()
1918
client := coderdtest.New(t, nil)
2019
// Create admin, member, and org admin
2120
admin := coderdtest.CreateFirstUser(t, client)
2221
member := coderdtest.CreateAnotherUser(t, client, admin.OrganizationID)
23-
24-
orgAdmin := coderdtest.CreateAnotherUser(t, client, admin.OrganizationID)
25-
orgAdminUser, err := orgAdmin.User(ctx, codersdk.Me)
26-
require.NoError(t, err)
27-
28-
// TODO: @emyrk switch this to the admin when getting non-personal users is
29-
// supported. `client.UpdateOrganizationMemberRoles(...)`
30-
_, err = orgAdmin.UpdateOrganizationMemberRoles(ctx, admin.OrganizationID, orgAdminUser.ID,
31-
codersdk.UpdateRoles{
32-
Roles: []string{rbac.RoleOrgMember(admin.OrganizationID), rbac.RoleOrgAdmin(admin.OrganizationID)},
33-
},
34-
)
35-
require.NoError(t, err, "update org member roles")
22+
orgAdmin := coderdtest.CreateAnotherUser(t, client, admin.OrganizationID, rbac.RoleOrgAdmin(admin.OrganizationID))
3623

3724
// With admin, member, and org admin
3825
const (
@@ -102,6 +89,7 @@ func TestPermissionCheck(t *testing.T) {
10289
for _, c := range testCases {
10390
c := c
10491
t.Run(c.Name, func(t *testing.T) {
92+
t.Parallel()
10593
resp, err := c.Client.CheckPermissions(context.Background(), codersdk.UserPermissionCheckRequest{Checks: params})
10694
require.NoError(t, err, "check perms")
10795
require.Equal(t, resp, c.Check)
@@ -117,19 +105,7 @@ func TestListRoles(t *testing.T) {
117105
// Create admin, member, and org admin
118106
admin := coderdtest.CreateFirstUser(t, client)
119107
member := coderdtest.CreateAnotherUser(t, client, admin.OrganizationID)
120-
121-
orgAdmin := coderdtest.CreateAnotherUser(t, client, admin.OrganizationID)
122-
orgAdminUser, err := orgAdmin.User(ctx, codersdk.Me)
123-
require.NoError(t, err)
124-
125-
// TODO: @emyrk switch this to the admin when getting non-personal users is
126-
// supported. `client.UpdateOrganizationMemberRoles(...)`
127-
_, err = orgAdmin.UpdateOrganizationMemberRoles(ctx, admin.OrganizationID, orgAdminUser.ID,
128-
codersdk.UpdateRoles{
129-
Roles: []string{rbac.RoleOrgMember(admin.OrganizationID), rbac.RoleOrgAdmin(admin.OrganizationID)},
130-
},
131-
)
132-
require.NoError(t, err, "update org member roles")
108+
orgAdmin := coderdtest.CreateAnotherUser(t, client, admin.OrganizationID, rbac.RoleOrgAdmin(admin.OrganizationID))
133109

134110
otherOrg, err := client.CreateOrganization(ctx, admin.UserID, codersdk.CreateOrganizationRequest{
135111
Name: "other",

0 commit comments

Comments
 (0)