changeset 13:942f278a9fff

refactored some stuff, added tests
author Atul Varma <varmaa@toolness.com>
date Wed, 23 Dec 2009 20:38:57 -0800
parents 4c4a2aba5383
children 3ebc043d9ff7
files bzapi.py test.py
diffstat 2 files changed, 46 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/bzapi.py	Wed Dec 23 20:05:07 2009 -0800
+++ b/bzapi.py	Wed Dec 23 20:38:57 2009 -0800
@@ -6,6 +6,20 @@
 import pymongo
 import simplejson as json
 
+def open_url(url, headers, query_args=None, urllib2=urllib2):
+    if query_args:
+        full_url = "%s?%s" % (url, urllib.urlencode(query_args))
+    else:
+        full_url = url
+
+    logging.debug('retrieving %s' % full_url)
+    request = urllib2.Request(full_url)
+
+    for name, value in headers.items():
+        request.add_header(name, value)
+
+    return urllib2.urlopen(request)
+
 def normalize_bug(bug):
     for name in ['last_change_time', 'creation_time']:
         bug[name] = datetime_from_iso(bug[name])
@@ -135,16 +149,13 @@
             self._validate_component(params['product'],
                                      params.get('component'))
 
-        full_url = "%s%s?%s" % (self.base_url,
-                                url,
-                                urllib.urlencode(params))
-
-        logging.debug('retrieving %s' % full_url)
-        request = self._urllib2.Request(full_url)
-        request.add_header('Accept', 'application/json')
-        request.add_header('Content-Type', 'application/json')
-
-        response = self._urllib2.urlopen(request)
+        response = open_url(
+            url=self.base_url + url,
+            query_args=params,
+            headers={'Accept': 'application/json',
+                     'Content-Type': 'application/json'},
+            urllib2=self._urllib2
+            )
 
         # TODO: instead of 'now', we'd like to use the 'Date'
         # HTTP header, but it's actually completely wrong in
--- a/test.py	Wed Dec 23 20:05:07 2009 -0800
+++ b/test.py	Wed Dec 23 20:38:57 2009 -0800
@@ -26,7 +26,9 @@
         return FakeRequest(url)
 
     def set_url(self, url, response):
-        self._responses[url] = json.dumps(response)
+        if not isinstance(response, basestring):
+            response = json.dumps(response)
+        self._responses[url] = response
 
     def urlopen(self, request):
         return StringIO.StringIO(self._responses[request.url])
@@ -47,9 +49,30 @@
         date = bzapi.datetime_from_rfc1123('Wed, 23 Dec 2009 20:42:59 GMT')
         self.assertEqual(str(date), '2009-12-23 20:42:59')
 
+    def test_open_url_works_without_query_args(self):
+        urllib2 = FakeUrllib2()
+        urllib2.set_url('http://foo/', 'boo')
+        self.assertEqual(
+            bzapi.open_url(url='http://foo/',
+                           headers={'Content-Type': 'text/plain'},
+                           urllib2=urllib2).read(),
+            'boo'
+            )
+
+    def test_open_url_works_with_query_args(self):
+        urllib2 = FakeUrllib2()
+        urllib2.set_url('http://foo/?blah=hi+there', 'meh')
+        self.assertEqual(
+            bzapi.open_url(url='http://foo/',
+                           query_args={'blah': 'hi there'},
+                           headers={'Content-Type': 'text/plain'},
+                           urllib2=urllib2).read(),
+            'meh'
+            )
+
     def _get_basic_fake_api(self):
         urllib2 = FakeUrllib2()
-        urllib2.set_url('http://foo/latest/configuration?', FAKE_CONFIG)
+        urllib2.set_url('http://foo/latest/configuration', FAKE_CONFIG)
 
         api = bzapi.BugzillaApi('http://foo/latest', FakeCollection(),
                                 urllib2=urllib2)