81 lines
2.4 KiB
Go
81 lines
2.4 KiB
Go
package services
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
|
|
"github.com/golang-jwt/jwt/v5"
|
|
"github.com/stretchr/testify/assert"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
func TestChatService_GenerateToken(t *testing.T) {
|
|
logger := zap.NewNop()
|
|
jwtSecret := "supersecretchatkey"
|
|
service := NewChatService(jwtSecret, logger)
|
|
|
|
userID := uuid.New()
|
|
username := "testuser"
|
|
|
|
tokenResponse, err := service.GenerateToken(userID, username)
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, tokenResponse)
|
|
assert.NotEmpty(t, tokenResponse.Token)
|
|
assert.Greater(t, tokenResponse.ExpiresIn, int64(0))
|
|
assert.Equal(t, "/api/v1/ws", tokenResponse.WSUrl)
|
|
|
|
// Verify token content
|
|
parsedToken, err := jwt.Parse(tokenResponse.Token, func(token *jwt.Token) (interface{}, error) {
|
|
assert.Equal(t, jwt.SigningMethodHS256, token.Method)
|
|
return []byte(jwtSecret), nil
|
|
})
|
|
assert.NoError(t, err)
|
|
assert.True(t, parsedToken.Valid)
|
|
|
|
claims, ok := parsedToken.Claims.(jwt.MapClaims)
|
|
assert.True(t, ok)
|
|
assert.Equal(t, userID.String(), claims["sub"]) // Expect string UUID
|
|
assert.Equal(t, username, claims["name"])
|
|
assert.Equal(t, "veza-chat", claims["aud"])
|
|
assert.Equal(t, "veza-backend", claims["iss"])
|
|
|
|
// Check expiration (should be close to 15 minutes)
|
|
exp := time.Unix(int64(claims["exp"].(float64)), 0)
|
|
assert.InDelta(t, time.Now().Add(15*time.Minute).Unix(), exp.Unix(), float64(time.Second*5))
|
|
}
|
|
|
|
func TestChatService_GenerateToken_EmptyUsername(t *testing.T) {
|
|
logger := zap.NewNop()
|
|
jwtSecret := "supersecretchatkey"
|
|
service := NewChatService(jwtSecret, logger)
|
|
|
|
userID := uuid.New()
|
|
username := "" // Empty username
|
|
|
|
tokenResponse, err := service.GenerateToken(userID, username)
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, tokenResponse)
|
|
assert.NotEmpty(t, tokenResponse.Token)
|
|
|
|
parsedToken, err := jwt.Parse(tokenResponse.Token, func(token *jwt.Token) (interface{}, error) {
|
|
return []byte(jwtSecret), nil
|
|
})
|
|
assert.NoError(t, err)
|
|
claims, _ := parsedToken.Claims.(jwt.MapClaims)
|
|
assert.Equal(t, username, claims["name"]) // Should still be empty
|
|
}
|
|
|
|
func TestChatService_GenerateToken_InvalidSecret(t *testing.T) {
|
|
logger := zap.NewNop()
|
|
jwtSecret := "" // Invalid secret
|
|
service := NewChatService(jwtSecret, logger)
|
|
|
|
userID := uuid.New()
|
|
username := "testuser"
|
|
|
|
_, err := service.GenerateToken(userID, username)
|
|
assert.Error(t, err)
|
|
assert.Contains(t, err.Error(), "JWT secret is not configured")
|
|
}
|