style: apply black and isort formatting across entire codebase
- Standardize quote style (single to double quotes) - Reorder and group imports alphabetically - Fix line breaks and indentation for consistency - Apply PEP 8 formatting standards Also updated Makefile to exclude both venv and .venv from code quality checks. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -12,21 +12,18 @@ Tests cover:
|
||||
- Error handling and edge cases
|
||||
"""
|
||||
|
||||
import pytest
|
||||
from unittest.mock import Mock, MagicMock, patch
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from jose import jwt
|
||||
from fastapi import HTTPException
|
||||
from unittest.mock import MagicMock, Mock, patch
|
||||
|
||||
import pytest
|
||||
from fastapi import HTTPException
|
||||
from jose import jwt
|
||||
|
||||
from app.exceptions import (AdminRequiredException,
|
||||
InsufficientPermissionsException,
|
||||
InvalidCredentialsException, InvalidTokenException,
|
||||
TokenExpiredException, UserNotActiveException)
|
||||
from middleware.auth import AuthManager
|
||||
from app.exceptions import (
|
||||
InvalidTokenException,
|
||||
TokenExpiredException,
|
||||
UserNotActiveException,
|
||||
InvalidCredentialsException,
|
||||
AdminRequiredException,
|
||||
InsufficientPermissionsException,
|
||||
)
|
||||
from models.database.user import User
|
||||
|
||||
|
||||
@@ -124,7 +121,9 @@ class TestUserAuthentication:
|
||||
|
||||
mock_db.query.return_value.filter.return_value.first.return_value = mock_user
|
||||
|
||||
result = auth_manager.authenticate_user(mock_db, "test@example.com", "password123")
|
||||
result = auth_manager.authenticate_user(
|
||||
mock_db, "test@example.com", "password123"
|
||||
)
|
||||
|
||||
assert result is mock_user
|
||||
|
||||
@@ -192,7 +191,9 @@ class TestJWTTokenCreation:
|
||||
token = token_data["access_token"]
|
||||
|
||||
# Decode without verification to check payload
|
||||
payload = jwt.decode(token, auth_manager.secret_key, algorithms=[auth_manager.algorithm])
|
||||
payload = jwt.decode(
|
||||
token, auth_manager.secret_key, algorithms=[auth_manager.algorithm]
|
||||
)
|
||||
|
||||
assert payload["sub"] == "42"
|
||||
assert payload["username"] == "testuser"
|
||||
@@ -205,8 +206,12 @@ class TestJWTTokenCreation:
|
||||
"""Test tokens are different for different users."""
|
||||
auth_manager = AuthManager()
|
||||
|
||||
user1 = Mock(spec=User, id=1, username="user1", email="user1@test.com", role="customer")
|
||||
user2 = Mock(spec=User, id=2, username="user2", email="user2@test.com", role="vendor")
|
||||
user1 = Mock(
|
||||
spec=User, id=1, username="user1", email="user1@test.com", role="customer"
|
||||
)
|
||||
user2 = Mock(
|
||||
spec=User, id=2, username="user2", email="user2@test.com", role="vendor"
|
||||
)
|
||||
|
||||
token1 = auth_manager.create_access_token(user1)["access_token"]
|
||||
token2 = auth_manager.create_access_token(user2)["access_token"]
|
||||
@@ -227,7 +232,7 @@ class TestJWTTokenCreation:
|
||||
payload = jwt.decode(
|
||||
token_data["access_token"],
|
||||
auth_manager.secret_key,
|
||||
algorithms=[auth_manager.algorithm]
|
||||
algorithms=[auth_manager.algorithm],
|
||||
)
|
||||
|
||||
assert payload["role"] == "admin"
|
||||
@@ -311,9 +316,11 @@ class TestJWTTokenVerification:
|
||||
# Create token without 'sub' field
|
||||
payload = {
|
||||
"username": "testuser",
|
||||
"exp": datetime.now(timezone.utc) + timedelta(minutes=30)
|
||||
"exp": datetime.now(timezone.utc) + timedelta(minutes=30),
|
||||
}
|
||||
token = jwt.encode(payload, auth_manager.secret_key, algorithm=auth_manager.algorithm)
|
||||
token = jwt.encode(
|
||||
payload, auth_manager.secret_key, algorithm=auth_manager.algorithm
|
||||
)
|
||||
|
||||
with pytest.raises(InvalidTokenException) as exc_info:
|
||||
auth_manager.verify_token(token)
|
||||
@@ -325,11 +332,10 @@ class TestJWTTokenVerification:
|
||||
auth_manager = AuthManager()
|
||||
|
||||
# Create token without 'exp' field
|
||||
payload = {
|
||||
"sub": "1",
|
||||
"username": "testuser"
|
||||
}
|
||||
token = jwt.encode(payload, auth_manager.secret_key, algorithm=auth_manager.algorithm)
|
||||
payload = {"sub": "1", "username": "testuser"}
|
||||
token = jwt.encode(
|
||||
payload, auth_manager.secret_key, algorithm=auth_manager.algorithm
|
||||
)
|
||||
|
||||
with pytest.raises(InvalidTokenException) as exc_info:
|
||||
auth_manager.verify_token(token)
|
||||
@@ -343,7 +349,7 @@ class TestJWTTokenVerification:
|
||||
payload = {
|
||||
"sub": "1",
|
||||
"username": "testuser",
|
||||
"exp": datetime.now(timezone.utc) + timedelta(minutes=30)
|
||||
"exp": datetime.now(timezone.utc) + timedelta(minutes=30),
|
||||
}
|
||||
# Create token with different algorithm
|
||||
token = jwt.encode(payload, auth_manager.secret_key, algorithm="HS512")
|
||||
@@ -357,15 +363,13 @@ class TestJWTTokenVerification:
|
||||
|
||||
# Create a token with expiration in the past
|
||||
past_time = datetime.now(timezone.utc) - timedelta(minutes=1)
|
||||
payload = {
|
||||
"sub": "1",
|
||||
"username": "testuser",
|
||||
"exp": past_time.timestamp()
|
||||
}
|
||||
token = jwt.encode(payload, auth_manager.secret_key, algorithm=auth_manager.algorithm)
|
||||
payload = {"sub": "1", "username": "testuser", "exp": past_time.timestamp()}
|
||||
token = jwt.encode(
|
||||
payload, auth_manager.secret_key, algorithm=auth_manager.algorithm
|
||||
)
|
||||
|
||||
# Mock jwt.decode to bypass its expiration check and test line 205
|
||||
with patch('middleware.auth.jwt.decode') as mock_decode:
|
||||
with patch("middleware.auth.jwt.decode") as mock_decode:
|
||||
mock_decode.return_value = payload
|
||||
|
||||
with pytest.raises(TokenExpiredException):
|
||||
@@ -580,7 +584,9 @@ class TestCreateDefaultAdminUser:
|
||||
|
||||
# Existing admin user
|
||||
existing_admin = Mock(spec=User)
|
||||
mock_db.query.return_value.filter.return_value.first.return_value = existing_admin
|
||||
mock_db.query.return_value.filter.return_value.first.return_value = (
|
||||
existing_admin
|
||||
)
|
||||
|
||||
result = auth_manager.create_default_admin_user(mock_db)
|
||||
|
||||
@@ -599,19 +605,21 @@ class TestAuthManagerConfiguration:
|
||||
|
||||
def test_default_configuration(self):
|
||||
"""Test AuthManager uses default configuration."""
|
||||
with patch.dict('os.environ', {}, clear=True):
|
||||
with patch.dict("os.environ", {}, clear=True):
|
||||
auth_manager = AuthManager()
|
||||
|
||||
assert auth_manager.algorithm == "HS256"
|
||||
assert auth_manager.token_expire_minutes == 30
|
||||
assert auth_manager.secret_key == "your-secret-key-change-in-production-please"
|
||||
assert (
|
||||
auth_manager.secret_key == "your-secret-key-change-in-production-please"
|
||||
)
|
||||
|
||||
def test_custom_configuration(self):
|
||||
"""Test AuthManager uses environment variables."""
|
||||
with patch.dict('os.environ', {
|
||||
'JWT_SECRET_KEY': 'custom-secret-key',
|
||||
'JWT_EXPIRE_MINUTES': '60'
|
||||
}):
|
||||
with patch.dict(
|
||||
"os.environ",
|
||||
{"JWT_SECRET_KEY": "custom-secret-key", "JWT_EXPIRE_MINUTES": "60"},
|
||||
):
|
||||
auth_manager = AuthManager()
|
||||
|
||||
assert auth_manager.secret_key == "custom-secret-key"
|
||||
@@ -619,9 +627,7 @@ class TestAuthManagerConfiguration:
|
||||
|
||||
def test_partial_custom_configuration(self):
|
||||
"""Test AuthManager with partial environment configuration."""
|
||||
with patch.dict('os.environ', {
|
||||
'JWT_EXPIRE_MINUTES': '120'
|
||||
}, clear=False):
|
||||
with patch.dict("os.environ", {"JWT_EXPIRE_MINUTES": "120"}, clear=False):
|
||||
auth_manager = AuthManager()
|
||||
|
||||
assert auth_manager.token_expire_minutes == 120
|
||||
@@ -656,9 +662,11 @@ class TestEdgeCases:
|
||||
"sub": "1",
|
||||
"username": "testuser",
|
||||
"iat": datetime.now(timezone.utc) + timedelta(hours=1), # Future time
|
||||
"exp": datetime.now(timezone.utc) + timedelta(hours=2)
|
||||
"exp": datetime.now(timezone.utc) + timedelta(hours=2),
|
||||
}
|
||||
token = jwt.encode(payload, auth_manager.secret_key, algorithm=auth_manager.algorithm)
|
||||
token = jwt.encode(
|
||||
payload, auth_manager.secret_key, algorithm=auth_manager.algorithm
|
||||
)
|
||||
|
||||
# Should still verify successfully (JWT doesn't validate iat by default)
|
||||
result = auth_manager.verify_token(token)
|
||||
@@ -698,7 +706,9 @@ class TestEdgeCases:
|
||||
token = token_data["access_token"]
|
||||
|
||||
# Mock jose.jwt.decode to raise an unexpected exception
|
||||
with patch('middleware.auth.jwt.decode', side_effect=RuntimeError("Unexpected error")):
|
||||
with patch(
|
||||
"middleware.auth.jwt.decode", side_effect=RuntimeError("Unexpected error")
|
||||
):
|
||||
with pytest.raises(InvalidTokenException) as exc_info:
|
||||
auth_manager.verify_token(token)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user