Switching back to grabbing debug info
[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) == 1
76         id = contacts[0]
77         name = book.get_contact_name(id)
78         assert name == backend.contactsData[id]["name"]
79
80         book.update()
81         assert len(callbackData) == 0, "%r" % callbackData
82
83         book.update(force=True)
84         assert len(callbackData) == 0, "%r" % callbackData
85
86         contacts = list(book.get_contacts())
87         assert len(contacts) == 1
88         id = contacts[0]
89         name = book.get_contact_name(id)
90         assert name == backend.contactsData[id]["name"]
91
92         contactDetails = list(book.get_contact_details(id))
93         assert len(contactDetails) == 0
94
95
96 def test_one_contact_with_details():
97         callbackData = []
98         callback = generate_update_callback(callbackData)
99
100         backend = MockBackend([
101                 {
102                         "name": "One",
103                         "details": [("Type A", "123"), ("Type B", "456"), ("Type C", "789")],
104                 },
105         ])
106         book = gvoice.addressbook.Addressbook(backend)
107         book.updateSignalHandler.register_sink(callback)
108         assert len(callbackData) == 0, "%r" % callbackData
109
110         contacts = list(book.get_contacts())
111         assert len(contacts) == 1
112         id = contacts[0]
113         name = book.get_contact_name(id)
114         assert name == backend.contactsData[id]["name"]
115
116         book.update()
117         assert len(callbackData) == 0, "%r" % callbackData
118
119         book.update(force=True)
120         assert len(callbackData) == 0, "%r" % callbackData
121
122         contacts = list(book.get_contacts())
123         assert len(contacts) == 1
124         id = contacts[0]
125         name = book.get_contact_name(id)
126         assert name == backend.contactsData[id]["name"]
127
128         contactDetails = list(book.get_contact_details(id))
129         print "%r" % contactDetails
130         assert len(contactDetails) == 3
131         assert contactDetails[0][0] == "Type A"
132         assert contactDetails[0][1] == "123"
133         assert contactDetails[1][0] == "Type B"
134         assert contactDetails[1][1] == "456"
135         assert contactDetails[2][0] == "Type C"
136         assert contactDetails[2][1] == "789"
137
138
139 def test_adding_a_contact():
140         callbackData = []
141         callback = generate_update_callback(callbackData)
142
143         backend = MockBackend([
144                 {
145                         "name": "One",
146                         "details": [],
147                 },
148         ])
149         book = gvoice.addressbook.Addressbook(backend)
150         book.updateSignalHandler.register_sink(callback)
151         assert len(callbackData) == 0, "%r" % callbackData
152
153         book.update()
154         assert len(callbackData) == 0, "%r" % callbackData
155
156         book.update(force=True)
157         assert len(callbackData) == 0, "%r" % callbackData
158
159         backend.contactsData.append({
160                 "name": "Two",
161                 "details": [],
162         })
163
164         book.update()
165         assert len(callbackData) == 0, "%r" % callbackData
166
167         book.update(force=True)
168         assert len(callbackData) == 1, "%r" % callbackData
169
170         callbackBook, addedContacts, removedContacts, changedContacts = callbackData[0]
171         assert callbackBook is book
172         assert len(addedContacts) == 1
173         assert 1 in addedContacts
174         assert len(removedContacts) == 0
175         assert len(changedContacts) == 0
176
177
178 def test_removing_a_contact():
179         callbackData = []
180         callback = generate_update_callback(callbackData)
181
182         backend = MockBackend([
183                 {
184                         "name": "One",
185                         "details": [],
186                 },
187         ])
188         book = gvoice.addressbook.Addressbook(backend)
189         book.updateSignalHandler.register_sink(callback)
190         assert len(callbackData) == 0, "%r" % callbackData
191
192         book.update()
193         assert len(callbackData) == 0, "%r" % callbackData
194
195         book.update(force=True)
196         assert len(callbackData) == 0, "%r" % callbackData
197
198         del backend.contactsData[:]
199
200         book.update()
201         assert len(callbackData) == 0, "%r" % callbackData
202
203         book.update(force=True)
204         assert len(callbackData) == 1, "%r" % callbackData
205
206         callbackBook, addedContacts, removedContacts, changedContacts = callbackData[0]
207         assert callbackBook is book
208         assert len(addedContacts) == 0
209         assert len(removedContacts) == 1
210         assert 0 in removedContacts
211         assert len(changedContacts) == 0