Twitter.process_contact returns Friend or None (added test)
[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 from org.maemo.hermes.engine.friend import Friend
4 import unittest
5
6 class FakeContact():
7     def __init__(self, name, addr):
8         self.name = name
9         self.urls = addr
10     def get_urls(self):
11         return self.urls
12     def get_name(self):
13         return self.name
14     def get_identifiers(self):
15         return [canonical(self.name)]
16
17 class FakeTweeter():
18     def __init__(self, name, screen_name, props=None):
19         self._props = {}
20         self["name"] = name
21         self["screen_name"] = screen_name
22         if props:
23             for key in props:
24                 self[key] = props[key]
25     def __setitem__(self, key, value):
26         self._props[key] = value
27     def __getattr__(self, key):
28         try:
29             return self._props[key]
30         except:
31             return ""
32         
33     
34 class TestTwitterService(unittest.TestCase):
35     
36     def setUp(self):
37         self.testee = Service(None)
38     
39     
40     def test_that_process_contact_returns_None_for_unknown_contact(self):
41         contact = FakeContact('Person Person', [])
42         self._fake_server([])
43         
44         self.testee.pre_process_contact(contact);
45         self.testee.process_friends()
46         friend = self.testee.process_contact(contact)
47         assert friend is None
48         
49
50     def test_that_process_contact_returns_friend_object_if_contact_is_known(self):
51         twitterName = "Same Name"
52         known_tweeter = FakeTweeter(twitterName, "samename")
53         contact = FakeContact(twitterName, [])
54         self._fake_server([known_tweeter])
55         
56         self.testee.pre_process_contact(contact);
57         self.testee.process_friends()
58         friend = self.testee.process_contact(contact)
59         assert isinstance(friend, Friend)
60
61         
62     def test_main_flow(self):
63         twitterName = "Twitter Name"
64         self._fake_server([FakeTweeter(twitterName, "wendtse", {"url":"http://wendt.se"})])
65         contact = FakeContact("Fredrik Wendt", ["http://twitter.com/wendtse"])
66         
67         self._exercise_service([contact])
68         
69         assert len(self.testee.get_unmatched_friends()) == 0
70         matchers = self.testee.get_contacts_with_match()
71         assert contact in matchers
72         assert twitterName == matchers[contact].get_name()
73         assert contact == self.testee._get_friend_by_contact(contact)['contact']
74     
75     
76     def test_name_collision_avoided_by_previous_matching(self):
77         twitterName = "Same Name"
78         known_tweeter = FakeTweeter(twitterName, "samename")
79         other_tweeter = FakeTweeter(twitterName, "otherscreenname")
80         self._fake_server([other_tweeter, known_tweeter])
81         contact = FakeContact(twitterName, [])
82         
83         self._exercise_service([contact])
84         
85         assert len(self.testee.get_unmatched_friends()) == 1
86         matchers = self.testee.get_contacts_with_match()
87         assert contact in matchers
88         assert contact == self.testee._get_friend_by_contact(contact)['contact']
89
90
91     def test_name_collision_avoided_only_one_person_matched(self):
92         twitter_name = "Same Name"
93         screen_name = "samename"
94         known_tweeter = FakeTweeter(twitter_name, screen_name)
95         other_tweeter = FakeTweeter(twitter_name, "otherscreenname")
96         self._fake_server([other_tweeter, known_tweeter])
97         contact = FakeContact(twitter_name, ["http://twitter.com/" + screen_name])
98         
99         self._exercise_service([contact])
100         
101         assert len(self.testee.get_unmatched_friends()) == 1
102         matchers = self.testee.get_contacts_with_match()
103         assert contact in matchers
104         assert screen_name == matchers[contact].get_nickname()
105         assert contact == matchers[contact]['contact']
106         assert contact == self.testee._get_friend_by_contact(contact)['contact']
107         
108
109     def _exercise_service(self, contacts):
110         for contact in contacts:
111             self.testee.pre_process_contact(contact)
112         self.testee.process_friends()
113         for contact in contacts:
114             self.testee.process_contact(contact)
115
116     def _fake_server(self, data):
117         self._fake_data = data
118         self.testee._get_tweeters = self._get_tweeters
119         
120     def _get_tweeters(self):
121         return self._fake_data
122     
123 if __name__ == '__main__':
124     unittest.main()