test.py
changeset 75 f94c06cfcc0e
parent 74 406cf77d23f9
child 76 2f659ff51c75
equal deleted inserted replaced
74:406cf77d23f9 75:f94c06cfcc0e
     1 #!/usr/bin/env python2.5
       
     2 # :set encoding=utf8
       
     3 
       
     4 """
       
     5     General unit tests
       
     6 """
       
     7 
       
     8 import unittest
       
     9 from cStringIO import StringIO
       
    10 
       
    11 import http
       
    12 
       
    13 class TestHttpUtil (unittest.TestCase) :
       
    14     def test_request_url (self) :
       
    15         for env, url in (
       
    16             ({
       
    17                 'wsgi.url_scheme':  "https",
       
    18                 'HTTP_HOST':        "testhost",
       
    19                 'REQUEST_URI':      "/test"
       
    20             }, "https://testhost/test"),
       
    21             ({
       
    22                 'HTTP_HOST':        "-"
       
    23             }, "[???]://-[???]")
       
    24         ) :
       
    25             self.assertEqual(http.request_url(env), url)
       
    26 
       
    27 class TestHttpRequest (unittest.TestCase) :
       
    28     def build_request (self, env_dict={}, **env_kw) :
       
    29         env = {
       
    30             'wsgi.url_scheme':      "http",
       
    31             'HTTP_HOST':            "testhost",
       
    32             'REQUEST_METHOD':       "GET",
       
    33         }
       
    34         env.update(env_dict)
       
    35         env.update(env_kw)
       
    36 
       
    37         return http.Request(env)
       
    38     
       
    39     def test_site_host (self) :
       
    40         self.assertEqual(self.build_request(HTTP_HOST='testhost').site_host, "testhost")
       
    41         self.assertEqual(self.build_request(HTTP_HOST='testhost:13').site_host, "testhost:13")
       
    42     
       
    43     def test_site_root (self) :
       
    44         for script_name, site_root in (
       
    45             ('',            ""         ),
       
    46             ('/foo',        ""         ),
       
    47             ('/foo/bar/',   "/foo/bar"  ),
       
    48         ) :
       
    49             self.assertEqual(self.build_request(SCRIPT_NAME=script_name).site_root, site_root)
       
    50     
       
    51     def test_get_page_name (self) :
       
    52         for path_info, page_name in (
       
    53             ('',                ""),
       
    54             ('/',               ""),
       
    55             ('/foo1/bar',       "foo1/bar"),
       
    56             ('/foo2/bar/',      "foo2/bar/"),
       
    57             ('/foo3/bar/../',   "foo3/"),
       
    58             ('/foo4/bar/..',    "foo4"),
       
    59             ('//',              ""),
       
    60         ) :
       
    61             self.assertEqual(self.build_request(PATH_INFO=path_info).get_page_name(), page_name)
       
    62     
       
    63     def _test_page_prefix (self, request_uri, path_info, page_prefix) :
       
    64         self.assertEqual(self.build_request(REQUEST_URI=request_uri, PATH_INFO=path_info).page_prefix, page_prefix)
       
    65 
       
    66     def test_page_prefix_empty (self) :
       
    67         self._test_page_prefix('', '', "")
       
    68 
       
    69     def test_page_prefix_root_dir (self) :
       
    70         self._test_page_prefix('/foo/', '/foo/', "")
       
    71     
       
    72     def test_page_prefix_cgi (self) :
       
    73         self._test_page_prefix('/foo.cgi/quux', '/quux', "/foo.cgi")
       
    74 
       
    75     def test_page_prefix_qargs (self) :
       
    76         self._test_page_prefix('/foo.cgi/?foo', '/', "/foo.cgi")
       
    77     
       
    78     def test_get_arg (self) :
       
    79         for query_string, key, value in (
       
    80             ('',                'foo',      None),
       
    81             ('foo',             'foo',      ''),
       
    82             ('foo=',            'foo',      ''),
       
    83             ('foo=bar',         'foo',      'bar'),
       
    84             ('foo=&bar=.',      'bar',      '.'),
       
    85         ) :
       
    86             self.assertEqual(self.build_request(QUERY_STRING=query_string).get_arg(key, None), value)
       
    87     
       
    88     def test_get_args (self) :
       
    89         for query_string, keyvals in (
       
    90             ('',                []),
       
    91             ('foo1=&bar',       [('foo1', ''), ('bar', '')]),
       
    92             ('foo2=bar',        [('foo2', 'bar')]),
       
    93             ('foo3=bar&foo3',   [('foo3', 'bar'), ('foo3', '')]),
       
    94         ) :
       
    95             self.assertEqual(self.build_request(QUERY_STRING=query_string).get_args(), keyvals)
       
    96     
       
    97     def _build_post (self, method='POST', **vals) :
       
    98         data = '&'.join('%s=%s' % kv for kv in vals.iteritems())
       
    99 
       
   100         return self.build_request({'wsgi.input': StringIO(data)}, REQUEST_METHOD=method, CONTENT_TYPE='application/x-www-form-urlencoded')
       
   101 
       
   102     def test_is_post (self) :
       
   103         for request_method, bool in (
       
   104             ('GET',             False),
       
   105             ('POST',            True),
       
   106             ('post',            True),
       
   107         ) :
       
   108             self.assertEqual(self._build_post(method=request_method).is_post(), bool)
       
   109         
       
   110     def _test_post (self, **vals) :
       
   111         req = self._build_post(**vals)
       
   112     
       
   113     def test_post_empty (self) :
       
   114         req = self._build_post()
       
   115 
       
   116         self.assertTrue(req.is_post())
       
   117         self.assertEqual(req.get_post('foo', None), None)
       
   118     
       
   119     def test_post_simple (self) :
       
   120         req = self._build_post(foo='bar')
       
   121 
       
   122         self.assertTrue(req.is_post())
       
   123         self.assertEqual(req.get_post('foo', None), 'bar')
       
   124 
       
   125 class TestHttpResponse (unittest.TestCase) :
       
   126     def test_status (self) :
       
   127         response = http.Response(None, status='100 Continue')
       
   128 
       
   129         self.assertEqual(response.get_status(), '100 Continue')
       
   130     
       
   131     def test_data_empty (self) :
       
   132         self.assertEqual(http.Response(None).get_data(), '')
       
   133 
       
   134     def test_data_str (self) :
       
   135         self.assertEqual(http.Response('foo').get_data(), 'foo')
       
   136     
       
   137     def test_data_utf8 (self) :
       
   138         data = u'föö'
       
   139 
       
   140         self.assertEqual(http.Response(data).get_data(), data.encode('utf8'))
       
   141 
       
   142     def test_data_utf16 (self) :
       
   143         data = u'fåå'
       
   144 
       
   145         self.assertEqual(http.Response(data, charset='utf16').get_data(), data.encode('utf16'))
       
   146     
       
   147     def test_data_binary (self) :
       
   148         data = '\x01\x00'
       
   149 
       
   150         self.assertEqual(http.Response(data, charset=None).get_data(), data)
       
   151     
       
   152     def test_content_type_none (self) :
       
   153         response = http.Response(None, content_type=None)
       
   154 
       
   155         self.assertEqual(response.get_headers(), [])
       
   156     
       
   157     def test_content_type_default (self) :
       
   158         self.assertEqual(http.Response(None).get_headers(), [('Content-type', "text/html; charset=\"UTF-8\"")])
       
   159 
       
   160     def test_content_type_weird (self) :
       
   161         self.assertEqual(http.Response(None, content_type="foo/x-bar").get_headers(), [('Content-type', "foo/x-bar; charset=\"UTF-8\"")])
       
   162 
       
   163     def test_content_type_charset (self) :
       
   164         self.assertEqual(http.Response(None, content_type="foo/x-bar", charset="---").get_headers(), [('Content-type', "foo/x-bar; charset=\"---\"")])
       
   165     
       
   166     def _build_headers (self, tlist=None, **map) :
       
   167         response = http.Response(None)
       
   168 
       
   169         if tlist :
       
   170             for name, value, params in tlist :
       
   171                 response.add_header(name, value, **params)
       
   172         
       
   173         for name, value in map.iteritems() :
       
   174             response.add_header(name, value)
       
   175        
       
   176         return response
       
   177         
       
   178     def test_headers_simple (self) :
       
   179         self.assertEqual(self._build_headers(**{'X-Foo': 'bar, never'}).get_headers(), [
       
   180             ('Content-type', "text/html; charset=\"UTF-8\""),
       
   181             ('X-Foo', "bar, never")
       
   182         ])
       
   183 
       
   184     def test_headers_params (self) :
       
   185         self.assertEqual(self._build_headers([('X-Bar', 'bar', dict(never='yes'))]).get_headers(), [
       
   186             ('Content-type', "text/html; charset=\"UTF-8\""),
       
   187             ('X-Bar', "bar; never=\"yes\"")
       
   188         ])
       
   189 
       
   190     def test_headers_multi (self) :
       
   191         self.assertEqual(self._build_headers([('X-Bar', 'bar', {}), ('X-bar', 'foo', {})]).get_headers(), [
       
   192             ('Content-type', "text/html; charset=\"UTF-8\""),
       
   193             ('X-Bar', "bar"),
       
   194             ('X-bar', "foo"),
       
   195         ])
       
   196 
       
   197 if __name__ == '__main__' :
       
   198     unittest.main()
       
   199