Coverage for test\test_middlewares.py: 100%
87 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-21 20:31 +0100
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-21 20:31 +0100
1from nexios import NexiosApp
2from nexios.http import Request, Response
3from nexios import get_application
4from nexios.testing import Client
5import pytest
7app: NexiosApp = get_application()
10@pytest.fixture(autouse=True)
11async def async_client():
12 async with Client(app, log_requests=True) as c:
13 yield c
16async def test_middleware_modifies_response(async_client: Client):
18 app.router.routes.clear()
19 app.http_middlewares.clear()
21 async def header_middleware(request: Request, response: Response, call_next):
22 await call_next()
23 response.set_header("X-Middleware-Added", "True")
25 app.add_middleware(header_middleware)
27 @app.route("/header-test")
28 async def test_route(request: Request, response: Response):
29 return response.text("OK")
31 # Execute test
32 response = await async_client.get("/header-test")
33 assert response.status_code == 200
34 assert "X-Middleware-Added" in response.headers
35 assert response.headers["X-Middleware-Added"] == "True"
38async def test_middleware_modifies_request(async_client: Client):
40 app.router.routes.clear()
41 app.http_middlewares.clear()
43 async def modify_request(request: Request, response: Response, call_next):
44 request.state.text = "modified"
45 return await call_next()
47 app.add_middleware(modify_request)
49 @app.route("/request-test")
50 async def request_test(request: Request, response: Response):
51 return response.text(request.state.text)
53 response = await async_client.get("/request-test")
54 assert response.text == "modified"
57async def test_middleware_order(async_client: Client):
59 app.router.routes.clear()
60 app.http_middlewares.clear()
62 async def first_middleware(equest: Request, response: Response, call_next):
63 await call_next()
64 response.set_header("X-Order-1", "First")
65 return response
67 async def second_middleware(equest: Request, response: Response, call_next):
68 await call_next()
69 response.set_header("X-Order-2", "Second")
70 return response
72 app.add_middleware(first_middleware)
73 app.add_middleware(second_middleware)
75 @app.route("/order-test")
76 async def order_test(request: Request, response: Response):
77 return response.text("OK")
79 response = await async_client.get("/order-test")
80 assert response.headers["X-Order-1"] == "First"
81 assert response.headers["X-Order-2"] == "Second"
84async def test_middleware_short_circuit(async_client: Client):
86 app.router.routes.clear()
87 app.http_middlewares.clear()
89 async def blocking_middleware(request: Request, response: Response, call_next):
90 if request.headers.get("Authorization") != "Valid":
91 return response.text("Unauthorized", status_code=403)
92 return await call_next()
94 app.add_middleware(blocking_middleware)
96 @app.route("/protected")
97 async def protected_route(request: Request, response: Response):
98 return response.text("Secret")
100 # Test blocked request
101 response = await async_client.get("/protected")
102 assert response.status_code == 403
103 assert response.text == "Unauthorized"
105 # Test allowed request
106 response = await async_client.get("/protected", headers={"Authorization": "Valid"})
107 assert response.status_code == 200
108 assert response.text == "Secret"
111async def test_middleware_exception_handling(async_client: Client):
113 app.router.routes.clear()
114 app.http_middlewares.clear()
116 async def exception_middleware(request: Request, response: Response, call_next):
117 try:
118 return await call_next()
119 except Exception:
120 return response.text("Handled Error", status_code=500)
122 app.add_middleware(exception_middleware)
124 @app.route("/error-route")
125 async def error_route(request: Request, response: Response):
126 raise ValueError("Something went wrong")
128 response = await async_client.get("/error-route")
129 assert response.status_code == 500
130 assert response.text == "Handled Error"