So, I wanted to do some very simple functional tests using a real-ish webserver, but I didn’t want to have to depend on twisted.web or an external setup. So I did this:

from wsgiref.simple_server import make_server
from multiprocessing import Process, Queue

class TestPosting(unittest.TestCase):
    # FIXME: THIS IS TERROBLE

    def setUp(self):
        self.q = Queue()
        self.p = Process(target=self.serve, args=(self.q,))
        self.p.start()
        self.port = self.q.get()

    def serve(self, q):
        httpd = make_server('', 0, simple_app_maker(q))
        port = httpd.server_port
        q.put(port)
        httpd.serve_forever()

    def tearDown(self):
        self.p.terminate()

    def test_something(self):
        url = "http://locahost:%s/whatever" % self.port
        ...
        result = self.queue.get()
        # make some assertions on the results

def simple_app_maker(queue):
    def simple_app(environ, start_response):
        post_env = environ.copy()
        post_env['QUERY_STRING'] = ''
        post = cgi.FieldStorage(
            fp=environ['wsgi.input'],
            environ=post_env,
            keep_blank_values=True
        )
        q.put(...) # put the relevant stuff in the queue
        status = '200 OK'
        response_headers = [('Content-type','text/plain')]
        start_response(status, response_headers)
        return ['Hello world!\n']
    return simple_app

just have the simple_app function put whatever you want to check in the queue, and your tests pull it out and make some assertions. Super nasty, but it actually works!

blog comments powered by Disqus

IPv6 Accessible Powered by IkiWiki
Last edited late Tuesday evening, May 17th, 2011. © Rob Weir 2003-2011.