blob: 24e00dd238fcdd6e84b2c210bcff83a47a9a03bb [file] [log] [blame]
# (c) 2005 Ian Bicking, Clark C. Evans and contributors
# This module is part of the Python Paste Project and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
"""
WSGI Exception Middleware
Regression Test Suite
"""
from nose.tools import assert_raises
from paste.httpexceptions import *
from paste.response import header_value
import six
def test_HTTPMove():
""" make sure that location is a mandatory attribute of Redirects """
assert_raises(AssertionError, HTTPFound)
assert_raises(AssertionError, HTTPTemporaryRedirect,
headers=[('l0cation','/bing')])
assert isinstance(HTTPMovedPermanently("This is a message",
headers=[('Location','/bing')])
,HTTPRedirection)
assert isinstance(HTTPUseProxy(headers=[('LOCATION','/bing')])
,HTTPRedirection)
assert isinstance(HTTPFound('/foobar'),HTTPRedirection)
def test_badapp():
""" verify that the middleware handles previously-started responses """
def badapp(environ, start_response):
start_response("200 OK",[])
raise HTTPBadRequest("Do not do this at home.")
newapp = HTTPExceptionHandler(badapp)
assert b'Bad Request' in b''.join(newapp({'HTTP_ACCEPT': 'text/html'},
(lambda a, b, c=None: None)))
def test_unicode():
""" verify unicode output """
tstr = u"\0xCAFE"
def badapp(environ, start_response):
start_response("200 OK",[])
raise HTTPBadRequest(tstr)
newapp = HTTPExceptionHandler(badapp)
assert tstr.encode("utf-8") in b''.join(newapp({'HTTP_ACCEPT':
'text/html'},
(lambda a, b, c=None: None)))
assert tstr.encode("utf-8") in b''.join(newapp({'HTTP_ACCEPT':
'text/plain'},
(lambda a, b, c=None: None)))
def test_template():
""" verify that html() and plain() output methods work """
e = HTTPInternalServerError()
e.template = 'A %(ping)s and <b>%(pong)s</b> message.'
assert str(e).startswith("500 Internal Server Error")
assert e.plain({'ping': 'fun', 'pong': 'happy'}) == (
'500 Internal Server Error\r\n'
'A fun and happy message.\r\n')
assert '<p>A fun and <b>happy</b> message.</p>' in \
e.html({'ping': 'fun', 'pong': 'happy'})
def test_redapp():
""" check that redirect returns the correct, expected results """
saved = []
def saveit(status, headers, exc_info = None):
saved.append((status,headers))
def redapp(environ, start_response):
raise HTTPFound("/bing/foo")
app = HTTPExceptionHandler(redapp)
result = list(app({'HTTP_ACCEPT': 'text/html'},saveit))
assert b'<a href="/bing/foo">' in result[0]
assert "302 Found" == saved[0][0]
if six.PY3:
assert "text/html; charset=utf8" == header_value(saved[0][1], 'content-type')
else:
assert "text/html" == header_value(saved[0][1], 'content-type')
assert "/bing/foo" == header_value(saved[0][1],'location')
result = list(app({'HTTP_ACCEPT': 'text/plain'},saveit))
assert "text/plain; charset=utf8" == header_value(saved[1][1],'content-type')
assert "/bing/foo" == header_value(saved[1][1],'location')
def test_misc():
assert get_exception(301) == HTTPMovedPermanently
redirect = HTTPFound("/some/path")
assert isinstance(redirect,HTTPException)
assert isinstance(redirect,HTTPRedirection)
assert not isinstance(redirect,HTTPError)
notfound = HTTPNotFound()
assert isinstance(notfound,HTTPException)
assert isinstance(notfound,HTTPError)
assert isinstance(notfound,HTTPClientError)
assert not isinstance(notfound,HTTPServerError)
notimpl = HTTPNotImplemented()
assert isinstance(notimpl,HTTPException)
assert isinstance(notimpl,HTTPError)
assert isinstance(notimpl,HTTPServerError)
assert not isinstance(notimpl,HTTPClientError)