sanic/tests/test_middleware.py

187 lines
4.6 KiB
Python
Raw Permalink Normal View History

import logging
from asyncio import CancelledError
from sanic.exceptions import NotFound, SanicException
from sanic.request import Request
from sanic.response import HTTPResponse, text
# ------------------------------------------------------------ #
# GET
# ------------------------------------------------------------ #
2018-12-30 11:18:06 +00:00
2018-08-26 15:43:14 +01:00
def test_middleware_request(app):
results = []
@app.middleware
2018-10-22 21:25:38 +01:00
async def handler1(request):
results.append(request)
2018-12-30 11:18:06 +00:00
@app.route("/")
2018-10-22 21:25:38 +01:00
async def handler2(request):
2018-12-30 11:18:06 +00:00
return text("OK")
2018-12-30 11:18:06 +00:00
request, response = app.test_client.get("/")
2018-12-30 11:18:06 +00:00
assert response.text == "OK"
assert type(results[0]) is Request
2018-08-26 15:43:14 +01:00
def test_middleware_response(app):
results = []
2018-12-30 11:18:06 +00:00
@app.middleware("request")
2018-10-22 21:25:38 +01:00
async def process_request(request):
results.append(request)
2018-12-30 11:18:06 +00:00
@app.middleware("response")
async def process_response(request, response):
results.append(request)
results.append(response)
2018-12-30 11:18:06 +00:00
@app.route("/")
async def handler(request):
2018-12-30 11:18:06 +00:00
return text("OK")
2018-12-30 11:18:06 +00:00
request, response = app.test_client.get("/")
2018-12-30 11:18:06 +00:00
assert response.text == "OK"
assert type(results[0]) is Request
assert type(results[1]) is Request
assert isinstance(results[2], HTTPResponse)
2018-08-26 15:43:14 +01:00
def test_middleware_response_exception(app):
2018-12-30 11:18:06 +00:00
result = {"status_code": None}
2018-12-30 11:18:06 +00:00
@app.middleware("response")
2017-11-15 15:46:39 +00:00
async def process_response(request, response):
2018-12-30 11:18:06 +00:00
result["status_code"] = response.status
return response
@app.exception(NotFound)
async def error_handler(request, exception):
2018-12-30 11:18:06 +00:00
return text("OK", exception.status_code)
2018-12-30 11:18:06 +00:00
@app.route("/")
async def handler(request):
2018-12-30 11:18:06 +00:00
return text("FAIL")
2018-12-30 11:18:06 +00:00
request, response = app.test_client.get("/page_not_found")
assert response.text == "OK"
assert result["status_code"] == 404
2018-10-22 21:25:38 +01:00
def test_middleware_response_raise_cancelled_error(app, caplog):
app.config.RESPONSE_TIMEOUT = 1
2018-12-30 11:18:06 +00:00
@app.middleware("response")
async def process_response(request, response):
2018-12-30 11:18:06 +00:00
raise CancelledError("CancelledError at response middleware")
2018-12-30 11:18:06 +00:00
@app.get("/")
def handler(request):
2018-12-30 11:18:06 +00:00
return text("OK")
with caplog.at_level(logging.ERROR):
2018-12-30 11:18:06 +00:00
reqrequest, response = app.test_client.get("/")
assert response.status == 503
assert (
"sanic.root",
logging.ERROR,
"Exception occurred while handling uri: 'http://127.0.0.1:42101/'",
) not in caplog.record_tuples
def test_middleware_response_raise_exception(app, caplog):
2018-12-30 11:18:06 +00:00
@app.middleware("response")
async def process_response(request, response):
2018-12-30 11:18:06 +00:00
raise Exception("Exception at response middleware")
with caplog.at_level(logging.ERROR):
reqrequest, response = app.test_client.get("/fail")
assert response.status == 404
# 404 errors are not logged
assert (
2018-12-30 11:18:06 +00:00
"sanic.root",
logging.ERROR,
2018-12-30 11:18:06 +00:00
"Exception occurred while handling uri: 'http://127.0.0.1:42101/'",
) not in caplog.record_tuples
# Middleware exception ignored but logged
assert (
2018-12-30 11:18:06 +00:00
"sanic.error",
logging.ERROR,
2018-12-30 11:18:06 +00:00
"Exception occurred in one of response middleware handlers",
) in caplog.record_tuples
2018-08-26 15:43:14 +01:00
def test_middleware_override_request(app):
@app.middleware
async def halt_request(request):
2018-12-30 11:18:06 +00:00
return text("OK")
2018-12-30 11:18:06 +00:00
@app.route("/")
async def handler(request):
2018-12-30 11:18:06 +00:00
return text("FAIL")
2018-12-30 11:18:06 +00:00
response = app.test_client.get("/", gather_request=False)
assert response.status == 200
2018-12-30 11:18:06 +00:00
assert response.text == "OK"
2018-08-26 15:43:14 +01:00
def test_middleware_override_response(app):
2018-12-30 11:18:06 +00:00
@app.middleware("response")
async def process_response(request, response):
2018-12-30 11:18:06 +00:00
return text("OK")
2018-12-30 11:18:06 +00:00
@app.route("/")
async def handler(request):
2018-12-30 11:18:06 +00:00
return text("FAIL")
2018-12-30 11:18:06 +00:00
request, response = app.test_client.get("/")
assert response.status == 200
2018-12-30 11:18:06 +00:00
assert response.text == "OK"
2018-08-26 15:43:14 +01:00
def test_middleware_order(app):
order = []
2018-12-30 11:18:06 +00:00
@app.middleware("request")
async def request1(request):
order.append(1)
2018-12-30 11:18:06 +00:00
@app.middleware("request")
async def request2(request):
order.append(2)
2018-12-30 11:18:06 +00:00
@app.middleware("request")
async def request3(request):
order.append(3)
2018-12-30 11:18:06 +00:00
@app.middleware("response")
async def response1(request, response):
order.append(6)
2018-12-30 11:18:06 +00:00
@app.middleware("response")
async def response2(request, response):
order.append(5)
2018-12-30 11:18:06 +00:00
@app.middleware("response")
async def response3(request, response):
order.append(4)
2018-12-30 11:18:06 +00:00
@app.route("/")
async def handler(request):
2018-12-30 11:18:06 +00:00
return text("OK")
2018-12-30 11:18:06 +00:00
request, response = app.test_client.get("/")
assert response.status == 200
2018-10-22 21:25:38 +01:00
assert order == [1, 2, 3, 4, 5, 6]