# -*- coding: utf-8 -*-
from trac.test import Mock
from trac.web.api import Request,RequestDone
from trac.web.clearsilver import HDFWrapper
from Cookie import SimpleCookie
from StringIO import StringIO
import unittest
class RequestTestCase(unittest.TestCase):
def _make_environ(self, scheme='http', server_name='example.org',
server_port=80, method='GET', script_name='/trac',
**kwargs):
environ = {'wsgi.url_scheme': scheme, 'wsgi.input': StringIO(''),
'REQUEST_METHOD': method, 'SERVER_NAME': server_name,
'SERVER_PORT': server_port, 'SCRIPT_NAME': script_name}
environ.update(kwargs)
return environ
def test_base_url(self):
environ = self._make_environ()
req = Request(environ, None)
self.assertEqual('http://example.org/trac', req.base_url)
def test_base_url_host(self):
environ = self._make_environ(server_port=8080, HTTP_HOST='example.com')
req = Request(environ, None)
self.assertEqual('http://example.com/trac', req.base_url)
def test_base_url_nondefaultport(self):
environ = self._make_environ(server_port=8080)
req = Request(environ, None)
self.assertEqual('http://example.org:8080/trac', req.base_url)
def test_base_url_https(self):
environ = self._make_environ(scheme='https', server_port=443)
req = Request(environ, None)
self.assertEqual('https://example.org/trac', req.base_url)
def test_base_url_https_host(self):
environ = self._make_environ(scheme='https', server_port=443,
HTTP_HOST='example.com')
req = Request(environ, None)
self.assertEqual('https://example.com/trac', req.base_url)
def test_base_url_https_nondefaultport(self):
environ = self._make_environ(scheme='https', server_port=8443)
req = Request(environ, None)
self.assertEqual('https://example.org:8443/trac', req.base_url)
def test_base_url_proxy(self):
environ = self._make_environ(HTTP_HOST='localhost',
HTTP_X_FORWARDED_HOST='example.com')
req = Request(environ, None)
self.assertEqual('http://localhost/trac', req.base_url)
def test_redirect(self):
status_sent = []
headers_sent = {}
def start_response(status, headers):
status_sent.append(status)
headers_sent.update(dict(headers))
environ = self._make_environ(method='HEAD')
req = Request(environ, start_response)
req.session = Mock(save=lambda: None)
self.assertRaises(RequestDone, req.redirect, '/trac/test')
self.assertEqual('302 Found', status_sent[0])
self.assertEqual('http://example.org/trac/test',
headers_sent['Location'])
def test_redirect_absolute(self):
status_sent = []
headers_sent = {}
def start_response(status, headers):
status_sent.append(status)
headers_sent.update(dict(headers))
environ = self._make_environ(method='HEAD')
req = Request(environ, start_response,)
req.session = Mock(save=lambda: None)
self.assertRaises(RequestDone, req.redirect,
'http://example.com/trac/test')
self.assertEqual('302 Found', status_sent[0])
self.assertEqual('http://example.com/trac/test',
headers_sent['Location'])
def test_write_unicode(self):
buf = StringIO()
def write(data):
buf.write(data)
def start_response(status, headers):
return write
environ = self._make_environ(method='HEAD')
req = Request(environ, start_response)
req.send_header('Content-Type', 'text/plain;charset=utf-8')
req.write(u'F')
self.assertEqual('F', buf.getvalue())
def test_invalid_cookies(self):
environ = self._make_environ(HTTP_COOKIE='bad:key=value;')
req = Request(environ, None)
self.assertEqual('', str(req.incookie))
def test_read(self):
environ = self._make_environ(**{'wsgi.input': StringIO('test input')})
req = Request(environ, None)
self.assertEqual('test input', req.read())
def test_read_size(self):
environ = self._make_environ(**{'wsgi.input': StringIO('test input')})
req = Request(environ, None)
self.assertEqual('test', req.read(size=4))
def test_qs_on_post(self):
"""Make sure req.args parsing is consistent even after the backwards
incompatible change introduced in Python 2.6.
"""
environ = self._make_environ(method='GET',
**{'QUERY_STRING': 'action=foo'})
req = Request(environ, None)
self.assertEqual('foo', req.args['action'])
environ = self._make_environ(method='POST',
**{'wsgi.input': StringIO('action=bar'),
'CONTENT_LENGTH': '10',
'CONTENT_TYPE': 'application/x-www-form-urlencoded',
'QUERY_STRING': 'action=foo'})
req = Request(environ, None)
self.assertEqual('bar', req.args['action'])
def suite():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(RequestTestCase, 'test'))
return suite
if __name__ == '__main__':
unittest.main()
|