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