tests/test_wsgi.py
author Tero Marttila <terom@fixme.fi>
Mon, 16 Feb 2009 22:40:35 +0200
changeset 86 6ff1140586d6
permissions -rw-r--r--
some tests for wsgi.Application
86
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
# :set charset=utf8
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
"""
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
    Testing the basic wsgi.Application code
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
"""
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
import unittest, sys
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
import wsgi, handler, http
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
class _DummyHandler (handler.RequestHandler) :
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
    def __init__ (self, response=None, error=None) :
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
        self.response = response
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
        self.error = error
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    def handle_request (self, req) :
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
        if self.error :
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
            raise self.error
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
        elif self.response :
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
            return self.response
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
        
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
        else :
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
            assert False
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
class TestWSGI (unittest.TestCase) :
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
    def setUp (self) :
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
        self.status = None
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
        self.headers = None
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
    def _build_exc_info (self) :
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
        # generate some random exception
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
        try :
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
            int("xxx")
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
        except ValueError, e :
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
            return sys.exc_info()
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
    
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
    def _build_env (self) :
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
        return {
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
            'REQUEST_METHOD':   "GET",
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
            'SCRIPT_NAME':      "/index.cgi",
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
            'PATH_INFO':        "",
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
            'REQUEST_URI':      "/index.cgi",
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
        }
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
    def _build_app (self, **kwargs) :
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
        return wsgi.Application(_DummyHandler(**kwargs))
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
    def _start_response (self, status, headers, exc_info=None) :
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
        self.assertEqual(self.status, None)
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
        self.assertEqual(self.headers, None)
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        self.assertEqual(type(status), str)
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
        self.assertEqual(type(headers), list)
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        for name, value in headers :
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
            self.assertEqual(type(name), str)
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
            self.assertEqual(type(value), str)
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
        
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
        self.status = status
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
        self.headers = headers
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
    def test_handle_error (self) :
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
        app = self._build_app()
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
        env = self._build_env()
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
        data = app.handle_error(self._build_exc_info(), env, self._start_response)
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
        self.assertEqual(self.status[:3], "500")
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
        self.assertEqual(type(data), str)
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
    
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
    def test_handle_request_response (self) :
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
        app = self._build_app(response=http.Response("foo"))
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
        env = self._build_env()
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
        data = list(app.handle_request(env, self._start_response))
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
        self.assertEqual(self.status, "200 OK")
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
        self.assertEqual(self.headers, [('Content-type', "text/html; charset=\"UTF-8\"")])
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
        self.assertEqual(data, ["foo"])
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
    def test_handle_request_response_error (self) :
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
        app = self._build_app(error=http.ResponseError("--bar--"))
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
        env = self._build_env()
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
        data = list(app.handle_request(env, self._start_response))
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
        self.assertEqual(self.status, "400 Bad Request")
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
        self.assertEqual(self.headers, [('Content-type', "text/html; charset=\"UTF-8\"")])
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
        self.assertTrue("--bar--" in ''.join(data))
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
    def test_call (self) :
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
        app = self._build_app(response=http.Response("foo"))
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
        env = self._build_env()
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
        
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
        data = list(app(env, self._start_response))
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
        self.assertEqual(self.status, "200 OK")
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
        self.assertEqual(self.headers, [('Content-type', "text/html; charset=\"UTF-8\"")])
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
        self.assertEqual(data, ["foo"])
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
    def test_call_error (self) :
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
        app = self._build_app(error=ValueError("--foo--"))
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
        env = self._build_env()
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
        data = list(app(env, self._start_response))
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
        self.assertEqual(self.status, "500 Internal Server Error")
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
        self.assertEqual(self.headers, [('Content-type', "text/plain; charset=UTF-8")])
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
        self.assertTrue("ValueError: --foo--" in ''.join(data))
6ff1140586d6 some tests for wsgi.Application
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110