changeset 26:057f6f0eac22

added more tests
author Atul Varma <varmaa@toolness.com>
date Thu, 24 Dec 2009 06:45:30 -0800
parents 73756a9e87a6
children f717ecd3ede1
files test.py
diffstat 1 files changed, 41 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/test.py	Wed Dec 23 22:51:41 2009 -0800
+++ b/test.py	Thu Dec 24 06:45:30 2009 -0800
@@ -1,7 +1,7 @@
 import unittest
 import StringIO
 from copy import deepcopy
-from datetime import datetime
+from datetime import datetime, timedelta
 
 import simplejson as json
 import pymongo
@@ -77,14 +77,30 @@
         self._reset_collections()
 
 class CachedSearchTests(_MongoTestCase):
+    class ImpartialObserver(object):
+        def __init__(self):
+            self.history = []
+
+        def notify(self, info):
+            self.history.append(info)
+
     class FakeApi(object):
         def __init__(self):
             self._bugs = {}
+            self._time = bzapi.datetime_from_iso('2009-01-01T00:00:00Z')
+
+        def fake_time_travel(self, **kwargs):
+            self._time += timedelta(**kwargs)
+
+        def update_fake_bug(self, **info):
+            bug = self._bugs[info['id']]
+            bug.update(info)
+            bug['last_change_time'] = bzapi.datetime_to_iso(self._time)
 
         def add_fake_bug(self, **info):
             for name in ['last_change_time', 'creation_time']:
                 if name not in info:
-                    info[name] = '2009-06-11T22:31:24Z'
+                    info[name] = bzapi.datetime_to_iso(self._time)
             self._bugs[info['id']] = info
 
         def get(self, url, **kwargs):
@@ -101,7 +117,7 @@
                     if 'comments' in info:
                         del info['comments']
             return {'data': {'bugs': bugs},
-                    'date': datetime.utcnow()}
+                    'date': self._time}
 
     _collections = ['bugs']
 
@@ -109,34 +125,41 @@
         _MongoTestCase.setUp(self)
         self.api = self.FakeApi()
         self.search = bzapi.CachedSearch(self.api, testdb.bugs)
+        self.observer = self.ImpartialObserver()
+        self.search.add_observer(self.observer)
 
-    def test_update_with_no_bugs(self):
+    def test_update_with_no_bugs_does_not_crash(self):
         self.search.update()
         self.assertEqual(testdb.bugs.find().count(), 0)
 
-    def test_update_with_bug(self):
+    def test_update_with_one_bug_adds_it_to_collection(self):
         self.api.add_fake_bug(id='1034', comments='blah')
         self.search.update()
         self.assertEqual(testdb.bugs.find({'comments': 'blah'}).count(), 1)
 
-    def test_observers_are_notified(self):
-        notifications = []
+    def test_one_bug_update_notifies_observers(self):
+        self.api.add_fake_bug(id='1034')
+        self.search.update()
+        self.api.fake_time_travel(days=1)
+        self.api.update_fake_bug(id='1034', comments='yo')
+        self.search.update()
+        self.assertEqual(len(self.observer.history), 2)
 
-        class Observer(object):
-            def notify(self, info):
-                notifications.append(info)
-
+    def test_one_bug_addition_notifies_observers(self):
         self.api.add_fake_bug(id='1034')
-        self.search.add_observer(Observer())
-
+        self.assertEqual(len(self.observer.history), 0)
         self.search.update()
-        self.assertEqual(len(notifications), 1)
-        self.assertEqual(notifications[0]['bug'], '1034')
+        self.assertEqual(len(self.observer.history), 1)
+        self.assertEqual(self.observer.history[0]['bug'], '1034')
 
-        # Ensure updating w/o state change doesn't trigger
-        # observers.
+    def test_no_bug_changes_do_not_notify_observers(self):
+        self.api.add_fake_bug(id='1034')
         self.search.update()
-        self.assertEqual(len(notifications), 1)
+        self.assertEqual(len(self.observer.history), 1)
+
+        self.api.fake_time_travel(days=1)
+        self.search.update()
+        self.assertEqual(len(self.observer.history), 1)
 
 class ApiTests(_MongoTestCase):
     class FakeOpenUrl(object):