package auth import ( "testing" "time" "github.com/google/uuid" "github.com/stretchr/testify/require" ) func TestJWTService_GenerateTokenWithRole(t *testing.T) { service := NewJWTService("test-secret", time.Hour) userID := uuid.New() email := "test@example.com" role := "admin" tokenString, expiresAt, err := service.GenerateTokenWithRole(userID, email, role) require.NoError(t, err) require.NotEmpty(t, tokenString) require.True(t, expiresAt.After(time.Now())) // Validate the token claims, err := service.ValidateToken(tokenString) require.NoError(t, err) require.Equal(t, userID.String(), claims.UserID) require.Equal(t, email, claims.Email) require.Equal(t, role, claims.Role) } func TestJWTService_GenerateToken_DefaultsToUserRole(t *testing.T) { service := NewJWTService("test-secret", time.Hour) userID := uuid.New() email := "test@example.com" tokenString, _, err := service.GenerateToken(userID, email) require.NoError(t, err) // Validate the token claims, err := service.ValidateToken(tokenString) require.NoError(t, err) require.Equal(t, userID.String(), claims.UserID) require.Equal(t, email, claims.Email) require.Equal(t, "user", claims.Role) // Should default to "user" } func TestJWTService_GenerateTokenWithRole_EmptyRoleDefaultsToUser(t *testing.T) { service := NewJWTService("test-secret", time.Hour) userID := uuid.New() email := "test@example.com" tokenString, _, err := service.GenerateTokenWithRole(userID, email, "") require.NoError(t, err) // Validate the token claims, err := service.ValidateToken(tokenString) require.NoError(t, err) require.Equal(t, "user", claims.Role) // Should default to "user" when empty } func TestJWTService_ValidateToken_WithRole(t *testing.T) { service := NewJWTService("test-secret", time.Hour) userID := uuid.New() email := "test@example.com" role := "admin" tokenString, _, err := service.GenerateTokenWithRole(userID, email, role) require.NoError(t, err) claims, err := service.ValidateToken(tokenString) require.NoError(t, err) require.Equal(t, userID.String(), claims.UserID) require.Equal(t, email, claims.Email) require.Equal(t, role, claims.Role) }