added friend['contact'] to Twitter service, plus tests
[hermes] / package / test / unit / test_twitter.py
1 from org.maemo.hermes.engine.twitter.service import Service
2 from org.maemo.hermes.engine.names import canonical
3 import unittest
4
5 class FakeContact():
6     def __init__(self, name, addr):
7         self.name = name
8         self.urls = addr
9     def get_urls(self):
10         return self.urls
11     def get_name(self):
12         return self.name
13     def get_identifiers(self):
14         return [canonical(self.name)]
15
16 class FakeTweeter():
17     def __init__(self, name, screen_name, props=None):
18         self._props = {}
19         self["name"] = name
20         self["screen_name"] = screen_name
21         if props:
22             for key in props:
23                 self[key] = props[key]
24     def __setitem__(self, key, value):
25         self._props[key] = value
26     def __getattr__(self, key):
27         try:
28             return self._props[key]
29         except:
30             return ""
31         
32     
33 class TestTwitterService(unittest.TestCase):
34     
35     def setUp(self):
36         self.testee = Service(None)
37     
38     
39     def test_main_flow(self):
40         twitterName = "Twitter Name"
41         self._fake_server([FakeTweeter(twitterName, "wendtse", {"url":"http://wendt.se"})])
42         contact = FakeContact("Fredrik Wendt", ["http://twitter.com/wendtse"])
43         
44         self._exercise_service([contact])
45         
46         assert len(self.testee.get_unmatched_friends()) == 0
47         matchers = self.testee.get_contacts_with_match()
48         assert contact in matchers
49         assert twitterName == matchers[contact].get_name()
50         assert contact == self.testee._get_friend_by_contact(contact)['contact']
51     
52     
53     def test_name_collision_avoided_by_previous_matching(self):
54         twitterName = "Same Name"
55         known_tweeter = FakeTweeter(twitterName, "samename")
56         other_tweeter = FakeTweeter(twitterName, "otherscreenname")
57         self._fake_server([other_tweeter, known_tweeter])
58         contact = FakeContact(twitterName, [])
59         
60         self._exercise_service([contact])
61         
62         assert len(self.testee.get_unmatched_friends()) == 1
63         matchers = self.testee.get_contacts_with_match()
64         assert contact in matchers
65         assert contact == self.testee._get_friend_by_contact(contact)['contact']
66
67
68     def test_name_collision_avoided_only_one_person_matched(self):
69         twitter_name = "Same Name"
70         screen_name = "samename"
71         known_tweeter = FakeTweeter(twitter_name, screen_name)
72         other_tweeter = FakeTweeter(twitter_name, "otherscreenname")
73         self._fake_server([other_tweeter, known_tweeter])
74         contact = FakeContact(twitter_name, ["http://twitter.com/" + screen_name])
75         
76         self._exercise_service([contact])
77         
78         assert len(self.testee.get_unmatched_friends()) == 1
79         matchers = self.testee.get_contacts_with_match()
80         assert contact in matchers
81         assert screen_name == matchers[contact].get_nickname()
82         assert contact == matchers[contact]['contact']
83         assert contact == self.testee._get_friend_by_contact(contact)['contact']
84         
85
86     def _exercise_service(self, contacts):
87         for contact in contacts:
88             self.testee.pre_process_contact(contact)
89         self.testee.process_friends()
90         for contact in contacts:
91             self.testee.process_contact(contact)
92
93     def _fake_server(self, data):
94         self._fake_data = data
95         self.testee._get_tweeters = self._get_tweeters
96         
97     def _get_tweeters(self):
98         return self._fake_data
99     
100 if __name__ == '__main__':
101     unittest.main()