Files
orion/tests/integration/middleware
Samir Boulahtit 531487f5c9
Some checks failed
CI / ruff (push) Successful in 9s
CI / architecture (push) Has been cancelled
CI / dependency-scanning (push) Has been cancelled
CI / audit (push) Has been cancelled
CI / docs (push) Has been cancelled
CI / pytest (push) Has been cancelled
fix(lint): pin ruff version, add pre-commit hook, fix all lint errors
- Pin ruff==0.8.4 in requirements-dev.txt (was >=0.8.4, CI got newer
  version with different import sorting rules)
- Add ruff to .pre-commit-config.yaml with --fix to auto-sort imports
  on commit (prevents PyCharm import reordering from reaching CI)
- Fix I001 import sorting in 6 files
- Fix F401 unused import (sqlalchemy.Numeric in subscription.py)
- Fix noqa false positive in validate_architecture.py comment

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 21:52:41 +01:00
..

Middleware Integration Tests

Overview

These tests verify that the middleware stack (StoreContextMiddleware, ThemeContextMiddleware, ContextMiddleware) works correctly through real HTTP requests.

Test Status

Test File Status Tests
test_store_context_flow.py Passing 9 tests
test_theme_loading_flow.py Passing 14 tests
test_middleware_stack.py Passing 10 tests
test_context_detection_flow.py Passing 12 tests

Total: 45 passing integration tests

Architecture

Pre-registered Test Routes

All test routes are defined in middleware_test_routes.py and registered at module load time. This avoids conflicts with catch-all routes in main.py.

Routes are organized by prefix:

  • /middleware-test/* - General middleware testing
  • /api/middleware-test/* - API context testing
  • /admin/middleware-test/* - Admin context testing
  • /shop/middleware-test/* - Shop context testing

Test Fixtures (conftest.py)

The client fixture patches middleware dependencies for proper test isolation:

@pytest.fixture
def client(db):
    with patch("middleware.store_context.get_db", override_get_db):
        with patch("middleware.theme_context.get_db", override_get_db):
            with patch("middleware.store_context.settings") as mock_settings:
                mock_settings.platform_domain = "platform.com"
                client = TestClient(app)
                yield client

This ensures:

  1. Database isolation: Middleware uses the test database session
  2. Subdomain detection: platform.com is used so hosts like teststore.platform.com work correctly

Store Dashboard Context Testing

Store dashboard context detection (/store/* paths → STORE_DASHBOARD context) is tested via unit tests rather than integration tests because:

  1. The /store/{store_code}/{slug} catch-all route in main.py intercepts /store/middleware-test/* paths
  2. Unit tests in tests/unit/middleware/test_context.py provide comprehensive coverage:
    • test_detect_store_dashboard_context
    • test_detect_store_dashboard_context_direct_path
    • test_store_dashboard_priority_over_shop
    • test_middleware_sets_store_dashboard_context

Testing Patterns

Subdomain Detection

Use hosts ending in .platform.com:

response = client.get(
    "/middleware-test/subdomain-detection",
    headers={"host": "mystore.platform.com"}
)

Custom Domain Detection

Custom domains require is_verified=True in the StoreDomain fixture:

domain = StoreDomain(
    store_id=store.id,
    domain="customdomain.com",
    is_active=True,
    is_primary=True,
    is_verified=True  # Required for detection
)

Context Type Verification

Routes return context information for assertions:

response = client.get("/api/middleware-test/context")
data = response.json()
assert data["context_type"] == "api"
assert data["context_enum"] == "API"

Theme Structure

Theme data uses nested structure:

  • theme["colors"]["primary"] - Primary color
  • theme["branding"]["logo"] - Logo URL
  • theme["custom_css"] - Custom CSS

Test routes flatten this for easier assertions:

data = response.json()
assert data["primary_color"] == "#FF5733"  # Flattened from colors.primary