63b57f7db036fa1eab185929511aa92f48bc4cc5
[hermes] / package / test / unit / test_linkedin.py
1 from org.maemo.hermes.engine.linkedin.service import Service
2 from org.maemo.hermes.engine.names import canonical
3 from org.maemo.hermes.engine.friend import Friend
4 import unittest
5
6
7 class FakeContact():
8     id_counter = 0
9     def __init__(self, name, addr, id=None):
10         self.name = name;
11         self.urls = addr
12         self.id = id or FakeContact.id_counter
13         FakeContact.id_counter = FakeContact.id_counter + 1;
14     def get_urls(self):
15         return self.urls
16     def get_name(self):
17         return self.name
18     def get_identifiers(self):
19         return [canonical(self.name)]
20     
21 class FakeLinkedInApi():
22     def get_friends(self):
23         return self._friends
24     def set_friends(self, data):
25         self._friends = data
26         
27 class UrlFriend(Friend):
28     def __init__(self, name, url):
29         Friend.__init__(self, name)
30         self.add_url(url)
31     
32 class TestLinkedInService(unittest.TestCase):
33     
34     def setUp(self):
35         self.linkedInApi = FakeLinkedInApi()
36         self.testee = Service(self.linkedInApi)
37
38
39     def test_that_process_contact_returns_None_for_unknown_contact(self):
40         contact = FakeContact('Person Person', [])
41         self._fake_server_response([])
42         
43         self.testee.pre_process_contact(contact);
44         self.testee.process_friends()
45         friend = self.testee.process_contact(contact)
46         assert friend is None
47         
48
49     def test_that_process_contact_returns_friend_object_if_contact_is_known(self):
50         same_name = "A Name"
51         contact = FakeContact(same_name, [])
52         fake_friend = Friend(same_name)
53         self._fake_server_response([fake_friend])
54         
55         self.testee.pre_process_contact(contact);
56         self.testee.process_friends()
57         friend = self.testee.process_contact(contact)
58         assert isinstance(friend, Friend)
59
60         
61     def test_main_flow_one_match_by_url_one_by_name(self):
62         known_url = "http://linkedin/id=1"
63         contact_by_url = FakeContact("By Url", [known_url], 1)
64         friend_by_url = UrlFriend("Unimportant", known_url)
65         
66         known_name = "By Name"
67         contact_by_name = FakeContact(known_name, [], 2)
68         friend_by_name = Friend(known_name)
69         
70         self._fake_server_response([friend_by_name, friend_by_url])
71         
72         self._run_service([contact_by_name, contact_by_url])
73         
74         assert len(self.testee.get_unmatched_friends()) == 0
75         matchers = self.testee.get_contacts_with_match()
76         assert contact_by_name in matchers
77         assert contact_by_url in matchers
78         assert known_url in matchers[contact_by_url].get_urls()
79         assert contact_by_url == matchers[contact_by_url].get_contact()
80         assert contact_by_name == matchers[contact_by_name].get_contact()
81
82         
83     def _run_service(self, contacts):
84         for contact in contacts:
85             self.testee.pre_process_contact(contact)
86         self.testee.process_friends()
87         for contact in contacts:
88             self.testee.process_contact(contact)
89         
90     def _fake_server_response(self, data):
91         self.linkedInApi.set_friends(data)
92     
93     
94 if __name__ == '__main__':
95     unittest.main()