Home | History | Annotate | Download | only in tests
      1 # -*- coding: utf-8 -*-
      2 import webapp2
      3 
      4 import test_base
      5 
      6 
      7 class NoStringOrUnicodeConversion(object):
      8     pass
      9 
     10 
     11 class StringConversion(object):
     12     def __str__(self):
     13         return 'foo'.encode('utf-8')
     14 
     15 
     16 class UnicodeConversion(object):
     17     def __unicode__(self):
     18         return 'bar'.decode('utf-8')
     19 
     20 
     21 class TestResponse(test_base.BaseTestCase):
     22     def test_write(self):
     23         var_1 = NoStringOrUnicodeConversion()
     24         var_2 = StringConversion()
     25         var_3 = UnicodeConversion()
     26 
     27         rsp = webapp2.Response()
     28         rsp.write(var_1)
     29         rsp.write(var_2)
     30         rsp.write(var_3)
     31         self.assertEqual(rsp.body, '%rfoobar' % var_1)
     32 
     33         rsp = webapp2.Response()
     34         rsp.write(var_1)
     35         rsp.write(var_3)
     36         rsp.write(var_2)
     37         self.assertEqual(rsp.body, '%rbarfoo' % var_1)
     38 
     39         rsp = webapp2.Response()
     40         rsp.write(var_2)
     41         rsp.write(var_1)
     42         rsp.write(var_3)
     43         self.assertEqual(rsp.body, 'foo%rbar' % var_1)
     44 
     45         rsp = webapp2.Response()
     46         rsp.write(var_2)
     47         rsp.write(var_3)
     48         rsp.write(var_1)
     49         self.assertEqual(rsp.body, 'foobar%r' % var_1)
     50 
     51         rsp = webapp2.Response()
     52         rsp.write(var_3)
     53         rsp.write(var_1)
     54         rsp.write(var_2)
     55         self.assertEqual(rsp.body, 'bar%rfoo' % var_1)
     56 
     57         rsp = webapp2.Response()
     58         rsp.write(var_3)
     59         rsp.write(var_2)
     60         rsp.write(var_1)
     61         self.assertEqual(rsp.body, 'barfoo%r' % var_1)
     62 
     63     def test_write2(self):
     64         rsp = webapp2.Response()
     65         rsp.charset = None
     66         rsp.write(u'foo')
     67 
     68         self.assertEqual(rsp.body, u'foo')
     69         self.assertEqual(rsp.charset, 'utf-8')
     70 
     71     def test_status(self):
     72         rsp = webapp2.Response()
     73 
     74         self.assertEqual(rsp.status, '200 OK')
     75         self.assertEqual(rsp.status_int, 200)
     76         self.assertEqual(rsp.status_message, 'OK')
     77 
     78         rsp.status = u'200 OK'
     79         self.assertEqual(rsp.status, '200 OK')
     80         self.assertEqual(rsp.status_int, 200)
     81         self.assertEqual(rsp.status_message, 'OK')
     82 
     83         rsp.status_message = 'Weee'
     84         self.assertEqual(rsp.status, '200 Weee')
     85         self.assertEqual(rsp.status_int, 200)
     86         self.assertEqual(rsp.status_message, 'Weee')
     87 
     88         rsp.status = 404
     89         self.assertEqual(rsp.status, '404 Not Found')
     90         self.assertEqual(rsp.status_int, 404)
     91         self.assertEqual(rsp.status_message, 'Not Found')
     92 
     93         rsp.status = '403 Wooo'
     94         self.assertEqual(rsp.status, '403 Wooo')
     95         self.assertEqual(rsp.status_int, 403)
     96         self.assertEqual(rsp.status_message, 'Wooo')
     97 
     98         rsp.status_int = 500
     99         self.assertEqual(rsp.status, '500 Internal Server Error')
    100         self.assertEqual(rsp.status_int, 500)
    101         self.assertEqual(rsp.status_message, 'Internal Server Error')
    102 
    103         self.assertRaises(TypeError, rsp._set_status, ())
    104 
    105     def test_has_error(self):
    106         rsp = webapp2.Response()
    107         self.assertFalse(rsp.has_error())
    108         rsp.status = 400
    109         self.assertTrue(rsp.has_error())
    110         rsp.status = 404
    111         self.assertTrue(rsp.has_error())
    112         rsp.status = 500
    113         self.assertTrue(rsp.has_error())
    114         rsp.status = 200
    115         self.assertFalse(rsp.has_error())
    116         rsp.status = 302
    117         self.assertFalse(rsp.has_error())
    118 
    119     def test_wsgi_write(self):
    120         res = []
    121 
    122         def write(status, headers, body):
    123             return res.extend([status, headers, body])
    124 
    125         def start_response(status, headers):
    126             return lambda body: write(status, headers, body)
    127 
    128         rsp = webapp2.Response(body='Page not found!', status=404)
    129         rsp.wsgi_write(start_response)
    130 
    131         rsp = webapp2.Response(status=res[0], body=res[2], headers=res[1])
    132         self.assertEqual(rsp.status, '404 Not Found')
    133         self.assertEqual(rsp.body, 'Page not found!')
    134 
    135         '''
    136         # webob >= 1.0
    137         self.assertEqual(res, [
    138             '404 Not Found',
    139             [
    140                 ('Content-Type', 'text/html; charset=utf-8'),
    141                 ('Cache-Control', 'no-cache'),
    142                 ('Expires', 'Fri, 01 Jan 1990 00:00:00 GMT'),
    143                 ('Content-Length', '15')
    144             ],
    145             'Page not found!'
    146         ])
    147         '''
    148 
    149     def test_get_all(self):
    150         rsp = webapp2.Response()
    151         rsp.headers.add('Set-Cookie', 'foo=bar;')
    152         rsp.headers.add('Set-Cookie', 'baz=ding;')
    153 
    154         self.assertEqual(rsp.headers.get_all('set-cookie'),
    155             ['foo=bar;', 'baz=ding;'])
    156 
    157         rsp = webapp2.Response()
    158         rsp.headers = {'Set-Cookie': 'foo=bar;'}
    159         self.assertEqual(rsp.headers.get_all('set-cookie'), ['foo=bar;'])
    160 
    161     def test_add_header(self):
    162         rsp = webapp2.Response()
    163         rsp.headers.add_header('Content-Disposition', 'attachment',
    164             filename='bud.gif')
    165         self.assertEqual(rsp.headers.get('content-disposition'),
    166             'attachment; filename="bud.gif"')
    167 
    168         rsp = webapp2.Response()
    169         rsp.headers.add_header('Content-Disposition', 'attachment',
    170             filename=None)
    171         self.assertEqual(rsp.headers.get('content-disposition'),
    172             'attachment; filename')
    173 
    174         rsp = webapp2.Response()
    175         rsp.headers.add_header('Set-Cookie', '', foo='')
    176         self.assertEqual(rsp.headers.get_all('set-cookie'), ['; foo'])
    177 
    178         rsp = webapp2.Response()
    179         rsp.headers.add_header('Set-Cookie', '', foo=';')
    180         self.assertEqual(rsp.headers.get_all('set-cookie'), ['; foo=";"'])
    181 
    182     # Tests from Python source: wsgiref.headers.Headers
    183     def test_headers_MappingInterface(self):
    184         rsp = webapp2.Response()
    185         test = [('x','y')]
    186         self.assertEqual(len(rsp.headers), 3)
    187         rsp.headers = test[:]
    188         self.assertEqual(len(rsp.headers), 1)
    189         self.assertEqual(rsp.headers.keys(), ['x'])
    190         self.assertEqual(rsp.headers.values(), ['y'])
    191         self.assertEqual(rsp.headers.items(), test)
    192         rsp.headers = test
    193         self.assertFalse(rsp.headers.items() is test)  # must be copy!
    194 
    195         rsp = webapp2.Response()
    196         h = rsp.headers
    197         # this doesn't raise an error in wsgiref.headers.Headers
    198         # del h['foo']
    199 
    200         h['Foo'] = 'bar'
    201         for m in h.has_key, h.__contains__, h.get, h.get_all, h.__getitem__:
    202             self.assertTrue(m('foo'))
    203             self.assertTrue(m('Foo'))
    204             self.assertTrue(m('FOO'))
    205             # this doesn't raise an error in wsgiref.headers.Headers
    206             # self.assertFalse(m('bar'))
    207 
    208         self.assertEqual(h['foo'],'bar')
    209         h['foo'] = 'baz'
    210         self.assertEqual(h['FOO'],'baz')
    211         self.assertEqual(h.get_all('foo'),['baz'])
    212 
    213         self.assertEqual(h.get("foo","whee"), "baz")
    214         self.assertEqual(h.get("zoo","whee"), "whee")
    215         self.assertEqual(h.setdefault("foo","whee"), "baz")
    216         self.assertEqual(h.setdefault("zoo","whee"), "whee")
    217         self.assertEqual(h["foo"],"baz")
    218         self.assertEqual(h["zoo"],"whee")
    219 
    220     def test_headers_RequireList(self):
    221         def set_headers():
    222             rsp = webapp2.Response()
    223             rsp.headers = 'foo'
    224             return rsp.headers
    225 
    226         self.assertRaises(TypeError, set_headers)
    227 
    228     def test_headers_Extras(self):
    229         rsp = webapp2.Response()
    230         rsp.headers = []
    231         h = rsp.headers
    232         self.assertEqual(str(h),'\r\n')
    233 
    234         h.add_header('foo','bar',baz="spam")
    235         self.assertEqual(h['foo'], 'bar; baz="spam"')
    236         self.assertEqual(str(h),'foo: bar; baz="spam"\r\n\r\n')
    237 
    238         h.add_header('Foo','bar',cheese=None)
    239         self.assertEqual(h.get_all('foo'),
    240             ['bar; baz="spam"', 'bar; cheese'])
    241 
    242         self.assertEqual(str(h),
    243             'foo: bar; baz="spam"\r\n'
    244             'Foo: bar; cheese\r\n'
    245             '\r\n'
    246         )
    247 
    248 
    249 class TestReturnResponse(test_base.BaseTestCase):
    250     def test_function_that_returns_response(self):
    251         def myfunction(request, *args, **kwargs):
    252             return webapp2.Response('Hello, custom response world!')
    253 
    254         app = webapp2.WSGIApplication([
    255             ('/', myfunction),
    256         ])
    257 
    258         req = webapp2.Request.blank('/')
    259         rsp = req.get_response(app)
    260         self.assertEqual(rsp.status_int, 200)
    261         self.assertEqual(rsp.body, 'Hello, custom response world!')
    262 
    263     def test_function_that_returns_string(self):
    264         def myfunction(request, *args, **kwargs):
    265             return 'Hello, custom response world!'
    266 
    267         app = webapp2.WSGIApplication([
    268             ('/', myfunction),
    269         ])
    270 
    271         def custom_dispatcher(router, request, response):
    272             response_str = router.default_dispatcher(request, response)
    273             return request.app.response_class(response_str)
    274 
    275         app.router.set_dispatcher(custom_dispatcher)
    276 
    277         req = webapp2.Request.blank('/')
    278         rsp = req.get_response(app)
    279         self.assertEqual(rsp.status_int, 200)
    280         self.assertEqual(rsp.body, 'Hello, custom response world!')
    281 
    282     def test_function_that_returns_tuple(self):
    283         def myfunction(request, *args, **kwargs):
    284             return 'Hello, custom response world!', 404
    285 
    286         app = webapp2.WSGIApplication([
    287             ('/', myfunction),
    288         ])
    289 
    290         def custom_dispatcher(router, request, response):
    291             response_tuple = router.default_dispatcher(request, response)
    292             return request.app.response_class(*response_tuple)
    293 
    294         app.router.set_dispatcher(custom_dispatcher)
    295 
    296         req = webapp2.Request.blank('/')
    297         rsp = req.get_response(app)
    298         self.assertEqual(rsp.status_int, 404)
    299         self.assertEqual(rsp.body, 'Hello, custom response world!')
    300 
    301     def test_handle_exception_that_returns_response(self):
    302         class HomeHandler(webapp2.RequestHandler):
    303             def get(self, **kwargs):
    304                 raise TypeError()
    305 
    306         app = webapp2.WSGIApplication([
    307             webapp2.Route('/', HomeHandler, name='home'),
    308         ])
    309         app.error_handlers[500] = 'resources.handlers.handle_exception'
    310 
    311         req = webapp2.Request.blank('/')
    312         rsp = req.get_response(app)
    313         self.assertEqual(rsp.status_int, 200)
    314         self.assertEqual(rsp.body, 'Hello, custom response world!')
    315 
    316     def test_return_is_not_wsgi_app(self):
    317         class HomeHandler(webapp2.RequestHandler):
    318             def get(self, **kwargs):
    319                 return ''
    320 
    321         app = webapp2.WSGIApplication([
    322             webapp2.Route('/', HomeHandler, name='home'),
    323         ], debug=False)
    324 
    325         req = webapp2.Request.blank('/')
    326         rsp = req.get_response(app)
    327         self.assertEqual(rsp.status_int, 500)
    328 
    329 
    330 if __name__ == '__main__':
    331     test_base.main()
    332