Merge lp:~eday/burrow/backend-unittests into lp:burrow

Proposed by Eric Day
Status: Merged
Approved by: Eric Day
Approved revision: 18
Merged at revision: 19
Proposed branch: lp:~eday/burrow/backend-unittests
Merge into: lp:burrow
Diff against target: 602 lines (+257/-96)
5 files modified
burrow/backend/__init__.py (+13/-9)
burrow/backend/memory.py (+117/-83)
burrow/backend/sqlite.py (+4/-2)
burrow/frontend/wsgi.py (+2/-2)
test/backend/test_memory.py (+121/-0)
To merge this branch: bzr merge lp:~eday/burrow/backend-unittests
Reviewer Review Type Date Requested Status
Burrow Core Team Pending
Review via email: mp+64260@code.launchpad.net

Description of the change

Added more backend unit tests, reworked memory backend to use mutable objects instead of tuples, added account filter options.

To post a comment you must log in.
Revision history for this message
OpenStack Infra (hudson-openstack) wrote :
Download full text (6.9 KiB)

The attempt to merge lp:~eday/burrow/backend-unittests into lp:burrow failed. Below is the output from the failed tests.

running test
running egg_info
creating burrow.egg-info
writing requirements to burrow.egg-info/requires.txt
writing burrow.egg-info/PKG-INFO
writing top-level names to burrow.egg-info/top_level.txt
writing dependency_links to burrow.egg-info/dependency_links.txt
writing manifest file 'burrow.egg-info/SOURCES.txt'
reading manifest file 'burrow.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no files found matching 'ChangeLog'
writing manifest file 'burrow.egg-info/SOURCES.txt'
running build_ext

test_account (test.backend.test_memory.TestMemory) ... ok
test_account_delete_detail_all (test.backend.test_memory.TestMemory) ... ok
test_account_delete_detail_bad (test.backend.test_memory.TestMemory) ... ERROR
ERROR
test_account_delete_detail_id (test.backend.test_memory.TestMemory) ... ok
test_account_delete_detail_none (test.backend.test_memory.TestMemory) ... ok
test_account_get_detail_all (test.backend.test_memory.TestMemory) ... ok
test_account_get_detail_bad (test.backend.test_memory.TestMemory) ... ERROR
ERROR
test_account_get_detail_id (test.backend.test_memory.TestMemory) ... ok
test_account_get_detail_none (test.backend.test_memory.TestMemory) ... ok
test_account_get_marker (test.backend.test_memory.TestMemory) ... ok
test_account (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_message (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_message_delete_limit (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_message_delete_limit_marker (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_message_delete_marker (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_message_get_limit (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_message_get_limit_marker (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_message_get_marker (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_message_hide (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_message_post (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_message_post_limit (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_message_post_limit_marker (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_message_post_marker (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_message_post_wait (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_message_post_wait_queue (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_message_put (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_message_put_wait (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_message_put_wait_cleanup (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_message_put_wait_overwrite (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_message_ttl (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_queue (test.frontend.test_wsgi.TestWSGIMemory) ... ok
test_account (test.frontend.test_wsgi.TestWSGISQLite) ... ok
test_message (test.frontend.test_wsgi.TestWSGISQLite) ... ok
test_message_delete_limit (test.frontend.test_wsgi.TestWSGISQLite) ... ok
test_message_delete_limit_marker (test.frontend.test_wsgi.TestWSGISQLite) ... ok
test_message_delete_marker (test.frontend.t...

Read more...

lp:~eday/burrow/backend-unittests updated
18. By Eric Day

Changed to older style assertRaises for compatibility.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'burrow/backend/__init__.py'
2--- burrow/backend/__init__.py 2011-04-22 02:18:26 +0000
3+++ burrow/backend/__init__.py 2011-06-13 16:44:08 +0000
4@@ -32,13 +32,13 @@
5 thread_pool.spawn_n(self._clean)
6
7 def delete_accounts(self, filters={}):
8- pass
9+ return []
10
11 def get_accounts(self, filters={}):
12 return []
13
14 def delete_queues(self, account, filters={}):
15- pass
16+ return []
17
18 def get_queues(self, account, filters={}):
19 return []
20@@ -55,13 +55,14 @@
21 def create_message(self, account, queue, message, body, attributes={}):
22 return True
23
24- def delete_message(self, account, queue, message):
25- return None
26-
27- def get_message(self, account, queue, message):
28- return None
29-
30- def update_message(self, account, queue, message, attributes={}):
31+ def delete_message(self, account, queue, message, filters={}):
32+ return None
33+
34+ def get_message(self, account, queue, message, filters={}):
35+ return None
36+
37+ def update_message(self, account, queue, message, attributes={},
38+ filters={}):
39 return None
40
41 def notify(self, account, queue):
42@@ -95,3 +96,6 @@
43 while True:
44 self.clean()
45 eventlet.sleep(1)
46+
47+class BadDetail(Exception):
48+ pass
49
50=== modified file 'burrow/backend/memory.py'
51--- burrow/backend/memory.py 2011-04-24 22:47:02 +0000
52+++ burrow/backend/memory.py 2011-06-13 16:44:08 +0000
53@@ -32,18 +32,24 @@
54 self.accounts = Accounts()
55
56 def delete_accounts(self, filters={}):
57- self.accounts.delete(filters)
58+ return self.accounts.delete(filters)
59
60 def get_accounts(self, filters={}):
61+ detail = filters.get('detail', 'id')
62+ if detail is 'none':
63+ detail = None
64+ elif detail is not None and detail not in ['id', 'all']:
65+ raise burrow.backend.BadDetail(detail)
66 for account in self.accounts.iter(filters):
67- yield account[0]
68+ if detail is not None:
69+ yield account.name
70
71 def delete_queues(self, account, filters={}):
72- self.accounts.delete_queues(account, filters)
73+ return self.accounts.delete_queues(account, filters)
74
75 def get_queues(self, account, filters={}):
76- for queue in self.accounts.iter_queues(account, filters):
77- yield queue[0]
78+ for queue in self.accounts.get_queues(account, filters):
79+ yield queue.name
80
81 def delete_messages(self, account, queue, filters={}):
82 return self._scan_queue(account, queue, filters, delete=True)
83@@ -62,30 +68,30 @@
84 hide = attributes.get('hide', 0)
85 if hide > 0:
86 hide += int(time.time())
87- for index in xrange(0, len(queue[3])):
88- if queue[3][index]['id'] == message:
89- message = queue[3][index]
90+ for index in xrange(0, len(queue.messages)):
91+ if queue.messages[index]['id'] == message:
92+ message = queue.messages[index]
93 message['ttl'] = ttl
94 message['hide'] = hide
95 message['body'] = body
96 if hide == 0:
97- self.notify(account[0], queue[0])
98+ self.notify(account.name, queue.name)
99 return False
100 message = dict(id=message, ttl=ttl, hide=hide, body=body)
101- queue[3].append(message)
102- self.notify(account[0], queue[0])
103+ queue.messages.append(message)
104+ self.notify(account.name, queue.name)
105 return True
106
107- def delete_message(self, account, queue, message):
108+ def delete_message(self, account, queue, message, filters={}):
109 account, queue = self.accounts.get_queue(account, queue)
110 if queue is None:
111 return None
112- for index in xrange(0, len(queue[3])):
113- if queue[3][index]['id'] == message:
114- message = queue[3][index]
115- del queue[3][index]
116- if len(queue[3]) == 0:
117- self.accounts.delete_queue(account[0], queue[0])
118+ for index in xrange(0, len(queue.messages)):
119+ if queue.messages[index]['id'] == message:
120+ message = queue.messages[index]
121+ del queue.messages[index]
122+ if len(queue.messages) == 0:
123+ self.accounts.delete_queue(account.name, queue.name)
124 if message['ttl'] > 0:
125 message['ttl'] -= int(time.time())
126 if message['hide'] > 0:
127@@ -93,23 +99,24 @@
128 return message
129 return None
130
131- def get_message(self, account, queue, message):
132+ def get_message(self, account, queue, message, filters={}):
133 account, queue = self.accounts.get_queue(account, queue)
134 if queue is None:
135 return None
136- for index in xrange(0, len(queue[3])):
137- if queue[3][index]['id'] == message:
138- ttl = queue[3][index]['ttl']
139+ for index in xrange(0, len(queue.messages)):
140+ if queue.messages[index]['id'] == message:
141+ ttl = queue.messages[index]['ttl']
142 if ttl > 0:
143 ttl -= int(time.time())
144- hide = queue[3][index]['hide']
145+ hide = queue.messages[index]['hide']
146 if hide > 0:
147 hide -= int(time.time())
148 return dict(id=message, ttl=ttl, hide=hide,
149- body=queue[3][index]['body'])
150+ body=queue.messages[index]['body'])
151 return None
152
153- def update_message(self, account, queue, message, attributes={}):
154+ def update_message(self, account, queue, message, attributes={},
155+ filters={}):
156 account, queue = self.accounts.get_queue(account, queue)
157 if queue is None:
158 return None
159@@ -119,29 +126,29 @@
160 hide = attributes.get('hide', None)
161 if hide is not None and hide > 0:
162 hide += int(time.time())
163- for index in xrange(0, len(queue[3])):
164- if queue[3][index]['id'] == message:
165- message = queue[3][index]
166+ for index in xrange(0, len(queue.messages)):
167+ if queue.messages[index]['id'] == message:
168+ message = queue.messages[index]
169 if ttl is not None:
170 message['ttl'] = ttl
171 if hide is not None:
172 message['hide'] = hide
173 if hide == 0:
174- self.notify(account[0], queue[0])
175+ self.notify(account.name, queue.name)
176 return message
177 return None
178
179 def clean(self):
180 now = int(time.time())
181 for account in self.accounts.iter():
182- for queue in account[3].iter():
183+ for queue in account.queues.iter():
184 index = 0
185 notify = False
186- total = len(queue[3])
187+ total = len(queue.messages)
188 while index < total:
189- message = queue[3][index]
190+ message = queue.messages[index]
191 if 0 < message['ttl'] <= now:
192- del queue[3][index]
193+ del queue.messages[index]
194 total -= 1
195 else:
196 if 0 < message['hide'] <= now:
197@@ -149,9 +156,9 @@
198 notify = True
199 index += 1
200 if notify:
201- self.notify(account[0], queue[0])
202- if len(queue[3]) == 0:
203- self.accounts.delete_queue(account[0], queue[0])
204+ self.notify(account.name, queue.name)
205+ if len(queue.messages) == 0:
206+ self.accounts.delete_queue(account.name, queue.name)
207
208 def _scan_queue(self, account, queue, filters, attributes={},
209 delete=False):
210@@ -162,8 +169,8 @@
211 notify = False
212 if 'marker' in filters and filters['marker'] is not None:
213 found = False
214- for index in xrange(0, len(queue[3])):
215- message = queue[3][index]
216+ for index in xrange(0, len(queue.messages)):
217+ message = queue.messages[index]
218 if message['id'] == filters['marker']:
219 index += 1
220 found = True
221@@ -171,7 +178,7 @@
222 if not found:
223 index = 0
224 messages = []
225- total = len(queue[3])
226+ total = len(queue.messages)
227 limit = filters.get('limit', None)
228 match_hidden = filters.get('match_hidden', False)
229 ttl = attributes.get('ttl', None)
230@@ -181,7 +188,7 @@
231 if hide is not None and hide > 0:
232 hide += int(time.time())
233 while index < total:
234- message = queue[3][index]
235+ message = queue.messages[index]
236 if not match_hidden and message['hide'] != 0:
237 index += 1
238 continue
239@@ -192,7 +199,7 @@
240 if hide == 0:
241 notify = True
242 if delete:
243- del queue[3][index]
244+ del queue.messages[index]
245 total -= 1
246 else:
247 index += 1
248@@ -209,15 +216,22 @@
249 if limit == 0:
250 break
251 if notify:
252- self.notify(account[0], queue[0])
253- if len(queue[3]) == 0:
254- self.accounts.delete_queue(account[0], queue[0])
255-
256-
257-class IndexedTupleList(object):
258- '''Class for managing an indexed tuple list. The tuple must be at
259- least three elements and must reserve the first three for (name,
260- next, previous).'''
261+ self.notify(account.name, queue.name)
262+ if len(queue.messages) == 0:
263+ self.accounts.delete_queue(account.name, queue.name)
264+
265+
266+class Item(object):
267+ '''Object to represent elements in a indexed linked list.'''
268+
269+ def __init__(self, name=None):
270+ self.name = name
271+ self.next = None
272+ self.prev = None
273+
274+
275+class IndexedList(object):
276+ '''Class for managing an indexed linked list.'''
277
278 def __init__(self):
279 self.first = None
280@@ -225,11 +239,13 @@
281 self.index = {}
282
283 def add(self, item):
284- item = (item[0], None, self.last) + item[3:]
285 if self.first is None:
286 self.first = item
287+ if self.last is not None:
288+ item.prev = self.last
289+ self.last.next = item
290 self.last = item
291- self.index[item[0]] = item
292+ self.index[item.name] = item
293 return item
294
295 def count(self):
296@@ -241,25 +257,28 @@
297 self.last = None
298 self.index.clear()
299 return
300+ detail = filters.get('detail', None)
301+ if detail is 'none':
302+ detail = None
303+ elif detail is not None and detail not in ['id', 'all']:
304+ raise burrow.backend.BadDetail(detail)
305 for item in self.iter(filters):
306- self.delete_item(item[0])
307+ self.delete_item(item.name)
308+ if detail is not None:
309+ yield item.name
310
311 def delete_item(self, name):
312 if name not in self.index:
313 return
314- item = self.index[name][1]
315- if item is not None:
316- prev_item = self.index[name][2]
317- self.index[item[0]] = (item[0], item[1], prev_item) + item[3:]
318- item = self.index[name][2]
319- if item is not None:
320- next_item = self.index[name][1]
321- self.index[item[0]] = (item[0], next_item, item[2]) + item[3:]
322- if self.first == self.index[name]:
323- self.first = self.index[name][1]
324- if self.last == self.index[name]:
325- self.last = self.index[name][2]
326- del self.index[name]
327+ item = self.index.pop(name)
328+ if item.next is not None:
329+ item.next.prev = item.prev
330+ if item.prev is not None:
331+ item.prev.next = item.next
332+ if self.first == item:
333+ self.first = item.next
334+ if self.last == item:
335+ self.last = item.prev
336
337 def get(self, name):
338 if name in self.index:
339@@ -269,7 +288,7 @@
340 def iter(self, filters={}):
341 marker = filters.get('marker', None)
342 if marker is not None and marker in self.index:
343- item = self.index[marker]
344+ item = self.index[marker].next
345 else:
346 item = self.first
347 limit = filters.get('limit', None)
348@@ -279,46 +298,61 @@
349 limit -= 1
350 if limit == 0:
351 break
352- item = item[1]
353-
354-
355-class Accounts(IndexedTupleList):
356+ item = item.next
357+
358+
359+class Account(Item):
360+
361+ def __init__(self, name=None):
362+ super(Account, self).__init__(name)
363+ self.queues = Queues()
364+
365+
366+class Accounts(IndexedList):
367
368 def delete_queue(self, account, queue):
369 account = self.get(account)
370 if account is not None:
371- account[3].delete_item(queue)
372- if account[3].count() == 0:
373- self.delete_item(account[0])
374+ account.queues.delete_item(queue)
375+ if account.queues.count() == 0:
376+ self.delete_item(account.name)
377
378 def delete_queues(self, account, filters):
379 account = self.get(account)
380 if account is not None:
381- account[3].delete(filters)
382- if account[3].count() == 0:
383- self.delete_item(account[0])
384+ for queue in account.queues.delete(filters):
385+ yield queue
386+ if account.queues.count() == 0:
387+ self.delete_item(account.name)
388
389 def get_queue(self, account, queue, create=False):
390 if account in self.index:
391 account = self.index[account]
392 elif create:
393- account = self.add((account, None, None, Queues()))
394+ account = self.add(Account(account))
395 else:
396 return None, None
397- return account, account[3].get(queue, create)
398+ return account, account.queues.get(queue, create)
399
400- def iter_queues(self, account, filters={}):
401+ def get_queues(self, account, filters={}):
402 account = self.get(account)
403 if account is not None:
404- for queue in account[3].iter(filters):
405+ for queue in account.queues.iter(filters):
406 yield queue
407
408
409-class Queues(IndexedTupleList):
410+class Queue(Item):
411+
412+ def __init__(self, name=None):
413+ super(Queue, self).__init__(name)
414+ self.messages = []
415+
416+
417+class Queues(IndexedList):
418
419 def get(self, queue, create=False):
420 if queue in self.index:
421 return self.index[queue]
422 elif create:
423- return self.add((queue, None, None, []))
424+ return self.add(Queue(queue))
425 return None
426
427=== modified file 'burrow/backend/sqlite.py'
428--- burrow/backend/sqlite.py 2011-04-24 22:47:02 +0000
429+++ burrow/backend/sqlite.py 2011-06-13 16:44:08 +0000
430@@ -54,7 +54,8 @@
431 if len(filters) == 0:
432 self.db.execute('DELETE FROM queues')
433 self.db.execute('DELETE FROM messages')
434- return
435+ return []
436+ return []
437
438 def get_accounts(self, filters={}):
439 query = 'SELECT DISTINCT account FROM queues'
440@@ -76,10 +77,11 @@
441 for row in self.db.execute(query, (account,)):
442 ids.append(str(row[0]))
443 if len(ids) == 0:
444- return
445+ return []
446 query = 'DELETE FROM messages WHERE queue IN (%s)'
447 self.db.execute(query % ','.join(ids))
448 self.db.execute('DELETE FROM queues WHERE account=?', (account,))
449+ return []
450
451 def get_queues(self, account, filters={}):
452 query = 'SELECT queue FROM queues WHERE account=?'
453
454=== modified file 'burrow/frontend/wsgi.py'
455--- burrow/frontend/wsgi.py 2011-05-24 03:07:25 +0000
456+++ burrow/frontend/wsgi.py 2011-06-13 16:44:08 +0000
457@@ -128,7 +128,7 @@
458 @webob.dec.wsgify
459 def _delete_version(self, req):
460 filters = self._parse_filters(req)
461- self.backend.delete_accounts(filters)
462+ [account for account in self.backend.delete_accounts(filters)]
463 return webob.exc.HTTPNoContent()
464
465 @webob.dec.wsgify
466@@ -142,7 +142,7 @@
467 @webob.dec.wsgify
468 def _delete_account(self, req, account):
469 filters = self._parse_filters(req)
470- self.backend.delete_queues(account, filters)
471+ [queue for queue in self.backend.delete_queues(account, filters)]
472 return webob.exc.HTTPNoContent()
473
474 @webob.dec.wsgify
475
476=== added directory 'test/backend'
477=== added file 'test/backend/__init__.py'
478=== added file 'test/backend/test_memory.py'
479--- test/backend/test_memory.py 1970-01-01 00:00:00 +0000
480+++ test/backend/test_memory.py 2011-06-13 16:44:08 +0000
481@@ -0,0 +1,121 @@
482+# Copyright (C) 2011 OpenStack LLC.
483+#
484+# Licensed under the Apache License, Version 2.0 (the "License");
485+# you may not use this file except in compliance with the License.
486+# You may obtain a copy of the License at
487+#
488+# http://www.apache.org/licenses/LICENSE-2.0
489+#
490+# Unless required by applicable law or agreed to in writing, software
491+# distributed under the License is distributed on an "AS IS" BASIS,
492+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
493+# See the License for the specific language governing permissions and
494+# limitations under the License.
495+
496+import ConfigParser
497+import time
498+import unittest
499+
500+import eventlet
501+
502+import burrow.backend.memory
503+
504+
505+class TestMemory(unittest.TestCase):
506+ '''Unittests for the memory backend.'''
507+ backend_class = burrow.backend.memory.Backend
508+
509+ def setUp(self):
510+ config = (ConfigParser.ConfigParser(), 'test')
511+ self.backend = self.backend_class(config)
512+ self.assertEquals([], list(self.backend.get_accounts()))
513+ self.assertEquals([], list(self.backend.get_queues('a')))
514+ self.assertEquals([], list(self.backend.get_messages('a', 'q')))
515+
516+ def tearDown(self):
517+ self.assertEquals([], list(self.backend.get_messages('a', 'q')))
518+ self.assertEquals([], list(self.backend.get_queues('a')))
519+ self.assertEquals([], list(self.backend.get_accounts()))
520+
521+ def test_account(self):
522+ self.backend.create_message('a', 'q', 'm', 'test')
523+ self.assertEquals(['a'], list(self.backend.get_accounts()))
524+ self.assertEquals([], list(self.backend.delete_accounts()))
525+
526+ def test_account_delete_detail_all(self):
527+ self.backend.create_message('a', 'q', 'm', 'test')
528+ self.assertEquals(['a'], list(self.backend.get_accounts()))
529+ filters = dict(detail='all')
530+ accounts = list(self.backend.delete_accounts(filters))
531+ self.assertEquals(['a'], accounts)
532+
533+ def test_account_delete_detail_id(self):
534+ self.backend.create_message('a', 'q', 'm', 'test')
535+ self.assertEquals(['a'], list(self.backend.get_accounts()))
536+ filters = dict(detail='id')
537+ accounts = list(self.backend.delete_accounts(filters))
538+ self.assertEquals(['a'], accounts)
539+
540+ def test_account_delete_detail_none(self):
541+ self.backend.create_message('a', 'q', 'm', 'test')
542+ self.assertEquals(['a'], list(self.backend.get_accounts()))
543+ filters = dict(detail='none')
544+ accounts = list(self.backend.delete_accounts(filters))
545+ self.assertEquals([], accounts)
546+
547+ def test_account_delete_detail_bad(self):
548+ self.backend.create_message('a', 'q', 'm', 'test')
549+ self.assertEquals(['a'], list(self.backend.get_accounts()))
550+ filters = dict(detail='bad')
551+ accounts = self.backend.delete_accounts(filters)
552+ self.assertRaises(burrow.backend.BadDetail, list, accounts)
553+ self.assertEquals([], list(self.backend.delete_accounts()))
554+
555+ def test_account_get_detail_all(self):
556+ self.backend.create_message('a', 'q', 'm', 'test')
557+ self.assertEquals(['a'], list(self.backend.get_accounts()))
558+ filters = dict(detail='all')
559+ accounts = list(self.backend.get_accounts(filters))
560+ self.assertEquals(['a'], accounts)
561+ self.assertEquals([], list(self.backend.delete_accounts()))
562+
563+ def test_account_get_detail_id(self):
564+ self.backend.create_message('a', 'q', 'm', 'test')
565+ self.assertEquals(['a'], list(self.backend.get_accounts()))
566+ filters = dict(detail='id')
567+ accounts = list(self.backend.get_accounts(filters))
568+ self.assertEquals(['a'], accounts)
569+ self.assertEquals([], list(self.backend.delete_accounts()))
570+
571+ def test_account_get_detail_none(self):
572+ self.backend.create_message('a', 'q', 'm', 'test')
573+ self.assertEquals(['a'], list(self.backend.get_accounts()))
574+ filters = dict(detail='none')
575+ accounts = list(self.backend.get_accounts(filters))
576+ self.assertEquals([], accounts)
577+ self.assertEquals([], list(self.backend.delete_accounts()))
578+
579+ def test_account_get_detail_bad(self):
580+ self.backend.create_message('a', 'q', 'm', 'test')
581+ self.assertEquals(['a'], list(self.backend.get_accounts()))
582+ filters = dict(detail='bad')
583+ accounts = self.backend.get_accounts(filters)
584+ self.assertRaises(burrow.backend.BadDetail, list, accounts)
585+ self.assertEquals([], list(self.backend.delete_accounts()))
586+
587+ def test_account_get_marker(self):
588+ self.backend.create_message('a1', 'q', 'm', 'test')
589+ self.backend.create_message('a2', 'q', 'm', 'test')
590+ self.backend.create_message('a3', 'q', 'm', 'test')
591+ accounts = list(self.backend.get_accounts())
592+ self.assertEquals(3, len(accounts))
593+ filters = dict(marker=accounts[0])
594+ accounts2 = list(self.backend.get_accounts(filters))
595+ self.assertEquals(accounts[1:], accounts2)
596+ filters = dict(marker=accounts[1])
597+ accounts3 = list(self.backend.get_accounts(filters))
598+ self.assertEquals(accounts[2:], accounts3)
599+ filters = dict(marker=accounts[2])
600+ accounts4 = list(self.backend.get_accounts(filters))
601+ self.assertEquals([], accounts4)
602+ self.assertEquals([], list(self.backend.delete_accounts()))

Subscribers

People subscribed via source and target branches