Fixing some of the unit tests
[theonering] / tests / test_addressbook.py
1 from __future__ import with_statement
2
3 import logging
4
5 import sys
6 sys.path.append("../src")
7
8 import util.coroutines as coroutines
9
10 import gvoice
11
12
13 logging.basicConfig(level=logging.DEBUG)
14
15
16 class MockBackend(object):
17
18         def __init__(self, contactsData):
19                 self.contactsData = contactsData
20
21         def get_contacts(self):
22                 return (
23                         (i, contactData["name"])
24                         for (i, contactData) in enumerate(self.contactsData)
25                 )
26
27         def get_contact_details(self, contactId):
28                 return self.contactsData[contactId]["details"]
29
30
31 def generate_update_callback(callbackData):
32
33         @coroutines.func_sink
34         @coroutines.expand_positional
35         def callback(book, addedContacts, removedContacts, changedContacts):
36                 callbackData.append((book, addedContacts, removedContacts, changedContacts))
37
38         return callback
39
40
41 def test_no_contacts():
42         callbackData = []
43         callback = generate_update_callback(callbackData)
44
45         backend = MockBackend([])
46         book = gvoice.addressbook.Addressbook(backend)
47         book.updateSignalHandler.register_sink(callback)
48         assert len(callbackData) == 0, "%r" % callbackData
49
50         book.update()
51         assert len(callbackData) == 0, "%r" % callbackData
52
53         book.update(force=True)
54         assert len(callbackData) == 0, "%r" % callbackData
55
56         contacts = list(book.get_contacts())
57         assert len(contacts) == 0
58
59
60 def test_one_contact_no_details():
61         callbackData = []
62         callback = generate_update_callback(callbackData)
63
64         backend = MockBackend([
65                 {
66                         "name": "One",
67                         "details": [],
68                 },
69         ])
70         book = gvoice.addressbook.Addressbook(backend)
71         book.updateSignalHandler.register_sink(callback)
72         assert len(callbackData) == 0, "%r" % callbackData
73
74         contacts = list(book.get_contacts())
75         assert len(contacts) == 0, "%r" % contacts
76
77         book.update()
78         assert len(callbackData) == 1, "%r" % callbackData
79         del callbackData[:]
80         contacts = list(book.get_contacts())
81         assert len(contacts) == 1, "%r" % contacts
82         id = contacts[0]
83         name = book.get_contact_name(id)
84         assert name == backend.contactsData[id]["name"]
85
86         book.update()
87         assert len(callbackData) == 0, "%r" % callbackData
88
89         book.update(force=True)
90         assert len(callbackData) == 0, "%r" % callbackData
91
92         contacts = list(book.get_contacts())
93         assert len(contacts) == 1
94         id = contacts[0]
95         name = book.get_contact_name(id)
96         assert name == backend.contactsData[id]["name"]
97
98         contactDetails = list(book.get_contact_details(id))
99         assert len(contactDetails) == 0
100
101
102 def test_one_contact_with_details():
103         callbackData = []
104         callback = generate_update_callback(callbackData)
105
106         backend = MockBackend([
107                 {
108                         "name": "One",
109                         "details": [("Type A", "123"), ("Type B", "456"), ("Type C", "789")],
110                 },
111         ])
112         book = gvoice.addressbook.Addressbook(backend)
113         book.updateSignalHandler.register_sink(callback)
114         assert len(callbackData) == 0, "%r" % callbackData
115
116         contacts = list(book.get_contacts())
117         assert len(contacts) == 0, "%r" % contacts
118
119         book.update()
120         assert len(callbackData) == 1, "%r" % callbackData
121         del callbackData[:]
122         contacts = list(book.get_contacts())
123         assert len(contacts) == 1, "%r" % contacts
124         id = contacts[0]
125         name = book.get_contact_name(id)
126         assert name == backend.contactsData[id]["name"]
127
128         book.update()
129         assert len(callbackData) == 0, "%r" % callbackData
130
131         book.update(force=True)
132         assert len(callbackData) == 0, "%r" % callbackData
133
134         contacts = list(book.get_contacts())
135         assert len(contacts) == 1
136         id = contacts[0]
137         name = book.get_contact_name(id)
138         assert name == backend.contactsData[id]["name"]
139
140         contactDetails = list(book.get_contact_details(id))
141         print "%r" % contactDetails
142         assert len(contactDetails) == 3
143         assert contactDetails[0][0] == "Type A"
144         assert contactDetails[0][1] == "123"
145         assert contactDetails[1][0] == "Type B"
146         assert contactDetails[1][1] == "456"
147         assert contactDetails[2][0] == "Type C"
148         assert contactDetails[2][1] == "789"
149
150
151 def test_adding_a_contact():
152         callbackData = []
153         callback = generate_update_callback(callbackData)
154
155         backend = MockBackend([
156                 {
157                         "name": "One",
158                         "details": [],
159                 },
160         ])
161         book = gvoice.addressbook.Addressbook(backend)
162         book.updateSignalHandler.register_sink(callback)
163         assert len(callbackData) == 0, "%r" % callbackData
164
165         book.update()
166         assert len(callbackData) == 1, "%r" % callbackData
167         del callbackData[:]
168
169         book.update()
170         assert len(callbackData) == 0, "%r" % callbackData
171
172         book.update(force=True)
173         assert len(callbackData) == 0, "%r" % callbackData
174
175         backend.contactsData.append({
176                 "name": "Two",
177                 "details": [],
178         })
179
180         book.update()
181         assert len(callbackData) == 0, "%r" % callbackData
182
183         book.update(force=True)
184         assert len(callbackData) == 1, "%r" % callbackData
185
186         callbackBook, addedContacts, removedContacts, changedContacts = callbackData[0]
187         assert callbackBook is book
188         assert len(addedContacts) == 1
189         assert 1 in addedContacts
190         assert len(removedContacts) == 0
191         assert len(changedContacts) == 0
192
193
194 def test_removing_a_contact():
195         callbackData = []
196         callback = generate_update_callback(callbackData)
197
198         backend = MockBackend([
199                 {
200                         "name": "One",
201                         "details": [],
202                 },
203         ])
204         book = gvoice.addressbook.Addressbook(backend)
205         book.updateSignalHandler.register_sink(callback)
206         assert len(callbackData) == 0, "%r" % callbackData
207
208         book.update()
209         assert len(callbackData) == 1, "%r" % callbackData
210         del callbackData[:]
211
212         book.update()
213         assert len(callbackData) == 0, "%r" % callbackData
214
215         book.update(force=True)
216         assert len(callbackData) == 0, "%r" % callbackData
217
218         del backend.contactsData[:]
219
220         book.update()
221         assert len(callbackData) == 0, "%r" % callbackData
222
223         book.update(force=True)
224         assert len(callbackData) == 1, "%r" % callbackData
225
226         callbackBook, addedContacts, removedContacts, changedContacts = callbackData[0]
227         assert callbackBook is book
228         assert len(addedContacts) == 0
229         assert len(removedContacts) == 1
230         assert 0 in removedContacts
231         assert len(changedContacts) == 0