Skip to content

Commit dba617d

Browse files
committed
Add unit test for mw
1 parent 0efe72c commit dba617d

File tree

1 file changed

+128
-0
lines changed

1 file changed

+128
-0
lines changed

coderd/httpmw/authorize_test.go

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package httpmw_test
2+
3+
import (
4+
"context"
5+
"crypto/sha256"
6+
"fmt"
7+
"net/http"
8+
"net/http/httptest"
9+
"testing"
10+
"time"
11+
12+
"github.com/coder/coder/coderd/rbac"
13+
14+
"github.com/coder/coder/coderd/database"
15+
"github.com/google/uuid"
16+
17+
"github.com/coder/coder/coderd/database/databasefake"
18+
"github.com/coder/coder/coderd/httpmw"
19+
"github.com/go-chi/chi/v5"
20+
"github.com/stretchr/testify/require"
21+
)
22+
23+
func TestExtractUserRoles(t *testing.T) {
24+
testCases := []struct {
25+
Name string
26+
AddUser func(db database.Store) (database.User, []string, string)
27+
}{
28+
{
29+
Name: "Member",
30+
AddUser: func(db database.Store) (database.User, []string, string) {
31+
roles := []string{rbac.RoleMember()}
32+
user, token := addUser(t, db, roles...)
33+
return user, roles, token
34+
},
35+
},
36+
{
37+
Name: "Admin",
38+
AddUser: func(db database.Store) (database.User, []string, string) {
39+
roles := []string{rbac.RoleMember(), rbac.RoleAdmin()}
40+
user, token := addUser(t, db, roles...)
41+
return user, roles, token
42+
},
43+
},
44+
{
45+
Name: "OrgMember",
46+
AddUser: func(db database.Store) (database.User, []string, string) {
47+
roles := []string{rbac.RoleMember()}
48+
user, token := addUser(t, db, roles...)
49+
org, err := db.InsertOrganization(context.Background(), database.InsertOrganizationParams{
50+
ID: uuid.New(),
51+
Name: "testorg",
52+
Description: "test",
53+
CreatedAt: time.Now(),
54+
UpdatedAt: time.Now(),
55+
})
56+
require.NoError(t, err)
57+
58+
orgRoles := []string{rbac.RoleOrgMember(org.ID)}
59+
_, err = db.InsertOrganizationMember(context.Background(), database.InsertOrganizationMemberParams{
60+
OrganizationID: org.ID,
61+
UserID: user.ID,
62+
CreatedAt: time.Now(),
63+
UpdatedAt: time.Now(),
64+
Roles: orgRoles,
65+
})
66+
require.NoError(t, err)
67+
return user, append(roles, orgRoles...), token
68+
},
69+
},
70+
}
71+
72+
for _, c := range testCases {
73+
c := c
74+
t.Run(c.Name, func(t *testing.T) {
75+
t.Parallel()
76+
var (
77+
db = databasefake.New()
78+
user, expRoles, token = c.AddUser(db)
79+
rw = httptest.NewRecorder()
80+
rtr = chi.NewRouter()
81+
)
82+
rtr.Use(
83+
httpmw.ExtractAPIKey(db, &httpmw.OAuth2Configs{}),
84+
httpmw.ExtractUserRoles(db),
85+
)
86+
rtr.Get("/", func(_ http.ResponseWriter, r *http.Request) {
87+
roles := httpmw.UserRoles(r)
88+
require.ElementsMatch(t, user.ID, roles.ID)
89+
require.ElementsMatch(t, expRoles, roles.Roles)
90+
})
91+
92+
req := httptest.NewRequest("GET", "/", nil)
93+
req.AddCookie(&http.Cookie{
94+
Name: httpmw.AuthCookie,
95+
Value: token,
96+
})
97+
98+
rtr.ServeHTTP(rw, req)
99+
require.Equal(t, http.StatusOK, rw.Result().StatusCode)
100+
})
101+
}
102+
}
103+
104+
func addUser(t *testing.T, db database.Store, roles ...string) (database.User, string) {
105+
var (
106+
id, secret = randomAPIKeyParts()
107+
hashed = sha256.Sum256([]byte(secret))
108+
)
109+
110+
user, err := db.InsertUser(context.Background(), database.InsertUserParams{
111+
ID: uuid.New(),
112+
Email: "admin@email.com",
113+
Username: "admin",
114+
RBACRoles: roles,
115+
})
116+
require.NoError(t, err)
117+
118+
_, err = db.InsertAPIKey(context.Background(), database.InsertAPIKeyParams{
119+
ID: id,
120+
UserID: user.ID,
121+
HashedSecret: hashed[:],
122+
LastUsed: database.Now(),
123+
ExpiresAt: database.Now().Add(time.Minute),
124+
})
125+
require.NoError(t, err)
126+
127+
return user, fmt.Sprintf("%s-%s", id, secret)
128+
}

0 commit comments

Comments
 (0)