style: format test files with black and isort, remove unused imports

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-02-09 21:19:41 +00:00
parent acb8951dd9
commit 42cac76c0e
2 changed files with 64 additions and 60 deletions
+30 -28
View File
@@ -1,9 +1,9 @@
"""Tests for app/auth.py module.""" """Tests for app/auth.py module."""
import hashlib import hashlib
import os from unittest.mock import MagicMock, patch
import pytest import pytest
from unittest.mock import MagicMock, AsyncMock, patch
from starlette.testclient import TestClient
from fastapi import Request, status from fastapi import Request, status
from starlette.responses import RedirectResponse from starlette.responses import RedirectResponse
@@ -66,10 +66,11 @@ class TestRequireLogin:
def test_noop_when_auth_disabled(self): def test_noop_when_auth_disabled(self):
"""Test that require_login is a no-op when AUTH_ENABLED is False.""" """Test that require_login is a no-op when AUTH_ENABLED is False."""
# AUTH_ENABLED is False in test environment # AUTH_ENABLED is False in test environment
def my_func(): def my_func():
return "hello" return "hello"
decorated = require_login(my_func) decorated = require_login(my_func)
# When AUTH_ENABLED is False, the decorator returns the function unchanged # When AUTH_ENABLED is False, the decorator returns the function unchanged
assert decorated is my_func assert decorated is my_func
@@ -80,18 +81,18 @@ class TestRequireLogin:
with patch("app.auth.AUTH_ENABLED", True): with patch("app.auth.AUTH_ENABLED", True):
# Import fresh to get patched AUTH_ENABLED # Import fresh to get patched AUTH_ENABLED
from app.auth import require_login from app.auth import require_login
@require_login @require_login
async def protected_endpoint(request: Request): async def protected_endpoint(request: Request):
return {"message": "success"} return {"message": "success"}
mock_request = MagicMock(spec=Request) mock_request = MagicMock(spec=Request)
mock_request.session = {} mock_request.session = {}
mock_request.url = MagicMock() mock_request.url = MagicMock()
mock_request.url.__str__ = MagicMock(return_value="http://test.com/protected") mock_request.url.__str__ = MagicMock(return_value="http://test.com/protected")
result = await protected_endpoint(mock_request) result = await protected_endpoint(mock_request)
assert isinstance(result, RedirectResponse) assert isinstance(result, RedirectResponse)
assert result.status_code == status.HTTP_302_FOUND assert result.status_code == status.HTTP_302_FOUND
assert "/login" in str(result.headers.get("location")) assert "/login" in str(result.headers.get("location"))
@@ -101,19 +102,19 @@ class TestRequireLogin:
"""Test that require_login saves the original URL in session.""" """Test that require_login saves the original URL in session."""
with patch("app.auth.AUTH_ENABLED", True): with patch("app.auth.AUTH_ENABLED", True):
from app.auth import require_login from app.auth import require_login
@require_login @require_login
async def protected_endpoint(request: Request): async def protected_endpoint(request: Request):
return {"message": "success"} return {"message": "success"}
mock_request = MagicMock(spec=Request) mock_request = MagicMock(spec=Request)
mock_request.session = {} mock_request.session = {}
mock_request.url = MagicMock() mock_request.url = MagicMock()
original_url = "http://test.com/protected/page?param=value" original_url = "http://test.com/protected/page?param=value"
mock_request.url.__str__ = MagicMock(return_value=original_url) mock_request.url.__str__ = MagicMock(return_value=original_url)
await protected_endpoint(mock_request) await protected_endpoint(mock_request)
assert mock_request.session.get("redirect_after_login") == original_url assert mock_request.session.get("redirect_after_login") == original_url
@pytest.mark.asyncio @pytest.mark.asyncio
@@ -121,16 +122,16 @@ class TestRequireLogin:
"""Test that require_login allows access when user is in session.""" """Test that require_login allows access when user is in session."""
with patch("app.auth.AUTH_ENABLED", True): with patch("app.auth.AUTH_ENABLED", True):
from app.auth import require_login from app.auth import require_login
@require_login @require_login
async def protected_endpoint(request: Request): async def protected_endpoint(request: Request):
return {"message": "success", "user": request.session.get("user")} return {"message": "success", "user": request.session.get("user")}
mock_request = MagicMock(spec=Request) mock_request = MagicMock(spec=Request)
mock_request.session = {"user": {"id": "test_user", "name": "Test"}} mock_request.session = {"user": {"id": "test_user", "name": "Test"}}
result = await protected_endpoint(mock_request) result = await protected_endpoint(mock_request)
assert result["message"] == "success" assert result["message"] == "success"
assert result["user"]["id"] == "test_user" assert result["user"]["id"] == "test_user"
@@ -139,16 +140,16 @@ class TestRequireLogin:
"""Test that require_login correctly wraps async functions.""" """Test that require_login correctly wraps async functions."""
with patch("app.auth.AUTH_ENABLED", True): with patch("app.auth.AUTH_ENABLED", True):
from app.auth import require_login from app.auth import require_login
@require_login @require_login
async def async_endpoint(request: Request, param: str): async def async_endpoint(request: Request, param: str):
return {"message": "async", "param": param} return {"message": "async", "param": param}
mock_request = MagicMock(spec=Request) mock_request = MagicMock(spec=Request)
mock_request.session = {"user": {"id": "test"}} mock_request.session = {"user": {"id": "test"}}
result = await async_endpoint(mock_request, param="test_value") result = await async_endpoint(mock_request, param="test_value")
assert result["message"] == "async" assert result["message"] == "async"
assert result["param"] == "test_value" assert result["param"] == "test_value"
@@ -156,18 +157,19 @@ class TestRequireLogin:
"""Test that require_login correctly wraps sync functions.""" """Test that require_login correctly wraps sync functions."""
with patch("app.auth.AUTH_ENABLED", True): with patch("app.auth.AUTH_ENABLED", True):
from app.auth import require_login from app.auth import require_login
@require_login @require_login
def sync_endpoint(request: Request, param: str): def sync_endpoint(request: Request, param: str):
return {"message": "sync", "param": param} return {"message": "sync", "param": param}
mock_request = MagicMock(spec=Request) mock_request = MagicMock(spec=Request)
mock_request.session = {"user": {"id": "test"}} mock_request.session = {"user": {"id": "test"}}
# Call the decorated sync function # Call the decorated sync function
import asyncio import asyncio
result = asyncio.run(sync_endpoint(request=mock_request, param="test_value")) result = asyncio.run(sync_endpoint(request=mock_request, param="test_value"))
assert result["message"] == "sync" assert result["message"] == "sync"
assert result["param"] == "test_value" assert result["param"] == "test_value"
@@ -259,16 +261,16 @@ class TestSessionValidation:
"""Test require_login with user object missing typical fields.""" """Test require_login with user object missing typical fields."""
with patch("app.auth.AUTH_ENABLED", True): with patch("app.auth.AUTH_ENABLED", True):
from app.auth import require_login from app.auth import require_login
@require_login @require_login
async def protected_endpoint(request: Request): async def protected_endpoint(request: Request):
return {"message": "success"} return {"message": "success"}
# User object exists but is minimal # User object exists but is minimal
mock_request = MagicMock(spec=Request) mock_request = MagicMock(spec=Request)
mock_request.session = {"user": {"id": "123"}} # Missing name, email, etc. mock_request.session = {"user": {"id": "123"}} # Missing name, email, etc.
result = await protected_endpoint(mock_request) result = await protected_endpoint(mock_request)
# Should still allow access as long as user key exists # Should still allow access as long as user key exists
assert result["message"] == "success" assert result["message"] == "success"
+34 -32
View File
@@ -4,8 +4,9 @@ Tests for app/utils/encryption.py
Tests encryption/decryption functionality for sensitive settings. Tests encryption/decryption functionality for sensitive settings.
""" """
from unittest.mock import Mock, patch
import pytest import pytest
from unittest.mock import Mock, patch, MagicMock
@pytest.mark.unit @pytest.mark.unit
@@ -205,7 +206,7 @@ class TestEncryptionIntegration:
@patch("app.utils.encryption._get_cipher_suite") @patch("app.utils.encryption._get_cipher_suite")
def test_encrypt_decrypt_cycle(self, mock_cipher): def test_encrypt_decrypt_cycle(self, mock_cipher):
"""Test that encrypting and then decrypting returns original value""" """Test that encrypting and then decrypting returns original value"""
from app.utils.encryption import encrypt_value, decrypt_value from app.utils.encryption import decrypt_value, encrypt_value
# Mock a simple reversible encryption # Mock a simple reversible encryption
mock_fernet = Mock() mock_fernet = Mock()
@@ -232,110 +233,111 @@ class TestEncryptionIntegration:
def test_real_encryption_round_trip(self): def test_real_encryption_round_trip(self):
"""Test actual encryption/decryption with real cryptography library.""" """Test actual encryption/decryption with real cryptography library."""
from app.utils.encryption import encrypt_value, decrypt_value, is_encryption_available from app.utils.encryption import decrypt_value, encrypt_value, is_encryption_available
# Skip if encryption is not available # Skip if encryption is not available
if not is_encryption_available(): if not is_encryption_available():
pytest.skip("Encryption not available (cryptography library not installed)") pytest.skip("Encryption not available (cryptography library not installed)")
original_value = "my_super_secret_password_123" original_value = "my_super_secret_password_123"
# Encrypt the value # Encrypt the value
encrypted = encrypt_value(original_value) encrypted = encrypt_value(original_value)
# Should be encrypted (has enc: prefix) # Should be encrypted (has enc: prefix)
assert encrypted.startswith("enc:") assert encrypted.startswith("enc:")
assert encrypted != original_value assert encrypted != original_value
# Decrypt should return original value # Decrypt should return original value
decrypted = decrypt_value(encrypted) decrypted = decrypt_value(encrypted)
assert decrypted == original_value assert decrypted == original_value
def test_encryption_with_special_characters(self): def test_encryption_with_special_characters(self):
"""Test encryption with special characters and symbols.""" """Test encryption with special characters and symbols."""
from app.utils.encryption import encrypt_value, decrypt_value, is_encryption_available from app.utils.encryption import decrypt_value, encrypt_value, is_encryption_available
if not is_encryption_available(): if not is_encryption_available():
pytest.skip("Encryption not available") pytest.skip("Encryption not available")
original = "P@ssw0rd!#$%^&*()_+-=[]{}|;:',.<>?/~`" original = "P@ssw0rd!#$%^&*()_+-=[]{}|;:',.<>?/~`"
encrypted = encrypt_value(original) encrypted = encrypt_value(original)
decrypted = decrypt_value(encrypted) decrypted = decrypt_value(encrypted)
assert decrypted == original assert decrypted == original
def test_encryption_with_unicode(self): def test_encryption_with_unicode(self):
"""Test encryption with unicode characters.""" """Test encryption with unicode characters."""
from app.utils.encryption import encrypt_value, decrypt_value, is_encryption_available from app.utils.encryption import decrypt_value, encrypt_value, is_encryption_available
if not is_encryption_available(): if not is_encryption_available():
pytest.skip("Encryption not available") pytest.skip("Encryption not available")
original = "Hello 世界 🌍 Привет мир" original = "Hello 世界 🌍 Привет мир"
encrypted = encrypt_value(original) encrypted = encrypt_value(original)
decrypted = decrypt_value(encrypted) decrypted = decrypt_value(encrypted)
assert decrypted == original assert decrypted == original
def test_encryption_with_long_string(self): def test_encryption_with_long_string(self):
"""Test encryption with very long strings.""" """Test encryption with very long strings."""
from app.utils.encryption import encrypt_value, decrypt_value, is_encryption_available from app.utils.encryption import decrypt_value, encrypt_value, is_encryption_available
if not is_encryption_available(): if not is_encryption_available():
pytest.skip("Encryption not available") pytest.skip("Encryption not available")
# Create a long string (1000 characters) # Create a long string (1000 characters)
original = "A" * 1000 original = "A" * 1000
encrypted = encrypt_value(original) encrypted = encrypt_value(original)
decrypted = decrypt_value(encrypted) decrypted = decrypt_value(encrypted)
assert decrypted == original assert decrypted == original
assert len(decrypted) == 1000 assert len(decrypted) == 1000
def test_encryption_with_newlines_and_whitespace(self): def test_encryption_with_newlines_and_whitespace(self):
"""Test encryption preserves newlines and whitespace.""" """Test encryption preserves newlines and whitespace."""
from app.utils.encryption import encrypt_value, decrypt_value, is_encryption_available from app.utils.encryption import decrypt_value, encrypt_value, is_encryption_available
if not is_encryption_available(): if not is_encryption_available():
pytest.skip("Encryption not available") pytest.skip("Encryption not available")
original = "line1\n line2\t\ttabbed\r\nline3 " original = "line1\n line2\t\ttabbed\r\nline3 "
encrypted = encrypt_value(original) encrypted = encrypt_value(original)
decrypted = decrypt_value(encrypted) decrypted = decrypt_value(encrypted)
assert decrypted == original assert decrypted == original
def test_encryption_with_json_string(self): def test_encryption_with_json_string(self):
"""Test encryption with JSON string.""" """Test encryption with JSON string."""
from app.utils.encryption import encrypt_value, decrypt_value, is_encryption_available from app.utils.encryption import decrypt_value, encrypt_value, is_encryption_available
if not is_encryption_available(): if not is_encryption_available():
pytest.skip("Encryption not available") pytest.skip("Encryption not available")
original = '{"key": "value", "nested": {"array": [1, 2, 3]}}' original = '{"key": "value", "nested": {"array": [1, 2, 3]}}'
encrypted = encrypt_value(original) encrypted = encrypt_value(original)
decrypted = decrypt_value(encrypted) decrypted = decrypt_value(encrypted)
assert decrypted == original assert decrypted == original
def test_multiple_encrypt_same_value_produces_different_ciphertext(self): def test_multiple_encrypt_same_value_produces_different_ciphertext(self):
"""Test that encrypting the same value twice produces different ciphertext (if using random IV).""" """Test that encrypting the same value twice produces different ciphertext (if using random IV)."""
from app.utils.encryption import encrypt_value, is_encryption_available from app.utils.encryption import encrypt_value, is_encryption_available
if not is_encryption_available(): if not is_encryption_available():
pytest.skip("Encryption not available") pytest.skip("Encryption not available")
original = "same_value" original = "same_value"
encrypted1 = encrypt_value(original) encrypted1 = encrypt_value(original)
encrypted2 = encrypt_value(original) encrypted2 = encrypt_value(original)
# Both should be encrypted # Both should be encrypted
assert encrypted1.startswith("enc:") assert encrypted1.startswith("enc:")
assert encrypted2.startswith("enc:") assert encrypted2.startswith("enc:")
# Fernet uses timestamp-based encryption, so they might be different # Fernet uses timestamp-based encryption, so they might be different
# (depending on timing). This test documents the behavior. # (depending on timing). This test documents the behavior.
# We'll just verify both decrypt correctly # We'll just verify both decrypt correctly
from app.utils.encryption import decrypt_value from app.utils.encryption import decrypt_value
assert decrypt_value(encrypted1) == original assert decrypt_value(encrypted1) == original
assert decrypt_value(encrypted2) == original assert decrypt_value(encrypted2) == original