spark-server/internal/module/admin/logic/jwt_test.go
DESKTOP-L8OUL9F\gfl0034 d3a68c3cad feat(music): 分类多对多、后台完整编辑与 OpenAPI
新增总/子分类与曲目绑定;playlist 可按 categoryId 筛选并返回分类树;
popadmin 支持行内改曲名/排序/上下架/会员开关与封面背景音频上传;文档同步。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-24 10:38:06 +08:00

83 lines
1.9 KiB
Go

package logic
import (
"testing"
"time"
"github.com/golang-jwt/jwt/v5"
)
func TestAdminJWTRoundTrip(t *testing.T) {
s := NewTokenService("wyrs-admin-jwt-secret-change-in-production-2025")
tok, err := s.CreateToken(42, "ops", "SUPER_ADMIN", "users,groups,imMessages")
if err != nil {
t.Fatal(err)
}
claims, err := s.Parse(tok)
if err != nil {
t.Fatal(err)
}
if claims.AdminID != 42 || claims.Type != TypeAdmin || claims.Subject != "ops" {
t.Fatalf("%+v", claims)
}
}
func TestAdminJWTAcceptsHS512(t *testing.T) {
secret := "wyrs-admin-jwt-secret-change-in-production-2025"
s := NewTokenService(secret)
now := time.Now()
claims := Claims{
AdminID: 1,
Role: "SUPER_ADMIN",
Type: TypeAdmin,
Permissions: "*",
RegisteredClaims: jwt.RegisteredClaims{
Subject: "admin",
IssuedAt: jwt.NewNumericDate(now),
ExpiresAt: jwt.NewNumericDate(now.Add(time.Hour)),
},
}
tok := jwt.NewWithClaims(jwt.SigningMethodHS512, &claims)
signed, err := tok.SignedString([]byte(secret))
if err != nil {
t.Fatal(err)
}
got, err := s.Parse(signed)
if err != nil {
t.Fatal(err)
}
if got.AdminID != 1 || got.Subject != "admin" {
t.Fatalf("%+v", got)
}
}
func TestAdminJWTRejectsWrongType(t *testing.T) {
s := NewTokenService("wyrs-admin-jwt-secret-change-in-production-2025")
tok, err := s.CreateToken(1, "x", "SUPER_ADMIN", "")
if err != nil {
t.Fatal(err)
}
// tamper by parsing with different secret
bad := NewTokenService("other-secret-other-secret-other!!")
if _, err := bad.Parse(tok); err == nil {
t.Fatal("expected invalid")
}
}
func TestAdminJWTShortSecretAndNil(t *testing.T) {
s := NewTokenService("short")
tok, err := s.CreateToken(1, "ops", "SUPER_ADMIN", "")
if err != nil {
t.Fatal(err)
}
if _, err := s.Parse(tok); err != nil {
t.Fatal(err)
}
if _, err := (*TokenService)(nil).Parse("x"); err == nil {
t.Fatal("nil parse")
}
if _, err := s.Parse(""); err == nil {
t.Fatal("empty")
}
}