Merge branch 'master' of git@83.233.175.44:hermes
authorAndrew Flegg <andrew@bleb.org>
Wed, 9 Jun 2010 21:38:54 +0000 (22:38 +0100)
committerAndrew Flegg <andrew@bleb.org>
Wed, 9 Jun 2010 21:38:54 +0000 (22:38 +0100)
package/src/org/maemo/hermes/engine/friend.py
package/src/org/maemo/hermes/engine/hermes.py
package/test/automatic_tests.py
package/test/unit/test_hermes.py [new file with mode: 0644]

index b6a97b6..5ed9d21 100644 (file)
@@ -5,12 +5,15 @@ class Friend():
        Released under the Artistic Licence."""
 
     
-    def __init__(self, name=None, source=None):
+    def __init__(self, name=None, source=None, props=None):
         """ source is source service, such as LinkedIn """
         self._attributes = {};
         if name: self._set('fn', name)
         self._multi_attributes = {}
-        self._source = source 
+        self._source = source
+        if props:
+            for key in props:
+                self._set(key, props[key])
         
     def __getitem__(self, key):
         return self._safe_get(key)
index 73b9fc1..804f1be 100644 (file)
@@ -44,8 +44,8 @@ class Hermes:
         
         contacts = []
         self.address_book = self._get_address_book()
-        for contact in self.address_book.get_all_contacts():
-            contacts.append(Contact(self.address_book, contact))
+        for econtact in self.address_book.get_all_contacts():
+            contacts.append(self._create_contact_wrapper(econtact))
 
         # work out progress bar info
         total_contacts = len(contacts) * len(self._services)
@@ -131,11 +131,8 @@ class Hermes:
 
     # -----------------------------------------------------------------------
     def create_contact_from_friend(self, friend):
-        econtact = evolution.ebook.EContact()
-        econtact.props.full_name = friend['name']
-        econtact.props.given_name = friend['first_name']
-        econtact.props.family_name = friend['last_name']
-        contact = Contact(self.address_book, econtact)
+        econtact = self._create_empty_contact(friend)
+        contact = self._create_contact_wrapper(econtact)
                 
         self.address_book.add_contact(contact.get_econtact())
         self.update_contact(contact, friend)
@@ -146,3 +143,14 @@ class Hermes:
     # -----------------------------------------------------------------------
     def _get_address_book(self):
         return evolution.ebook.open_addressbook('default')
+
+    # -----------------------------------------------------------------------
+    def _create_empty_contact(self, friend):
+        econtact = evolution.ebook.EContact()
+        econtact.props.full_name = friend['name']
+        econtact.props.given_name = friend['first_name']
+        econtact.props.family_name = friend['last_name']
+    
+    # -----------------------------------------------------------------------
+    def _create_contact_wrapper(self, econtact):
+        return Contact(self.address_book, econtact)
\ No newline at end of file
index 54ad88e..f952b2a 100644 (file)
@@ -6,12 +6,12 @@ from unit.test_facebook import TestFacebookService
 from unit.test_gravatar import TestGravatarService
 from unit.test_linkedin import TestLinkedInService
 from unit.test_twitter import TestTwitterService
+from unit.test_hermes import TestHermes
 
 from integration.test_gravatar import IntegrationTestGravatarService
 from integration.test_linkedinapi import IntegrationTestLinkedInApi
 from integration.test_twitter import IntegrationTestTwitterService
 
-import integration
 
 class AutomaticTestsSuite(unittest.TestSuite):
 
@@ -21,10 +21,12 @@ class AutomaticTestsSuite(unittest.TestSuite):
         suite.addTest(unittest.makeSuite(TestGravatarService))
         suite.addTest(unittest.makeSuite(TestLinkedInService))
         suite.addTest(unittest.makeSuite(TestTwitterService))
+        suite.addTest(unittest.makeSuite(TestHermes))
         
-        suite.addTest(unittest.makeSuite(IntegrationTestGravatarService))
-        suite.addTest(unittest.makeSuite(IntegrationTestLinkedInApi))
-        suite.addTest(unittest.makeSuite(IntegrationTestTwitterService))
+        if False: # a way to turn integration tests off
+            suite.addTest(unittest.makeSuite(IntegrationTestGravatarService))
+            suite.addTest(unittest.makeSuite(IntegrationTestLinkedInApi))
+            suite.addTest(unittest.makeSuite(IntegrationTestTwitterService))
         
         
 
diff --git a/package/test/unit/test_hermes.py b/package/test/unit/test_hermes.py
new file mode 100644 (file)
index 0000000..2ccaaf8
--- /dev/null
@@ -0,0 +1,146 @@
+from org.maemo.hermes.engine.hermes import Hermes
+from org.maemo.hermes.engine.friend import Friend
+from org.maemo.hermes.engine.names import canonical
+
+import unittest
+
+class FakeService():
+    def __init__(self):
+        self.friends_to_create = []
+        self.unmatched_friends = []
+        self.contacts_pre_processed = []
+        self.contacts_processed = []
+        self.process_friends_called = False
+        self._response_for_contact = {}
+        
+    def get_id(self): 
+        return "fakebook"
+    def pre_process_contact(self, contact): 
+        self.contacts_pre_processed.append(contact)
+    def process_friends(self): 
+        self.process_friends_called = True
+    def process_contact(self, contact): 
+        self.contacts_processed.append(contact)
+        econtact = contact.get_econtact()
+        if self._response_for_contact.has_key(econtact):
+            return self._response_for_contact[econtact]
+        return None
+    def get_friends_to_create_contacts_for(self): 
+        return self.friends_to_create
+    def get_unmatched_friends(self): 
+        return self.unmatched_friends
+    def finalise(self, updated, overwrite=False): 
+        pass
+    def _will_return_friend_for_contact(self, friend, contact):
+        self._response_for_contact[contact] = friend
+    
+class FakeAddressBook():
+    def __init__(self):
+        self.contacts = []
+        self.contacts_committed = []
+    def get_all_contacts(self): 
+        return self.contacts
+    def add_contact(self, contact):
+        self.contacts.append(contact)
+    def commit_contact(self, contact): 
+        self.contacts_committed.append(contact)
+        
+class FakeContact(Friend):
+    def __init__(self, book=None, econtact=None, props=None):
+        Friend.__init__(self, props)
+        self.econtact = econtact
+    def get_property(self, key):
+        return self._safe_get(key)
+    def get_identifiers(self):
+        return [self.get_name(), self.get_nickname()]
+    def get_econtact(self):
+        return self.econtact
+    def add_mapping(self, id):
+        self._add('mapping', id)
+    def get_mappings(self):
+        return self._safe_get('mapping')
+    def get_photo(self):
+        return None
+    def get_emails(self):
+        return []
+
+class FakeEContact():
+    def __init__(self, name):
+        self.name = name
+    def get_name(self):
+        return self.name
+    def get_property(self, key):
+        return None
+
+class TestHermes(unittest.TestCase):
+
+    def setUp(self):
+        self.service = FakeService()
+        self.abook = FakeAddressBook()
+        self.hermes = Hermes([self.service], None)
+        self.hermes._get_address_book = self._get_address_book
+        self.hermes._create_empty_contact = self._create_empty_contact
+        self.hermes._create_contact_wrapper = self._create_contact_wrapper
+    
+    
+    def test_empty_run(self):
+        self.hermes.run()
+
+        assert self.service.process_friends_called
+        assert len(self.abook.contacts) == 0
+        assert len(self.service.contacts_processed) == 0
+        assert len(self.service.contacts_pre_processed) == 0
+        assert len(self.hermes.unmatched) == 0
+        assert len(self.hermes.matched) == 0
+        assert len(self.hermes.updated) == 0
+
+        
+    def test_empty_abook_and_service_returns_one_friend_to_create(self):
+        self.service.friends_to_create = [Friend("Fredrik")]
+        
+        self.hermes.run()
+        
+        assert len(self.abook.contacts) == 1
+        assert len(self.service.contacts_processed) == 0
+        assert len(self.service.contacts_pre_processed) == 0
+        
+    
+    def test_one_contact_and_no_match(self):
+        self.abook.contacts.append(FakeEContact("Fredrik"))
+        
+        self.hermes.run()
+        
+        assert len(self.abook.contacts) == 1
+        assert len(self.service.contacts_processed) == 1
+        assert len(self.service.contacts_pre_processed) == 1
+        assert len(self.hermes.unmatched) == 1
+        assert len(self.hermes.matched) == 0
+        assert len(self.hermes.updated) == 0
+        
+        
+    def test_one_contact_and_one_match(self):
+        contact = FakeEContact("Fredrik")
+        friend = Friend("Fredrik", props={'birthday_date':'1980-10-15'})
+        self.abook.contacts.append(contact)
+        self.service._will_return_friend_for_contact(friend, contact)
+        
+        self.hermes.run()
+        
+        assert len(self.abook.contacts) == 1
+        assert len(self.service.contacts_processed) == 1
+        assert len(self.service.contacts_pre_processed) == 1
+        assert len(self.hermes.unmatched) == 0
+        assert len(self.hermes.matched) == 1
+        assert len(self.hermes.updated) == 1
+        
+        
+    # faked to avoid evolution/ebook dependency
+    def _get_address_book(self):
+        return self.abook
+    def _create_empty_contact(self, friend):
+        return FakeEContact(friend.get_name())
+    def _create_contact_wrapper(self, econtact):
+        return FakeContact(econtact=econtact)
+
+if __name__ == '__main__':
+    unittest.main()