import os
import tempfile
import jwt
import pytest
from core.oauth.token_manager import SecurityError, TokenManager
@pytest.fixture
def token_manager():
os.environ["OAUTH_JWT_SECRET_KEY"] = "test_secret_key"
# Use temporary directory for storage
with tempfile.TemporaryDirectory() as tmpdir:
os.environ["OAUTH_STORAGE_PATH"] = tmpdir
yield TokenManager()
def test_generate_access_token(token_manager):
"""Test access token generation"""
token = token_manager.generate_access_token(
client_id="test_client", scope="read write", user_id="user_123"
)
# Should be valid JWT
assert len(token.split(".")) == 3
# Validate
payload = token_manager.validate_access_token(token)
assert payload["client_id"] == "test_client"
assert payload["scope"] == "read write"
assert payload["sub"] == "user_123"
def test_access_token_expiry(token_manager):
"""Test expired token"""
# Generate with short TTL
token_manager.access_token_ttl = 1
token = token_manager.generate_access_token("client", "read")
import time
time.sleep(2)
# Should raise
with pytest.raises(jwt.ExpiredSignatureError):
token_manager.validate_access_token(token)
def test_refresh_token_rotation(token_manager):
"""Test refresh token rotation"""
# Generate initial tokens
access_token = token_manager.generate_access_token("client", "read")
refresh_token = token_manager.generate_refresh_token("client", access_token)
# Rotate
new_tokens = token_manager.rotate_refresh_token(refresh_token, "client")
assert "access_token" in new_tokens
assert "refresh_token" in new_tokens
assert new_tokens["refresh_token"] != refresh_token
# Old token should be revoked - reuse triggers SecurityError
with pytest.raises(SecurityError, match="reuse detected"):
token_manager.rotate_refresh_token(refresh_token, "client")
def test_refresh_token_reuse_detection(token_manager):
"""Test reuse detection"""
access_token = token_manager.generate_access_token("client", "read")
refresh_token = token_manager.generate_refresh_token("client", access_token)
# First rotation
token_manager.rotate_refresh_token(refresh_token, "client")
# Attempt reuse
with pytest.raises(SecurityError, match="reuse detected"):
token_manager.rotate_refresh_token(refresh_token, "client")