Switching to a fremantle specific profile file
[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)
24                         for (i, contactData) in enumerate(self.contactsData)
25                 )
26
27
28 def generate_update_callback(callbackData):
29
30         @coroutines.func_sink
31         @coroutines.expand_positional
32         def callback(book, addedContacts, removedContacts, changedContacts):
33                 callbackData.append((book, addedContacts, removedContacts, changedContacts))
34
35         return callback
36
37
38 def test_no_contacts():
39         callbackData = []
40         callback = generate_update_callback(callbackData)
41
42         backend = MockBackend([])
43         book = gvoice.addressbook.Addressbook(backend)
44         book.updateSignalHandler.register_sink(callback)
45         assert len(callbackData) == 0, "%r" % callbackData
46
47         book.update()
48         assert len(callbackData) == 0, "%r" % callbackData
49
50         book.update(force=True)
51         assert len(callbackData) == 0, "%r" % callbackData
52
53         contacts = list(book.get_contacts())
54         assert len(contacts) == 0
55
56
57 def test_one_contact_no_details():
58         callbackData = []
59         callback = generate_update_callback(callbackData)
60
61         backend = MockBackend([
62                 {
63                         "name": "One",
64                         "numbers": [],
65                 },
66         ])
67         book = gvoice.addressbook.Addressbook(backend)
68         book.updateSignalHandler.register_sink(callback)
69         assert len(callbackData) == 0, "%r" % callbackData
70
71         contacts = list(book.get_contacts())
72         assert len(contacts) == 0, "%r" % contacts
73
74         book.update()
75         assert len(callbackData) == 1, "%r" % callbackData
76         del callbackData[:]
77         contacts = list(book.get_contacts())
78         assert len(contacts) == 1, "%r" % contacts
79         id = contacts[0]
80         name = book.get_contact_name(id)
81         assert name == backend.contactsData[id]["name"]
82
83         book.update()
84         assert len(callbackData) == 0, "%r" % callbackData
85
86         book.update(force=True)
87         assert len(callbackData) == 0, "%r" % callbackData
88
89         contacts = list(book.get_contacts())
90         assert len(contacts) == 1
91         id = contacts[0]
92         name = book.get_contact_name(id)
93         assert name == backend.contactsData[id]["name"]
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                         "numbers": [
104                                 {"phoneType": "Type A", "phoneNumber": "123"},
105                                 {"phoneType": "Type B", "phoneNumber": "456"},
106                                 {"phoneType": "Type C", "phoneNumber": "789"}],
107                 },
108         ])
109         book = gvoice.addressbook.Addressbook(backend)
110         book.updateSignalHandler.register_sink(callback)
111         assert len(callbackData) == 0, "%r" % callbackData
112
113         contacts = list(book.get_contacts())
114         assert len(contacts) == 0, "%r" % contacts
115
116         book.update()
117         assert len(callbackData) == 1, "%r" % callbackData
118         del callbackData[:]
119         contacts = list(book.get_contacts())
120         assert len(contacts) == 1, "%r" % contacts
121         id = contacts[0]
122         name = book.get_contact_name(id)
123         assert name == backend.contactsData[id]["name"]
124
125         book.update()
126         assert len(callbackData) == 0, "%r" % callbackData
127
128         book.update(force=True)
129         assert len(callbackData) == 0, "%r" % callbackData
130
131         contacts = list(book.get_contacts())
132         assert len(contacts) == 1
133         id = contacts[0]
134         name = book.get_contact_name(id)
135         assert name == backend.contactsData[id]["name"]
136
137
138 def test_adding_a_contact():
139         callbackData = []
140         callback = generate_update_callback(callbackData)
141
142         backend = MockBackend([
143                 {
144                         "name": "One",
145                         "numbers": [],
146                 },
147         ])
148         book = gvoice.addressbook.Addressbook(backend)
149         book.updateSignalHandler.register_sink(callback)
150         assert len(callbackData) == 0, "%r" % callbackData
151
152         book.update()
153         assert len(callbackData) == 1, "%r" % callbackData
154         del callbackData[:]
155
156         book.update()
157         assert len(callbackData) == 0, "%r" % callbackData
158
159         book.update(force=True)
160         assert len(callbackData) == 0, "%r" % callbackData
161
162         backend.contactsData.append({
163                 "name": "Two",
164                 "numbers": [],
165         })
166
167         book.update()
168         assert len(callbackData) == 0, "%r" % callbackData
169
170         book.update(force=True)
171         assert len(callbackData) == 1, "%r" % callbackData
172
173         callbackBook, addedContacts, removedContacts, changedContacts = callbackData[0]
174         assert callbackBook is book
175         assert len(addedContacts) == 1
176         assert 1 in addedContacts
177         assert len(removedContacts) == 0
178         assert len(changedContacts) == 0
179
180
181 def test_removing_a_contact():
182         callbackData = []
183         callback = generate_update_callback(callbackData)
184
185         backend = MockBackend([
186                 {
187                         "name": "One",
188                         "numbers": [],
189                 },
190         ])
191         book = gvoice.addressbook.Addressbook(backend)
192         book.updateSignalHandler.register_sink(callback)
193         assert len(callbackData) == 0, "%r" % callbackData
194
195         book.update()
196         assert len(callbackData) == 1, "%r" % callbackData
197         del callbackData[:]
198
199         book.update()
200         assert len(callbackData) == 0, "%r" % callbackData
201
202         book.update(force=True)
203         assert len(callbackData) == 0, "%r" % callbackData
204
205         del backend.contactsData[:]
206
207         book.update()
208         assert len(callbackData) == 0, "%r" % callbackData
209
210         book.update(force=True)
211         assert len(callbackData) == 1, "%r" % callbackData
212
213         callbackBook, addedContacts, removedContacts, changedContacts = callbackData[0]
214         assert callbackBook is book
215         assert len(addedContacts) == 0
216         assert len(removedContacts) == 1
217         assert 0 in removedContacts
218         assert len(changedContacts) == 0