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
# :set charset=utf8
"""
    Testing the basic wsgi.Application code
"""

import unittest, sys
import wsgi, handler, http

class _DummyHandler (handler.RequestHandler) :
    def __init__ (self, response=None, error=None) :
        self.response = response
        self.error = error

    def handle_request (self, req) :
        if self.error :
            raise self.error

        elif self.response :
            return self.response
        
        else :
            assert False

class TestWSGI (unittest.TestCase) :
    def setUp (self) :
        self.status = None
        self.headers = None
    
    def _build_exc_info (self) :
        # generate some random exception
        try :
            int("xxx")

        except ValueError, e :
            return sys.exc_info()
    
    def _build_env (self) :
        return {
            'REQUEST_METHOD':   "GET",
            'SCRIPT_NAME':      "/index.cgi",
            'PATH_INFO':        "",
            'REQUEST_URI':      "/index.cgi",
        }

    def _build_app (self, **kwargs) :
        return wsgi.Application(_DummyHandler(**kwargs))

    def _start_response (self, status, headers, exc_info=None) :
        self.assertEqual(self.status, None)
        self.assertEqual(self.headers, None)

        self.assertEqual(type(status), str)
        self.assertEqual(type(headers), list)

        for name, value in headers :
            self.assertEqual(type(name), str)
            self.assertEqual(type(value), str)
        
        self.status = status
        self.headers = headers

    def test_handle_error (self) :
        app = self._build_app()
        env = self._build_env()

        data = app.handle_error(self._build_exc_info(), env, self._start_response)

        self.assertEqual(self.status[:3], "500")
        self.assertEqual(type(data), str)
    
    def test_handle_request_response (self) :
        app = self._build_app(response=http.Response("foo"))
        env = self._build_env()

        data = list(app.handle_request(env, self._start_response))

        self.assertEqual(self.status, "200 OK")
        self.assertEqual(self.headers, [('Content-type', "text/html; charset=\"UTF-8\"")])
        self.assertEqual(data, ["foo"])

    def test_handle_request_response_error (self) :
        app = self._build_app(error=http.ResponseError("--bar--"))
        env = self._build_env()

        data = list(app.handle_request(env, self._start_response))

        self.assertEqual(self.status, "400 Bad Request")
        self.assertEqual(self.headers, [('Content-type', "text/html; charset=\"UTF-8\"")])
        self.assertTrue("--bar--" in ''.join(data))

    def test_call (self) :
        app = self._build_app(response=http.Response("foo"))
        env = self._build_env()
        
        data = list(app(env, self._start_response))

        self.assertEqual(self.status, "200 OK")
        self.assertEqual(self.headers, [('Content-type', "text/html; charset=\"UTF-8\"")])
        self.assertEqual(data, ["foo"])

    def test_call_error (self) :
        app = self._build_app(error=ValueError("--foo--"))
        env = self._build_env()

        data = list(app(env, self._start_response))

        self.assertEqual(self.status, "500 Internal Server Error")
        self.assertEqual(self.headers, [('Content-type', "text/plain; charset=UTF-8")])
        self.assertTrue("ValueError: --foo--" in ''.join(data))