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:
@@ -11,17 +11,16 @@ Tests cover:
|
||||
- Edge cases and error handling
|
||||
"""
|
||||
|
||||
from unittest.mock import AsyncMock, MagicMock, Mock, patch
|
||||
|
||||
import pytest
|
||||
from unittest.mock import Mock, MagicMock, patch, AsyncMock
|
||||
from fastapi import Request, HTTPException
|
||||
from fastapi import HTTPException, Request
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from middleware.vendor_context import (
|
||||
VendorContextManager,
|
||||
VendorContextMiddleware,
|
||||
get_current_vendor,
|
||||
require_vendor_context,
|
||||
)
|
||||
from middleware.vendor_context import (VendorContextManager,
|
||||
VendorContextMiddleware,
|
||||
get_current_vendor,
|
||||
require_vendor_context)
|
||||
|
||||
|
||||
@pytest.mark.unit
|
||||
@@ -39,7 +38,7 @@ class TestVendorContextManager:
|
||||
request.headers = {"host": "customdomain1.com"}
|
||||
request.url = Mock(path="/")
|
||||
|
||||
with patch('middleware.vendor_context.settings') as mock_settings:
|
||||
with patch("middleware.vendor_context.settings") as mock_settings:
|
||||
mock_settings.platform_domain = "platform.com"
|
||||
|
||||
context = VendorContextManager.detect_vendor_context(request)
|
||||
@@ -55,7 +54,7 @@ class TestVendorContextManager:
|
||||
request.headers = {"host": "customdomain1.com:8000"}
|
||||
request.url = Mock(path="/")
|
||||
|
||||
with patch('middleware.vendor_context.settings') as mock_settings:
|
||||
with patch("middleware.vendor_context.settings") as mock_settings:
|
||||
mock_settings.platform_domain = "platform.com"
|
||||
|
||||
context = VendorContextManager.detect_vendor_context(request)
|
||||
@@ -71,7 +70,7 @@ class TestVendorContextManager:
|
||||
request.headers = {"host": "vendor1.platform.com"}
|
||||
request.url = Mock(path="/")
|
||||
|
||||
with patch('middleware.vendor_context.settings') as mock_settings:
|
||||
with patch("middleware.vendor_context.settings") as mock_settings:
|
||||
mock_settings.platform_domain = "platform.com"
|
||||
|
||||
context = VendorContextManager.detect_vendor_context(request)
|
||||
@@ -87,7 +86,7 @@ class TestVendorContextManager:
|
||||
request.headers = {"host": "vendor1.platform.com:8000"}
|
||||
request.url = Mock(path="/")
|
||||
|
||||
with patch('middleware.vendor_context.settings') as mock_settings:
|
||||
with patch("middleware.vendor_context.settings") as mock_settings:
|
||||
mock_settings.platform_domain = "platform.com"
|
||||
|
||||
context = VendorContextManager.detect_vendor_context(request)
|
||||
@@ -140,7 +139,7 @@ class TestVendorContextManager:
|
||||
request.headers = {"host": "admin.platform.com"}
|
||||
request.url = Mock(path="/")
|
||||
|
||||
with patch('middleware.vendor_context.settings') as mock_settings:
|
||||
with patch("middleware.vendor_context.settings") as mock_settings:
|
||||
mock_settings.platform_domain = "platform.com"
|
||||
|
||||
context = VendorContextManager.detect_vendor_context(request)
|
||||
@@ -153,7 +152,7 @@ class TestVendorContextManager:
|
||||
request.headers = {"host": "www.platform.com"}
|
||||
request.url = Mock(path="/")
|
||||
|
||||
with patch('middleware.vendor_context.settings') as mock_settings:
|
||||
with patch("middleware.vendor_context.settings") as mock_settings:
|
||||
mock_settings.platform_domain = "platform.com"
|
||||
|
||||
context = VendorContextManager.detect_vendor_context(request)
|
||||
@@ -166,7 +165,7 @@ class TestVendorContextManager:
|
||||
request.headers = {"host": "api.platform.com"}
|
||||
request.url = Mock(path="/")
|
||||
|
||||
with patch('middleware.vendor_context.settings') as mock_settings:
|
||||
with patch("middleware.vendor_context.settings") as mock_settings:
|
||||
mock_settings.platform_domain = "platform.com"
|
||||
|
||||
context = VendorContextManager.detect_vendor_context(request)
|
||||
@@ -179,7 +178,7 @@ class TestVendorContextManager:
|
||||
request.headers = {"host": "localhost"}
|
||||
request.url = Mock(path="/")
|
||||
|
||||
with patch('middleware.vendor_context.settings') as mock_settings:
|
||||
with patch("middleware.vendor_context.settings") as mock_settings:
|
||||
mock_settings.platform_domain = "platform.com"
|
||||
|
||||
context = VendorContextManager.detect_vendor_context(request)
|
||||
@@ -198,12 +197,11 @@ class TestVendorContextManager:
|
||||
mock_vendor.is_active = True
|
||||
mock_vendor_domain.vendor = mock_vendor
|
||||
|
||||
mock_db.query.return_value.filter.return_value.filter.return_value.filter.return_value.first.return_value = mock_vendor_domain
|
||||
mock_db.query.return_value.filter.return_value.filter.return_value.filter.return_value.first.return_value = (
|
||||
mock_vendor_domain
|
||||
)
|
||||
|
||||
context = {
|
||||
"detection_method": "custom_domain",
|
||||
"domain": "customdomain1.com"
|
||||
}
|
||||
context = {"detection_method": "custom_domain", "domain": "customdomain1.com"}
|
||||
|
||||
vendor = VendorContextManager.get_vendor_from_context(mock_db, context)
|
||||
|
||||
@@ -218,12 +216,11 @@ class TestVendorContextManager:
|
||||
mock_vendor.is_active = False
|
||||
mock_vendor_domain.vendor = mock_vendor
|
||||
|
||||
mock_db.query.return_value.filter.return_value.filter.return_value.filter.return_value.first.return_value = mock_vendor_domain
|
||||
mock_db.query.return_value.filter.return_value.filter.return_value.filter.return_value.first.return_value = (
|
||||
mock_vendor_domain
|
||||
)
|
||||
|
||||
context = {
|
||||
"detection_method": "custom_domain",
|
||||
"domain": "customdomain1.com"
|
||||
}
|
||||
context = {"detection_method": "custom_domain", "domain": "customdomain1.com"}
|
||||
|
||||
vendor = VendorContextManager.get_vendor_from_context(mock_db, context)
|
||||
|
||||
@@ -232,12 +229,11 @@ class TestVendorContextManager:
|
||||
def test_get_vendor_from_custom_domain_not_found(self):
|
||||
"""Test custom domain not found in database."""
|
||||
mock_db = Mock(spec=Session)
|
||||
mock_db.query.return_value.filter.return_value.filter.return_value.filter.return_value.first.return_value = None
|
||||
mock_db.query.return_value.filter.return_value.filter.return_value.filter.return_value.first.return_value = (
|
||||
None
|
||||
)
|
||||
|
||||
context = {
|
||||
"detection_method": "custom_domain",
|
||||
"domain": "nonexistent.com"
|
||||
}
|
||||
context = {"detection_method": "custom_domain", "domain": "nonexistent.com"}
|
||||
|
||||
vendor = VendorContextManager.get_vendor_from_context(mock_db, context)
|
||||
|
||||
@@ -249,12 +245,11 @@ class TestVendorContextManager:
|
||||
mock_vendor = Mock()
|
||||
mock_vendor.is_active = True
|
||||
|
||||
mock_db.query.return_value.filter.return_value.filter.return_value.first.return_value = mock_vendor
|
||||
mock_db.query.return_value.filter.return_value.filter.return_value.first.return_value = (
|
||||
mock_vendor
|
||||
)
|
||||
|
||||
context = {
|
||||
"detection_method": "subdomain",
|
||||
"subdomain": "vendor1"
|
||||
}
|
||||
context = {"detection_method": "subdomain", "subdomain": "vendor1"}
|
||||
|
||||
vendor = VendorContextManager.get_vendor_from_context(mock_db, context)
|
||||
|
||||
@@ -266,12 +261,11 @@ class TestVendorContextManager:
|
||||
mock_vendor = Mock()
|
||||
mock_vendor.is_active = True
|
||||
|
||||
mock_db.query.return_value.filter.return_value.filter.return_value.first.return_value = mock_vendor
|
||||
mock_db.query.return_value.filter.return_value.filter.return_value.first.return_value = (
|
||||
mock_vendor
|
||||
)
|
||||
|
||||
context = {
|
||||
"detection_method": "path",
|
||||
"subdomain": "vendor1"
|
||||
}
|
||||
context = {"detection_method": "path", "subdomain": "vendor1"}
|
||||
|
||||
vendor = VendorContextManager.get_vendor_from_context(mock_db, context)
|
||||
|
||||
@@ -291,12 +285,11 @@ class TestVendorContextManager:
|
||||
mock_vendor = Mock()
|
||||
mock_vendor.is_active = True
|
||||
|
||||
mock_db.query.return_value.filter.return_value.filter.return_value.first.return_value = mock_vendor
|
||||
mock_db.query.return_value.filter.return_value.filter.return_value.first.return_value = (
|
||||
mock_vendor
|
||||
)
|
||||
|
||||
context = {
|
||||
"detection_method": "subdomain",
|
||||
"subdomain": "VENDOR1" # Uppercase
|
||||
}
|
||||
context = {"detection_method": "subdomain", "subdomain": "VENDOR1"} # Uppercase
|
||||
|
||||
vendor = VendorContextManager.get_vendor_from_context(mock_db, context)
|
||||
|
||||
@@ -311,10 +304,7 @@ class TestVendorContextManager:
|
||||
request = Mock(spec=Request)
|
||||
request.url = Mock(path="/vendor/vendor1/shop/products")
|
||||
|
||||
vendor_context = {
|
||||
"detection_method": "path",
|
||||
"path_prefix": "/vendor/vendor1"
|
||||
}
|
||||
vendor_context = {"detection_method": "path", "path_prefix": "/vendor/vendor1"}
|
||||
|
||||
clean_path = VendorContextManager.extract_clean_path(request, vendor_context)
|
||||
|
||||
@@ -325,10 +315,7 @@ class TestVendorContextManager:
|
||||
request = Mock(spec=Request)
|
||||
request.url = Mock(path="/vendors/vendor1/shop/products")
|
||||
|
||||
vendor_context = {
|
||||
"detection_method": "path",
|
||||
"path_prefix": "/vendors/vendor1"
|
||||
}
|
||||
vendor_context = {"detection_method": "path", "path_prefix": "/vendors/vendor1"}
|
||||
|
||||
clean_path = VendorContextManager.extract_clean_path(request, vendor_context)
|
||||
|
||||
@@ -339,10 +326,7 @@ class TestVendorContextManager:
|
||||
request = Mock(spec=Request)
|
||||
request.url = Mock(path="/vendor/vendor1")
|
||||
|
||||
vendor_context = {
|
||||
"detection_method": "path",
|
||||
"path_prefix": "/vendor/vendor1"
|
||||
}
|
||||
vendor_context = {"detection_method": "path", "path_prefix": "/vendor/vendor1"}
|
||||
|
||||
clean_path = VendorContextManager.extract_clean_path(request, vendor_context)
|
||||
|
||||
@@ -353,10 +337,7 @@ class TestVendorContextManager:
|
||||
request = Mock(spec=Request)
|
||||
request.url = Mock(path="/shop/products")
|
||||
|
||||
vendor_context = {
|
||||
"detection_method": "subdomain",
|
||||
"subdomain": "vendor1"
|
||||
}
|
||||
vendor_context = {"detection_method": "subdomain", "subdomain": "vendor1"}
|
||||
|
||||
clean_path = VendorContextManager.extract_clean_path(request, vendor_context)
|
||||
|
||||
@@ -425,21 +406,24 @@ class TestVendorContextManager:
|
||||
# Static File Detection Tests
|
||||
# ========================================================================
|
||||
|
||||
@pytest.mark.parametrize("path", [
|
||||
"/static/css/style.css",
|
||||
"/static/js/app.js",
|
||||
"/media/images/product.png",
|
||||
"/assets/logo.svg",
|
||||
"/.well-known/security.txt",
|
||||
"/favicon.ico",
|
||||
"/image.jpg",
|
||||
"/style.css",
|
||||
"/app.webmanifest",
|
||||
"/static/", # Path starting with /static/ but no extension
|
||||
"/media/uploads", # Path starting with /media/ but no extension
|
||||
"/subfolder/favicon.ico", # favicon.ico in subfolder
|
||||
"/favicon.ico.bak", # Contains favicon.ico but doesn't end with static extension (hits line 226)
|
||||
])
|
||||
@pytest.mark.parametrize(
|
||||
"path",
|
||||
[
|
||||
"/static/css/style.css",
|
||||
"/static/js/app.js",
|
||||
"/media/images/product.png",
|
||||
"/assets/logo.svg",
|
||||
"/.well-known/security.txt",
|
||||
"/favicon.ico",
|
||||
"/image.jpg",
|
||||
"/style.css",
|
||||
"/app.webmanifest",
|
||||
"/static/", # Path starting with /static/ but no extension
|
||||
"/media/uploads", # Path starting with /media/ but no extension
|
||||
"/subfolder/favicon.ico", # favicon.ico in subfolder
|
||||
"/favicon.ico.bak", # Contains favicon.ico but doesn't end with static extension (hits line 226)
|
||||
],
|
||||
)
|
||||
def test_is_static_file_request(self, path):
|
||||
"""Test static file detection for various paths and extensions."""
|
||||
request = Mock(spec=Request)
|
||||
@@ -447,12 +431,15 @@ class TestVendorContextManager:
|
||||
|
||||
assert VendorContextManager.is_static_file_request(request) is True
|
||||
|
||||
@pytest.mark.parametrize("path", [
|
||||
"/shop/products",
|
||||
"/admin/dashboard",
|
||||
"/api/vendors",
|
||||
"/about",
|
||||
])
|
||||
@pytest.mark.parametrize(
|
||||
"path",
|
||||
[
|
||||
"/shop/products",
|
||||
"/admin/dashboard",
|
||||
"/api/vendors",
|
||||
"/about",
|
||||
],
|
||||
)
|
||||
def test_is_not_static_file_request(self, path):
|
||||
"""Test non-static file paths."""
|
||||
request = Mock(spec=Request)
|
||||
@@ -478,7 +465,7 @@ class TestVendorContextMiddleware:
|
||||
|
||||
call_next = AsyncMock(return_value=Mock())
|
||||
|
||||
with patch.object(VendorContextManager, 'is_admin_request', return_value=True):
|
||||
with patch.object(VendorContextManager, "is_admin_request", return_value=True):
|
||||
await middleware.dispatch(request, call_next)
|
||||
|
||||
assert request.state.vendor is None
|
||||
@@ -498,7 +485,7 @@ class TestVendorContextMiddleware:
|
||||
|
||||
call_next = AsyncMock(return_value=Mock())
|
||||
|
||||
with patch.object(VendorContextManager, 'is_api_request', return_value=True):
|
||||
with patch.object(VendorContextManager, "is_api_request", return_value=True):
|
||||
await middleware.dispatch(request, call_next)
|
||||
|
||||
assert request.state.vendor is None
|
||||
@@ -517,7 +504,9 @@ class TestVendorContextMiddleware:
|
||||
|
||||
call_next = AsyncMock(return_value=Mock())
|
||||
|
||||
with patch.object(VendorContextManager, 'is_static_file_request', return_value=True):
|
||||
with patch.object(
|
||||
VendorContextManager, "is_static_file_request", return_value=True
|
||||
):
|
||||
await middleware.dispatch(request, call_next)
|
||||
|
||||
assert request.state.vendor is None
|
||||
@@ -540,17 +529,19 @@ class TestVendorContextMiddleware:
|
||||
mock_vendor.name = "Test Vendor"
|
||||
mock_vendor.subdomain = "vendor1"
|
||||
|
||||
vendor_context = {
|
||||
"detection_method": "subdomain",
|
||||
"subdomain": "vendor1"
|
||||
}
|
||||
vendor_context = {"detection_method": "subdomain", "subdomain": "vendor1"}
|
||||
|
||||
mock_db = MagicMock()
|
||||
|
||||
with patch.object(VendorContextManager, 'detect_vendor_context', return_value=vendor_context), \
|
||||
patch.object(VendorContextManager, 'get_vendor_from_context', return_value=mock_vendor), \
|
||||
patch.object(VendorContextManager, 'extract_clean_path', return_value="/shop/products"), \
|
||||
patch('middleware.vendor_context.get_db', return_value=iter([mock_db])):
|
||||
with patch.object(
|
||||
VendorContextManager, "detect_vendor_context", return_value=vendor_context
|
||||
), patch.object(
|
||||
VendorContextManager, "get_vendor_from_context", return_value=mock_vendor
|
||||
), patch.object(
|
||||
VendorContextManager, "extract_clean_path", return_value="/shop/products"
|
||||
), patch(
|
||||
"middleware.vendor_context.get_db", return_value=iter([mock_db])
|
||||
):
|
||||
|
||||
await middleware.dispatch(request, call_next)
|
||||
|
||||
@@ -571,16 +562,17 @@ class TestVendorContextMiddleware:
|
||||
|
||||
call_next = AsyncMock(return_value=Mock())
|
||||
|
||||
vendor_context = {
|
||||
"detection_method": "subdomain",
|
||||
"subdomain": "nonexistent"
|
||||
}
|
||||
vendor_context = {"detection_method": "subdomain", "subdomain": "nonexistent"}
|
||||
|
||||
mock_db = MagicMock()
|
||||
|
||||
with patch.object(VendorContextManager, 'detect_vendor_context', return_value=vendor_context), \
|
||||
patch.object(VendorContextManager, 'get_vendor_from_context', return_value=None), \
|
||||
patch('middleware.vendor_context.get_db', return_value=iter([mock_db])):
|
||||
with patch.object(
|
||||
VendorContextManager, "detect_vendor_context", return_value=vendor_context
|
||||
), patch.object(
|
||||
VendorContextManager, "get_vendor_from_context", return_value=None
|
||||
), patch(
|
||||
"middleware.vendor_context.get_db", return_value=iter([mock_db])
|
||||
):
|
||||
|
||||
await middleware.dispatch(request, call_next)
|
||||
|
||||
@@ -601,7 +593,9 @@ class TestVendorContextMiddleware:
|
||||
|
||||
call_next = AsyncMock(return_value=Mock())
|
||||
|
||||
with patch.object(VendorContextManager, 'detect_vendor_context', return_value=None):
|
||||
with patch.object(
|
||||
VendorContextManager, "detect_vendor_context", return_value=None
|
||||
):
|
||||
await middleware.dispatch(request, call_next)
|
||||
|
||||
assert request.state.vendor is None
|
||||
@@ -714,7 +708,7 @@ class TestEdgeCases:
|
||||
request.headers = {"host": "shop.vendor1.platform.com"}
|
||||
request.url = Mock(path="/")
|
||||
|
||||
with patch('middleware.vendor_context.settings') as mock_settings:
|
||||
with patch("middleware.vendor_context.settings") as mock_settings:
|
||||
mock_settings.platform_domain = "platform.com"
|
||||
|
||||
context = VendorContextManager.detect_vendor_context(request)
|
||||
@@ -735,11 +729,14 @@ class TestEdgeCases:
|
||||
|
||||
context = {"subdomain": "nonexistent", "detection_method": "subdomain"}
|
||||
|
||||
with patch('middleware.vendor_context.logger') as mock_logger:
|
||||
with patch("middleware.vendor_context.logger") as mock_logger:
|
||||
vendor = VendorContextManager.get_vendor_from_context(mock_db, context)
|
||||
|
||||
assert vendor is None
|
||||
# Verify warning was logged
|
||||
mock_logger.warning.assert_called()
|
||||
warning_message = str(mock_logger.warning.call_args)
|
||||
assert "No active vendor found for subdomain" in warning_message and "nonexistent" in warning_message
|
||||
assert (
|
||||
"No active vendor found for subdomain" in warning_message
|
||||
and "nonexistent" in warning_message
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user