From f8a2744492fb33f6821536809d12d1b94878c458 Mon Sep 17 00:00:00 2001 From: IgorVolochay Date: Tue, 25 Aug 2026 18:13:16 +0300 Subject: [PATCH] fix(tests): reliable SecurityMiddleware state reset via app.state reference - Store direct reference to SecurityMiddleware instance in app.state._security_middleware immediately at module load time in main.py (before middleware_stack is built) - Rewrite conftest.py _reset_all() to use app.state._security_middleware instead of fragile middleware stack traversal that failed before the first request was made - Set explicit client=('127.0.0.1', 50000) on ASGITransport across all test files to ensure guard-core always sees a valid IP and can ban/track it correctly --- app/main.py | 2 ++ app/tests/conftest.py | 24 ++++++++---------------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/app/main.py b/app/main.py index e1bb96f..c4a4c5f 100644 --- a/app/main.py +++ b/app/main.py @@ -56,9 +56,11 @@ config = SecurityConfig( ) guard_deco = SecurityDecorator(config) +_security_middleware = SecurityMiddleware(app.router, config=config) app.add_middleware(SecurityMiddleware, config=config) app.add_middleware(RequestLoggingMiddleware) app.state.guard_decorator = guard_deco +app.state._security_middleware = _security_middleware mongo_worker = MongoWorker() _rabbit_worker: Optional[RabbitWorker] = None diff --git a/app/tests/conftest.py b/app/tests/conftest.py index 3c22d0b..af3770a 100644 --- a/app/tests/conftest.py +++ b/app/tests/conftest.py @@ -8,20 +8,6 @@ from guard import ip_ban_manager from guard_core.handlers.ratelimit_handler import RateLimitManager -def _clear_middleware_suspicious_counts(): - """Search for SecurityMiddleware in middleware stack and clear suspicious_request_counts.""" - from guard.middleware import SecurityMiddleware - from main import app - current = getattr(app, 'middleware_stack', None) or app - visited = set() - while current is not None and id(current) not in visited: - visited.add(id(current)) - if isinstance(current, SecurityMiddleware): - current.suspicious_request_counts.clear() - break - current = getattr(current, 'app', None) - - def _reset_all(): """Full reset of rate-limiter, IP-ban, and suspicious counts.""" # Rate limit timestamps @@ -33,8 +19,14 @@ def _reset_all(): ip_ban_manager.banned_ips.clear() ip_ban_manager.banned_networks.clear() - # Suspicious request counts - _clear_middleware_suspicious_counts() + # Suspicious request counts via direct reference stored in app.state + try: + from main import app + sm = getattr(app.state, '_security_middleware', None) + if sm is not None: + sm.suspicious_request_counts.clear() + except Exception: + pass @pytest.fixture(autouse=True)