066df2c142
* Add text and json fallback error handlers * Add tests and auto-detect error fallback type
87 lines
2.6 KiB
Python
87 lines
2.6 KiB
Python
import pytest
|
|
|
|
from sanic import Sanic
|
|
from sanic.errorpages import exception_response
|
|
from sanic.exceptions import NotFound
|
|
from sanic.request import Request
|
|
from sanic.response import HTTPResponse
|
|
|
|
|
|
@pytest.fixture
|
|
def app():
|
|
app = Sanic("error_page_testing")
|
|
|
|
@app.route("/error", methods=["GET", "POST"])
|
|
def err(request):
|
|
raise Exception("something went wrong")
|
|
|
|
return app
|
|
|
|
|
|
@pytest.fixture
|
|
def fake_request(app):
|
|
return Request(b"/foobar", {}, "1.1", "GET", None, app)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"fallback,content_type, exception, status",
|
|
(
|
|
(None, "text/html; charset=utf-8", Exception, 500),
|
|
("html", "text/html; charset=utf-8", Exception, 500),
|
|
("auto", "text/html; charset=utf-8", Exception, 500),
|
|
("text", "text/plain; charset=utf-8", Exception, 500),
|
|
("json", "application/json", Exception, 500),
|
|
(None, "text/html; charset=utf-8", NotFound, 404),
|
|
("html", "text/html; charset=utf-8", NotFound, 404),
|
|
("auto", "text/html; charset=utf-8", NotFound, 404),
|
|
("text", "text/plain; charset=utf-8", NotFound, 404),
|
|
("json", "application/json", NotFound, 404),
|
|
),
|
|
)
|
|
def test_should_return_html_valid_setting(
|
|
fake_request, fallback, content_type, exception, status
|
|
):
|
|
if fallback:
|
|
fake_request.app.config.FALLBACK_ERROR_FORMAT = fallback
|
|
|
|
try:
|
|
raise exception("bad stuff")
|
|
except Exception as e:
|
|
response = exception_response(fake_request, e, True)
|
|
|
|
assert isinstance(response, HTTPResponse)
|
|
assert response.status == status
|
|
assert response.content_type == content_type
|
|
|
|
|
|
def test_auto_fallback_with_data(app):
|
|
app.config.FALLBACK_ERROR_FORMAT = "auto"
|
|
|
|
_, response = app.test_client.get("/error")
|
|
assert response.status == 500
|
|
assert response.content_type == "text/html; charset=utf-8"
|
|
|
|
_, response = app.test_client.post("/error", json={"foo": "bar"})
|
|
assert response.status == 500
|
|
assert response.content_type == "application/json"
|
|
|
|
_, response = app.test_client.post("/error", data={"foo": "bar"})
|
|
assert response.status == 500
|
|
assert response.content_type == "text/html; charset=utf-8"
|
|
|
|
|
|
def test_auto_fallback_with_content_type(app):
|
|
app.config.FALLBACK_ERROR_FORMAT = "auto"
|
|
|
|
_, response = app.test_client.get(
|
|
"/error", headers={"content-type": "application/json"}
|
|
)
|
|
assert response.status == 500
|
|
assert response.content_type == "application/json"
|
|
|
|
_, response = app.test_client.get(
|
|
"/error", headers={"content-type": "text/plain"}
|
|
)
|
|
assert response.status == 500
|
|
assert response.content_type == "text/plain; charset=utf-8"
|