import httpx from fastapi.testclient import TestClient from src.server.fastapi_app import app # Shim for environments where httpx.Client.__init__ doesn't accept an # 'app' kwarg (some httpx versions have a different signature). The # TestClient in Starlette passes `app=` through; to keep tests portable # we pop it before calling the real initializer. _orig_httpx_init = httpx.Client.__init__ def _httpx_init_shim(self, *args, **kwargs): kwargs.pop("app", None) return _orig_httpx_init(self, *args, **kwargs) httpx.Client.__init__ = _httpx_init_shim def test_rate_limit_login_endpoint(): client = TestClient(app, raise_server_exceptions=False) # Hit the login endpoint more times than allowed in the rate window for i in range(6): resp = client.post("/api/auth/login", json={"password": "bad"}) # Before hitting the limit we may receive 400/401; the 6th should be 429 if i < 5: assert resp.status_code in (400, 401, 429) else: assert resp.status_code == 429 def test_protected_endpoint_invalid_token(): client = TestClient(app, raise_server_exceptions=False) # Call a public endpoint with an invalid token; middleware should ignore it headers = {"Authorization": "Bearer invalid.token.here"} resp = client.get("/health", headers=headers) assert resp.status_code == 200