79 lines
2.1 KiB
Go
79 lines
2.1 KiB
Go
package authx_test
|
|
|
|
import (
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"aijianzhan/platform/internal/authx"
|
|
)
|
|
|
|
func TestIssueAndParseToken(t *testing.T) {
|
|
cfg := authx.JWTConfig{AccessSecret: "test-secret", AccessExpire: 3600}
|
|
tok, exp, err := authx.IssueToken(cfg, 9, 42, "owner", 0)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tok == "" || exp <= 0 {
|
|
t.Fatal("empty token")
|
|
}
|
|
claims, err := authx.ParseToken(cfg, tok)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if claims.TenantID != 9 || claims.UserID != 42 {
|
|
t.Fatalf("claims mismatch: %+v", claims)
|
|
}
|
|
}
|
|
|
|
func TestMiddlewareRequiresJWT(t *testing.T) {
|
|
cfg := authx.JWTConfig{AccessSecret: "test-secret", AccessExpire: 3600}
|
|
mw := authx.Middleware(cfg, false)
|
|
called := false
|
|
h := mw(func(w http.ResponseWriter, r *http.Request) {
|
|
called = true
|
|
w.WriteHeader(http.StatusOK)
|
|
})
|
|
|
|
req := httptest.NewRequest(http.MethodGet, "/x", nil)
|
|
rr := httptest.NewRecorder()
|
|
h(rr, req)
|
|
if rr.Code != http.StatusUnauthorized || called {
|
|
t.Fatalf("expected 401 without token, got %d called=%v", rr.Code, called)
|
|
}
|
|
|
|
tok, _, err := authx.IssueToken(cfg, 1, 2, "owner", 0)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
req2 := httptest.NewRequest(http.MethodGet, "/x", nil)
|
|
req2.Header.Set("Authorization", "Bearer "+tok)
|
|
rr2 := httptest.NewRecorder()
|
|
h(rr2, req2)
|
|
if rr2.Code != http.StatusOK || !called {
|
|
t.Fatalf("expected 200 with token, got %d", rr2.Code)
|
|
}
|
|
if authx.TenantID(req2.Context()) != 0 {
|
|
// context is on the request passed to next; check via handler
|
|
}
|
|
}
|
|
|
|
func TestMiddlewareInjectsClaims(t *testing.T) {
|
|
cfg := authx.JWTConfig{AccessSecret: "test-secret", AccessExpire: 3600}
|
|
tok, _, _ := authx.IssueToken(cfg, 7, 8, "editor", 0)
|
|
mw := authx.Middleware(cfg, false)
|
|
var gotTenant, gotUser int64
|
|
h := mw(func(w http.ResponseWriter, r *http.Request) {
|
|
gotTenant = authx.TenantID(r.Context())
|
|
gotUser = authx.UserID(r.Context())
|
|
w.WriteHeader(http.StatusOK)
|
|
})
|
|
req := httptest.NewRequest(http.MethodGet, "/x", nil)
|
|
req.Header.Set("Authorization", "Bearer "+tok)
|
|
rr := httptest.NewRecorder()
|
|
h(rr, req)
|
|
if gotTenant != 7 || gotUser != 8 {
|
|
t.Fatalf("got tenant=%d user=%d", gotTenant, gotUser)
|
|
}
|
|
}
|