2014-12-29 00:19:09 +08:00
|
|
|
# -*- coding: utf-8 -*-
|
2018-02-09 02:57:40 +08:00
|
|
|
"""
|
|
|
|
tests.test_user_error_handler
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
:copyright: © 2010 by the Pallets team.
|
|
|
|
:license: BSD, see LICENSE for more details.
|
|
|
|
"""
|
2019-06-01 23:35:03 +08:00
|
|
|
from werkzeug.exceptions import Forbidden
|
|
|
|
from werkzeug.exceptions import HTTPException
|
|
|
|
from werkzeug.exceptions import InternalServerError
|
|
|
|
from werkzeug.exceptions import NotFound
|
2018-02-09 02:57:40 +08:00
|
|
|
|
2014-12-29 00:19:09 +08:00
|
|
|
import flask
|
|
|
|
|
|
|
|
|
2017-05-24 06:18:39 +08:00
|
|
|
def test_error_handler_no_match(app, client):
|
2015-06-03 04:13:30 +08:00
|
|
|
class CustomException(Exception):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@app.errorhandler(CustomException)
|
|
|
|
def custom_exception_handler(e):
|
|
|
|
assert isinstance(e, CustomException)
|
2019-05-07 03:39:41 +08:00
|
|
|
return "custom"
|
2015-06-03 04:13:30 +08:00
|
|
|
|
|
|
|
@app.errorhandler(500)
|
|
|
|
def handle_500(e):
|
|
|
|
return type(e).__name__
|
|
|
|
|
2019-05-07 03:39:41 +08:00
|
|
|
@app.route("/custom")
|
2015-06-03 04:13:30 +08:00
|
|
|
def custom_test():
|
|
|
|
raise CustomException()
|
|
|
|
|
2019-05-07 03:39:41 +08:00
|
|
|
@app.route("/keyerror")
|
2015-06-03 04:13:30 +08:00
|
|
|
def key_error():
|
|
|
|
raise KeyError()
|
|
|
|
|
2017-05-24 06:18:39 +08:00
|
|
|
app.testing = False
|
2019-05-07 03:39:41 +08:00
|
|
|
assert client.get("/custom").data == b"custom"
|
|
|
|
assert client.get("/keyerror").data == b"KeyError"
|
2015-06-03 04:13:30 +08:00
|
|
|
|
2014-12-29 00:19:09 +08:00
|
|
|
|
2017-05-24 06:18:39 +08:00
|
|
|
def test_error_handler_subclass(app):
|
2015-04-12 02:42:46 +08:00
|
|
|
class ParentException(Exception):
|
|
|
|
pass
|
2014-12-29 00:19:09 +08:00
|
|
|
|
2015-04-12 02:42:46 +08:00
|
|
|
class ChildExceptionUnregistered(ParentException):
|
|
|
|
pass
|
2014-12-29 00:19:09 +08:00
|
|
|
|
2015-04-12 02:42:46 +08:00
|
|
|
class ChildExceptionRegistered(ParentException):
|
|
|
|
pass
|
2014-12-29 00:19:09 +08:00
|
|
|
|
2015-04-12 02:42:46 +08:00
|
|
|
@app.errorhandler(ParentException)
|
|
|
|
def parent_exception_handler(e):
|
|
|
|
assert isinstance(e, ParentException)
|
2019-05-07 03:39:41 +08:00
|
|
|
return "parent"
|
2014-12-29 00:19:09 +08:00
|
|
|
|
2015-04-12 02:42:46 +08:00
|
|
|
@app.errorhandler(ChildExceptionRegistered)
|
|
|
|
def child_exception_handler(e):
|
|
|
|
assert isinstance(e, ChildExceptionRegistered)
|
2019-05-07 03:39:41 +08:00
|
|
|
return "child-registered"
|
2014-12-29 00:19:09 +08:00
|
|
|
|
2019-05-07 03:39:41 +08:00
|
|
|
@app.route("/parent")
|
2015-04-12 02:42:46 +08:00
|
|
|
def parent_test():
|
|
|
|
raise ParentException()
|
2014-12-29 00:19:09 +08:00
|
|
|
|
2019-05-07 03:39:41 +08:00
|
|
|
@app.route("/child-unregistered")
|
2015-04-12 02:42:46 +08:00
|
|
|
def unregistered_test():
|
|
|
|
raise ChildExceptionUnregistered()
|
2014-12-29 00:19:09 +08:00
|
|
|
|
2019-05-07 03:39:41 +08:00
|
|
|
@app.route("/child-registered")
|
2015-04-12 02:42:46 +08:00
|
|
|
def registered_test():
|
|
|
|
raise ChildExceptionRegistered()
|
2014-12-29 00:19:09 +08:00
|
|
|
|
2015-04-12 02:42:46 +08:00
|
|
|
c = app.test_client()
|
2014-12-29 00:19:09 +08:00
|
|
|
|
2019-05-07 03:39:41 +08:00
|
|
|
assert c.get("/parent").data == b"parent"
|
|
|
|
assert c.get("/child-unregistered").data == b"parent"
|
|
|
|
assert c.get("/child-registered").data == b"child-registered"
|
2014-12-29 00:19:09 +08:00
|
|
|
|
|
|
|
|
2017-05-24 06:18:39 +08:00
|
|
|
def test_error_handler_http_subclass(app):
|
2015-04-12 02:42:46 +08:00
|
|
|
class ForbiddenSubclassRegistered(Forbidden):
|
|
|
|
pass
|
2014-12-29 00:19:09 +08:00
|
|
|
|
2015-04-12 02:42:46 +08:00
|
|
|
class ForbiddenSubclassUnregistered(Forbidden):
|
|
|
|
pass
|
2014-12-29 00:19:09 +08:00
|
|
|
|
2015-04-12 02:42:46 +08:00
|
|
|
@app.errorhandler(403)
|
|
|
|
def code_exception_handler(e):
|
|
|
|
assert isinstance(e, Forbidden)
|
2019-05-07 03:39:41 +08:00
|
|
|
return "forbidden"
|
2014-12-29 00:19:09 +08:00
|
|
|
|
2015-04-12 02:42:46 +08:00
|
|
|
@app.errorhandler(ForbiddenSubclassRegistered)
|
|
|
|
def subclass_exception_handler(e):
|
|
|
|
assert isinstance(e, ForbiddenSubclassRegistered)
|
2019-05-07 03:39:41 +08:00
|
|
|
return "forbidden-registered"
|
2014-12-29 00:19:09 +08:00
|
|
|
|
2019-05-07 03:39:41 +08:00
|
|
|
@app.route("/forbidden")
|
2015-04-12 02:42:46 +08:00
|
|
|
def forbidden_test():
|
|
|
|
raise Forbidden()
|
2014-12-29 00:19:09 +08:00
|
|
|
|
2019-05-07 03:39:41 +08:00
|
|
|
@app.route("/forbidden-registered")
|
2015-04-12 02:42:46 +08:00
|
|
|
def registered_test():
|
|
|
|
raise ForbiddenSubclassRegistered()
|
2014-12-29 00:19:09 +08:00
|
|
|
|
2019-05-07 03:39:41 +08:00
|
|
|
@app.route("/forbidden-unregistered")
|
2015-04-12 02:42:46 +08:00
|
|
|
def unregistered_test():
|
|
|
|
raise ForbiddenSubclassUnregistered()
|
2014-12-29 00:19:09 +08:00
|
|
|
|
2015-04-12 02:42:46 +08:00
|
|
|
c = app.test_client()
|
2014-12-29 00:19:09 +08:00
|
|
|
|
2019-05-07 03:39:41 +08:00
|
|
|
assert c.get("/forbidden").data == b"forbidden"
|
|
|
|
assert c.get("/forbidden-unregistered").data == b"forbidden"
|
|
|
|
assert c.get("/forbidden-registered").data == b"forbidden-registered"
|
2014-12-29 00:19:09 +08:00
|
|
|
|
|
|
|
|
2017-05-24 06:18:39 +08:00
|
|
|
def test_error_handler_blueprint(app):
|
2019-05-07 03:39:41 +08:00
|
|
|
bp = flask.Blueprint("bp", __name__)
|
2015-04-12 02:42:46 +08:00
|
|
|
|
|
|
|
@bp.errorhandler(500)
|
|
|
|
def bp_exception_handler(e):
|
2019-05-07 03:39:41 +08:00
|
|
|
return "bp-error"
|
2015-04-12 02:42:46 +08:00
|
|
|
|
2019-05-07 03:39:41 +08:00
|
|
|
@bp.route("/error")
|
2015-04-12 02:42:46 +08:00
|
|
|
def bp_test():
|
|
|
|
raise InternalServerError()
|
|
|
|
|
|
|
|
@app.errorhandler(500)
|
|
|
|
def app_exception_handler(e):
|
2019-05-07 03:39:41 +08:00
|
|
|
return "app-error"
|
2015-04-12 02:42:46 +08:00
|
|
|
|
2019-05-07 03:39:41 +08:00
|
|
|
@app.route("/error")
|
2015-04-12 02:42:46 +08:00
|
|
|
def app_test():
|
|
|
|
raise InternalServerError()
|
|
|
|
|
2019-05-07 03:39:41 +08:00
|
|
|
app.register_blueprint(bp, url_prefix="/bp")
|
2015-04-12 02:42:46 +08:00
|
|
|
|
|
|
|
c = app.test_client()
|
|
|
|
|
2019-05-07 03:39:41 +08:00
|
|
|
assert c.get("/error").data == b"app-error"
|
|
|
|
assert c.get("/bp/error").data == b"bp-error"
|
2017-05-23 06:57:31 +08:00
|
|
|
|
|
|
|
|
|
|
|
def test_default_error_handler():
|
2019-05-07 03:39:41 +08:00
|
|
|
bp = flask.Blueprint("bp", __name__)
|
2017-05-23 06:57:31 +08:00
|
|
|
|
|
|
|
@bp.errorhandler(HTTPException)
|
|
|
|
def bp_exception_handler(e):
|
|
|
|
assert isinstance(e, HTTPException)
|
|
|
|
assert isinstance(e, NotFound)
|
2019-05-07 03:39:41 +08:00
|
|
|
return "bp-default"
|
2017-05-23 06:57:31 +08:00
|
|
|
|
|
|
|
@bp.errorhandler(Forbidden)
|
2019-06-01 02:53:26 +08:00
|
|
|
def bp_forbidden_handler(e):
|
2017-05-23 06:57:31 +08:00
|
|
|
assert isinstance(e, Forbidden)
|
2019-05-07 03:39:41 +08:00
|
|
|
return "bp-forbidden"
|
2017-05-23 06:57:31 +08:00
|
|
|
|
2019-05-07 03:39:41 +08:00
|
|
|
@bp.route("/undefined")
|
2017-05-23 06:57:31 +08:00
|
|
|
def bp_registered_test():
|
|
|
|
raise NotFound()
|
|
|
|
|
2019-05-07 03:39:41 +08:00
|
|
|
@bp.route("/forbidden")
|
2017-05-23 06:57:31 +08:00
|
|
|
def bp_forbidden_test():
|
|
|
|
raise Forbidden()
|
|
|
|
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
|
|
|
|
@app.errorhandler(HTTPException)
|
2019-06-01 02:53:26 +08:00
|
|
|
def catchall_exception_handler(e):
|
2017-05-23 06:57:31 +08:00
|
|
|
assert isinstance(e, HTTPException)
|
|
|
|
assert isinstance(e, NotFound)
|
2019-05-07 03:39:41 +08:00
|
|
|
return "default"
|
2017-05-23 06:57:31 +08:00
|
|
|
|
|
|
|
@app.errorhandler(Forbidden)
|
2019-06-01 02:53:26 +08:00
|
|
|
def catchall_forbidden_handler(e):
|
2017-05-23 06:57:31 +08:00
|
|
|
assert isinstance(e, Forbidden)
|
2019-05-07 03:39:41 +08:00
|
|
|
return "forbidden"
|
2017-05-23 06:57:31 +08:00
|
|
|
|
2019-05-07 03:39:41 +08:00
|
|
|
@app.route("/forbidden")
|
2017-05-23 06:57:31 +08:00
|
|
|
def forbidden():
|
|
|
|
raise Forbidden()
|
|
|
|
|
2019-01-08 01:52:54 +08:00
|
|
|
@app.route("/slash/")
|
2018-11-02 04:41:53 +08:00
|
|
|
def slash():
|
2019-01-08 01:52:54 +08:00
|
|
|
return "slash"
|
2018-11-02 04:41:53 +08:00
|
|
|
|
2019-05-07 03:39:41 +08:00
|
|
|
app.register_blueprint(bp, url_prefix="/bp")
|
2017-05-23 06:57:31 +08:00
|
|
|
|
|
|
|
c = app.test_client()
|
2019-05-07 03:39:41 +08:00
|
|
|
assert c.get("/bp/undefined").data == b"bp-default"
|
|
|
|
assert c.get("/bp/forbidden").data == b"bp-forbidden"
|
|
|
|
assert c.get("/undefined").data == b"default"
|
|
|
|
assert c.get("/forbidden").data == b"forbidden"
|
2019-01-08 01:52:54 +08:00
|
|
|
# Don't handle RequestRedirect raised when adding slash.
|
|
|
|
assert c.get("/slash", follow_redirects=True).data == b"slash"
|