Files
ai_site/platform/internal/authx/authx_test.go
2026-07-31 10:19:22 +08:00

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)
}
}