1# (c) 2005 Ian Bicking, Clark C. Evans and contributors 2# This module is part of the Python Paste Project and is released under 3# the MIT License: http://www.opensource.org/licenses/mit-license.php 4""" 5WSGI Exception Middleware 6 7Regression Test Suite 8""" 9from nose.tools import assert_raises 10from paste.httpexceptions import * 11from paste.response import header_value 12import six 13 14 15def test_HTTPMove(): 16 """ make sure that location is a mandatory attribute of Redirects """ 17 assert_raises(AssertionError, HTTPFound) 18 assert_raises(AssertionError, HTTPTemporaryRedirect, 19 headers=[('l0cation','/bing')]) 20 assert isinstance(HTTPMovedPermanently("This is a message", 21 headers=[('Location','/bing')]) 22 ,HTTPRedirection) 23 assert isinstance(HTTPUseProxy(headers=[('LOCATION','/bing')]) 24 ,HTTPRedirection) 25 assert isinstance(HTTPFound('/foobar'),HTTPRedirection) 26 27def test_badapp(): 28 """ verify that the middleware handles previously-started responses """ 29 def badapp(environ, start_response): 30 start_response("200 OK",[]) 31 raise HTTPBadRequest("Do not do this at home.") 32 newapp = HTTPExceptionHandler(badapp) 33 assert b'Bad Request' in b''.join(newapp({'HTTP_ACCEPT': 'text/html'}, 34 (lambda a, b, c=None: None))) 35 36def test_unicode(): 37 """ verify unicode output """ 38 tstr = u"\0xCAFE" 39 def badapp(environ, start_response): 40 start_response("200 OK",[]) 41 raise HTTPBadRequest(tstr) 42 newapp = HTTPExceptionHandler(badapp) 43 assert tstr.encode("utf-8") in b''.join(newapp({'HTTP_ACCEPT': 44 'text/html'}, 45 (lambda a, b, c=None: None))) 46 assert tstr.encode("utf-8") in b''.join(newapp({'HTTP_ACCEPT': 47 'text/plain'}, 48 (lambda a, b, c=None: None))) 49 50def test_template(): 51 """ verify that html() and plain() output methods work """ 52 e = HTTPInternalServerError() 53 e.template = 'A %(ping)s and <b>%(pong)s</b> message.' 54 assert str(e).startswith("500 Internal Server Error") 55 assert e.plain({'ping': 'fun', 'pong': 'happy'}) == ( 56 '500 Internal Server Error\r\n' 57 'A fun and happy message.\r\n') 58 assert '<p>A fun and <b>happy</b> message.</p>' in \ 59 e.html({'ping': 'fun', 'pong': 'happy'}) 60 61def test_redapp(): 62 """ check that redirect returns the correct, expected results """ 63 saved = [] 64 def saveit(status, headers, exc_info = None): 65 saved.append((status,headers)) 66 def redapp(environ, start_response): 67 raise HTTPFound("/bing/foo") 68 app = HTTPExceptionHandler(redapp) 69 result = list(app({'HTTP_ACCEPT': 'text/html'},saveit)) 70 assert b'<a href="/bing/foo">' in result[0] 71 assert "302 Found" == saved[0][0] 72 if six.PY3: 73 assert "text/html; charset=utf8" == header_value(saved[0][1], 'content-type') 74 else: 75 assert "text/html" == header_value(saved[0][1], 'content-type') 76 assert "/bing/foo" == header_value(saved[0][1],'location') 77 result = list(app({'HTTP_ACCEPT': 'text/plain'},saveit)) 78 assert "text/plain; charset=utf8" == header_value(saved[1][1],'content-type') 79 assert "/bing/foo" == header_value(saved[1][1],'location') 80 81def test_misc(): 82 assert get_exception(301) == HTTPMovedPermanently 83 redirect = HTTPFound("/some/path") 84 assert isinstance(redirect,HTTPException) 85 assert isinstance(redirect,HTTPRedirection) 86 assert not isinstance(redirect,HTTPError) 87 notfound = HTTPNotFound() 88 assert isinstance(notfound,HTTPException) 89 assert isinstance(notfound,HTTPError) 90 assert isinstance(notfound,HTTPClientError) 91 assert not isinstance(notfound,HTTPServerError) 92 notimpl = HTTPNotImplemented() 93 assert isinstance(notimpl,HTTPException) 94 assert isinstance(notimpl,HTTPError) 95 assert isinstance(notimpl,HTTPServerError) 96 assert not isinstance(notimpl,HTTPClientError) 97 98