168 lines
5.4 KiB
Python
168 lines
5.4 KiB
Python
"""Tests for TokenService."""
|
|
|
|
from datetime import datetime, timezone
|
|
from unittest.mock import patch
|
|
|
|
import jwt
|
|
import pytest
|
|
|
|
from app.services.token_service import TokenService
|
|
|
|
|
|
class TestTokenService:
|
|
"""Test cases for TokenService."""
|
|
|
|
def test_init(self) -> None:
|
|
"""Test TokenService initialization."""
|
|
token_service = TokenService()
|
|
assert token_service.algorithm == "HS256"
|
|
assert token_service.access_token_expire_minutes == 15
|
|
assert token_service.refresh_token_expire_days == 7
|
|
|
|
def test_generate_access_token(self) -> None:
|
|
"""Test access token generation."""
|
|
token_service = TokenService()
|
|
user_data = {
|
|
"id": "123",
|
|
"email": "test@example.com",
|
|
"name": "Test User",
|
|
}
|
|
|
|
token = token_service.generate_access_token(user_data)
|
|
assert isinstance(token, str)
|
|
|
|
# Verify token content
|
|
payload = jwt.decode(
|
|
token,
|
|
token_service.secret_key,
|
|
algorithms=[token_service.algorithm],
|
|
)
|
|
assert payload["user_id"] == "123"
|
|
assert payload["email"] == "test@example.com"
|
|
assert payload["name"] == "Test User"
|
|
assert payload["type"] == "access"
|
|
|
|
def test_generate_refresh_token(self) -> None:
|
|
"""Test refresh token generation."""
|
|
token_service = TokenService()
|
|
user_data = {
|
|
"id": "123",
|
|
"email": "test@example.com",
|
|
"name": "Test User",
|
|
}
|
|
|
|
token = token_service.generate_refresh_token(user_data)
|
|
assert isinstance(token, str)
|
|
|
|
# Verify token content
|
|
payload = jwt.decode(
|
|
token,
|
|
token_service.secret_key,
|
|
algorithms=[token_service.algorithm],
|
|
)
|
|
assert payload["user_id"] == "123"
|
|
assert payload["type"] == "refresh"
|
|
|
|
def test_verify_valid_token(self) -> None:
|
|
"""Test verifying a valid token."""
|
|
token_service = TokenService()
|
|
user_data = {
|
|
"id": "123",
|
|
"email": "test@example.com",
|
|
"name": "Test User",
|
|
}
|
|
|
|
token = token_service.generate_access_token(user_data)
|
|
payload = token_service.verify_token(token)
|
|
|
|
assert payload is not None
|
|
assert payload["user_id"] == "123"
|
|
assert payload["type"] == "access"
|
|
|
|
def test_verify_invalid_token(self) -> None:
|
|
"""Test verifying an invalid token."""
|
|
token_service = TokenService()
|
|
|
|
payload = token_service.verify_token("invalid.token.here")
|
|
assert payload is None
|
|
|
|
@patch("app.services.token_service.datetime")
|
|
def test_verify_expired_token(self, mock_datetime) -> None:
|
|
"""Test verifying an expired token."""
|
|
# Set up mock to return a past time for token generation
|
|
past_time = datetime(2020, 1, 1, tzinfo=timezone.utc)
|
|
mock_datetime.now.return_value = past_time
|
|
mock_datetime.UTC = timezone.utc
|
|
|
|
token_service = TokenService()
|
|
user_data = {
|
|
"id": "123",
|
|
"email": "test@example.com",
|
|
"name": "Test User",
|
|
}
|
|
|
|
token = token_service.generate_access_token(user_data)
|
|
|
|
# Reset mock to current time for verification
|
|
mock_datetime.now.return_value = datetime.now(timezone.utc)
|
|
|
|
payload = token_service.verify_token(token)
|
|
assert payload is None
|
|
|
|
def test_is_access_token(self) -> None:
|
|
"""Test access token type checking."""
|
|
token_service = TokenService()
|
|
|
|
access_payload = {"type": "access", "user_id": "123"}
|
|
refresh_payload = {"type": "refresh", "user_id": "123"}
|
|
|
|
assert token_service.is_access_token(access_payload)
|
|
assert not token_service.is_access_token(refresh_payload)
|
|
|
|
def test_is_refresh_token(self) -> None:
|
|
"""Test refresh token type checking."""
|
|
token_service = TokenService()
|
|
|
|
access_payload = {"type": "access", "user_id": "123"}
|
|
refresh_payload = {"type": "refresh", "user_id": "123"}
|
|
|
|
assert token_service.is_refresh_token(refresh_payload)
|
|
assert not token_service.is_refresh_token(access_payload)
|
|
|
|
def test_get_user_from_access_token_valid(self) -> None:
|
|
"""Test extracting user from valid access token."""
|
|
token_service = TokenService()
|
|
user_data = {
|
|
"id": "123",
|
|
"email": "test@example.com",
|
|
"name": "Test User",
|
|
}
|
|
|
|
token = token_service.generate_access_token(user_data)
|
|
extracted_user = token_service.get_user_from_access_token(token)
|
|
|
|
assert extracted_user == user_data
|
|
|
|
def test_get_user_from_access_token_refresh_token(self) -> None:
|
|
"""Test extracting user from refresh token (should fail)."""
|
|
token_service = TokenService()
|
|
user_data = {
|
|
"id": "123",
|
|
"email": "test@example.com",
|
|
"name": "Test User",
|
|
}
|
|
|
|
token = token_service.generate_refresh_token(user_data)
|
|
extracted_user = token_service.get_user_from_access_token(token)
|
|
|
|
assert extracted_user is None
|
|
|
|
def test_get_user_from_access_token_invalid(self) -> None:
|
|
"""Test extracting user from invalid token."""
|
|
token_service = TokenService()
|
|
|
|
extracted_user = token_service.get_user_from_access_token(
|
|
"invalid.token"
|
|
)
|
|
assert extracted_user is None
|