changeset 10:2731713f61a8

added more tests and a totally untested 'observer' mechanism
author Atul Varma <varmaa@toolness.com>
date Wed, 23 Dec 2009 16:12:27 -0800
parents bac306ebd2da
children f7a14f8868e9
files bzapi.py example.py test.py
diffstat 3 files changed, 62 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/bzapi.py	Wed Dec 23 15:14:22 2009 -0800
+++ b/bzapi.py	Wed Dec 23 16:12:27 2009 -0800
@@ -35,8 +35,12 @@
             sanitize(item)
 
 class CachedSearch(object):
-    def __init__(self, api, collection, **kwargs):
+    def __init__(self, api, collection, observers=None, **kwargs):
+        if observers is None:
+            observers = []
+
         self.options = kwargs
+        self.observers = observers
 
         self.bugs = collection
         self.api = api
@@ -62,6 +66,8 @@
             normalize_bug(bug)
             bug['retrieved_time'] = response['date']
             self.bugs.save(bug)
+            for observer in self.observers:
+                observer.notify({'bug': bug['id']})
 
     def update(self):
         params = {}
@@ -85,7 +91,11 @@
             self._update_last_update()
 
 class BugzillaApi(object):
-    def __init__(self, base_url, collection, username=None, password=None):
+    def __init__(self, base_url, collection, username=None, password=None,
+                 urllib2=urllib2, utcnow=datetime.utcnow):
+        self._urllib2 = urllib2
+        self._utcnow = utcnow
+
         self.base_url = base_url
         self.username = username
         self.password = password
@@ -109,7 +119,7 @@
             raise ValueError(msg)
 
     def get(self, url, **kwargs):
-        now = datetime.utcnow().replace(microsecond=0)
+        now = self._utcnow().replace(microsecond=0)
 
         for name, value in kwargs.items():
             if isinstance(value, datetime):
@@ -130,11 +140,11 @@
                                 urllib.urlencode(params))
 
         logging.debug('retrieving %s' % full_url)
-        request = urllib2.Request(full_url)
+        request = self._urllib2.Request(full_url)
         request.add_header('Accept', 'application/json')
         request.add_header('Content-Type', 'application/json')
 
-        response = urllib2.urlopen(request)
+        response = self._urllib2.urlopen(request)
 
         # TODO: instead of 'now', we'd like to use the 'Date'
         # HTTP header, but it's actually completely wrong in
--- a/example.py	Wed Dec 23 15:14:22 2009 -0800
+++ b/example.py	Wed Dec 23 16:12:27 2009 -0800
@@ -26,7 +26,7 @@
     )
 
 search.update()
-#print search.bugs.find_one({'id': '530169'})
+#print search.bugs.find_one({'id': '536619'})
 
 #print len([bug for bug in search.bugs.itervalues()])
 
--- a/test.py	Wed Dec 23 15:14:22 2009 -0800
+++ b/test.py	Wed Dec 23 16:12:27 2009 -0800
@@ -1,6 +1,42 @@
 import unittest
+import StringIO
+
+import simplejson as json
+import bzapi
+
+FAKE_CONFIG = {
+    'product': {
+        'Mozilla Labs': { 'component': { 'Jetpack': {} } },
+        'addons.mozilla.org': {}
+        }
+    }
+
+class FakeRequest(object):
+    def __init__(self, url):
+        self.url = url
+
+    def add_header(self, name, value):
+        pass
 
-import bzapi
+class FakeUrllib2(object):
+    def __init__(self):
+        self._responses = {}
+
+    def Request(self, url):
+        return FakeRequest(url)
+
+    def set_url(self, url, response):
+        self._responses[url] = json.dumps(response)
+
+    def urlopen(self, request):
+        return StringIO.StringIO(self._responses[request.url])
+
+class FakeCollection(object):
+    def find_one(self, *args, **kwargs):
+        return None
+
+    def insert(self, obj):
+        pass
 
 class Tests(unittest.TestCase):
     def test_datetime_from_iso(self):
@@ -11,5 +47,14 @@
         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_bzapi_removes_dots_from_config(self):
+        urllib2 = FakeUrllib2()
+        urllib2.set_url('http://foo/latest/configuration?', FAKE_CONFIG)
+
+        api = bzapi.BugzillaApi('http://foo/latest', FakeCollection(),
+                                urllib2=urllib2)
+
+        self.assertTrue('addons_DOT_mozilla_DOT_org' in api.config['product'])
+
 if __name__ == '__main__':
     unittest.main()