56
150
self.send_error(httplib.BAD_REQUEST)
153
"""Retrieve a list of messages on GET."""
154
scheme, netloc, path, params, query_string, fragments = (
156
parts = path.split('/')
157
if parts[1] == 'archive':
159
response = self.server.store.get_messages(
160
parts[2], query_string)
161
self.send_response(httplib.OK)
163
self.wfile.write(simplejson.dumps(response))
164
except Exception, error:
166
httplib.BAD_REQUEST, error.__doc__)
59
def fake_grackle_service(client, messages=None):
62
return ForkedFake(client.port, messages)
169
def log_message(self, format, *args):
170
"""Override log_message to use standard Python logging."""
171
message = "%s - - [%s] %s\n" % (
172
self.address_string(), self.log_date_time_string(), format % args)
173
self.logger.info(message)
65
176
class TestPutMessage(TestCase):
67
178
def test_put_message(self):
68
client = GrackleClient('localhost', 8436)
69
with fake_grackle_service(client):
70
client.put_message('arch1', 'asdf', StringIO('This is a message'))
179
client = GrackleClient('localhost', 8420)
180
message_archives = {'arch1': []}
181
service = ForkedFakeService.from_client(client, message_archives)
183
client.put_message('arch1', 'id1', StringIO('This is a message'))
184
response = client.get_messages('arch1')
185
self.assertEqual(1, len(response['messages']))
186
message = response['messages'][0]
187
self.assertEqual('id1', message['message_id'])
189
def test_put_message_without_message(self):
190
client = GrackleClient('localhost', 8421)
191
message_archives = {'arch1': []}
192
with ForkedFakeService.from_client(client, message_archives):
71
193
with ExpectedException(Exception, 'wtf'):
72
client.put_message('arch1', 'asdf',
194
client.put_message('arch1', 'id1',
73
195
StringIO('This is not a message'))
76
198
class TestGetMessages(TestCase):
200
def assertIDOrder(self, ids, messages):
201
self.assertEqual(ids, [m['message_id'] for m in messages])
203
def assertMessageIDs(self, ids, messages):
205
sorted(ids), sorted(messages, key=lambda m: m['message_id']))
78
207
def test_get_messages(self):
79
client = GrackleClient('localhost', 8435)
80
with fake_grackle_service(client,
82
[{'message-id': 'foo'},
83
{'message-id': 'bar'}]}):
84
response = client.get_messages('baz')
85
self.assertEqual(['bar', 'foo'], sorted(response.keys()))
208
client = GrackleClient('localhost', 8430)
210
'baz': [make_message('foo'), make_message('bar')]}
211
with ForkedFakeService.from_client(client, archive):
212
response = client.get_messages('baz')
213
self.assertEqual(['bar', 'foo'], sorted(m['message_id'] for m in
214
response['messages']))
215
self.assertIs(None, response['next_memo'])
216
self.assertIs(None, response['previous_memo'])
218
def test_get_messages_by_id(self):
219
client = GrackleClient('localhost', 8437)
221
'baz': [make_message('foo'), make_message('bar')]}
222
with ForkedFakeService.from_client(client, archive):
223
response = client.get_messages('baz', message_ids=['foo'])
224
message, = response['messages']
225
self.assertEqual('foo', message['message_id'])
227
def test_get_messages_batching(self):
228
client = GrackleClient('localhost', 8438)
229
archive = {'baz': [make_message('foo'), make_message('bar')]}
230
with ForkedFakeService.from_client(client, archive):
231
response = client.get_messages('baz', limit=1)
232
self.assertEqual(1, len(response['messages']))
233
messages = response['messages']
234
response = client.get_messages(
235
'baz', limit=1, memo=response['next_memo'])
236
self.assertEqual(1, len(response['messages']))
237
messages.extend(response['messages'])
238
self.assertMessageIDs(['foo', 'bar'], messages)
240
def get_messages_member_order_test(self, key):
241
client = GrackleClient('localhost', 8439)
244
make_message('foo', headers={key: '2011-03-25'}),
245
make_message('bar', headers={key: '2011-03-24'}),
247
with ForkedFakeService.from_client(client, archive):
248
response = client.get_messages('baz')
249
self.assertIDOrder(['foo', 'bar'], response['messages'])
250
response = client.get_messages('baz', order=key)
251
self.assertIDOrder(['bar', 'foo'], response['messages'])
253
def test_get_messages_date_order(self):
254
self.get_messages_member_order_test('date')
256
def test_get_messages_author_order(self):
257
self.get_messages_member_order_test('author')
259
def test_get_messages_subject_order(self):
260
self.get_messages_member_order_test('subject')
262
def test_get_messages_thread_subject_order(self):
265
make_message('bar', headers={'subject': 'y'}),
266
make_message('qux', headers={'subject': 'z'}),
267
make_message('foo', headers={'subject': 'x',
268
'in-reply-to': 'qux'}),
270
client = GrackleClient('localhost', 8439)
271
with ForkedFakeService.from_client(client, archive):
272
response = client.get_messages('baz')
273
self.assertIDOrder(['bar', 'qux', 'foo'], response['messages'])
274
response = client.get_messages('baz', order='subject')
275
self.assertIDOrder(['foo', 'bar', 'qux'], response['messages'])
276
response = client.get_messages('baz', order='thread_subject')
277
self.assertIDOrder(['bar', 'qux', 'foo'], response['messages'])
279
def test_get_messages_thread_oldest_order(self):
280
client = GrackleClient('localhost', 8439)
283
make_message('bar', headers={'date': 'x'}),
284
make_message('qux', headers={'date': 'z'}),
285
make_message('foo', headers={'date': 'y',
286
'in-reply-to': 'qux'}),
288
with ForkedFakeService.from_client(client, archive):
289
response = client.get_messages('baz')
290
self.assertIDOrder(['bar', 'qux', 'foo'], response['messages'])
291
response = client.get_messages('baz', order='date')
292
self.assertIDOrder(['bar', 'foo', 'qux'], response['messages'])
293
response = client.get_messages('baz', order='thread_oldest')
294
self.assertIDOrder(['bar', 'qux', 'foo'], response['messages'])
296
def test_get_messages_thread_newest_order(self):
297
client = GrackleClient('localhost', 8439)
300
make_message('bar', headers={'date': 'x'}),
301
make_message('qux', headers={'date': 'w'}),
302
make_message('foo', headers={'date': 'y',
303
'in-reply-to': 'bar'}),
304
make_message('baz', headers={'date': 'z',
305
'in-reply-to': 'qux'}),
307
with ForkedFakeService.from_client(client, archive):
308
response = client.get_messages('baz', order='date')
310
['qux', 'bar', 'foo', 'baz'], response['messages'])
311
response = client.get_messages('baz', order='thread_newest')
313
['bar', 'foo', 'qux', 'baz'], response['messages'])
315
def test_get_messages_unsupported_order(self):
316
client = GrackleClient('localhost', 8439)
319
make_message('foo', headers={'date': '2011-03-25'}),
320
make_message('foo', headers={'date': '2011-03-24'}),
322
with ForkedFakeService.from_client(client, archive):
323
with ExpectedException(UnsupportedOrder, ''):
324
client.get_messages('baz', order='nonsense')
326
def test_get_messages_headers_no_headers(self):
327
client = GrackleClient('localhost', 8440)
328
archive = {'baz': [make_message('foo')]}
329
with ForkedFakeService.from_client(client, archive):
330
response = client.get_messages('baz', headers=[
331
'Subject', 'Date', 'X-Launchpad-Message-Rationale'])
332
first_message = response['messages'][0]
333
self.assertEqual('foo', first_message['message_id'])
334
self.assertEqual({}, first_message['headers'])
336
def test_get_messages_headers_exclude_headers(self):
337
client = GrackleClient('localhost', 8441)
339
'baz': [make_message('foo', headers={'From': 'me'})]}
340
with ForkedFakeService.from_client(client, archive):
341
response = client.get_messages('baz', headers=[
342
'Subject', 'Date', 'X-Launchpad-Message-Rationale'])
343
first_message = response['messages'][0]
344
self.assertEqual('foo', first_message['message_id'])
345
self.assertEqual({}, first_message['headers'])
347
def test_get_messages_headers_include_headers(self):
348
client = GrackleClient('localhost', 8442)
351
make_message('foo', headers={'From': 'me', 'To': 'you'})]}
352
with ForkedFakeService.from_client(client, archive):
353
response = client.get_messages('baz', headers=[
355
first_message = response['messages'][0]
356
self.assertEqual('foo', first_message['message_id'])
357
self.assertEqual({'From': 'me', 'To': 'you'}, first_message['headers'])
359
def test_get_messages_max_body_length(self):
360
client = GrackleClient('localhost', 8443)
361
archive = {'baz': [make_message('foo', body=u'abcdefghi')]}
362
with ForkedFakeService.from_client(client, archive):
363
response = client.get_messages('baz', max_body_length=3)
364
first_message = response['messages'][0]
365
self.assertEqual('abc', first_message['body'])
367
def test_include_hidden(self):
368
client = GrackleClient('localhost', 8444)
371
make_message('foo', hidden=True),
372
make_message('bar', hidden=False),
374
with ForkedFakeService.from_client(client, archive):
375
response = client.get_messages('baz', include_hidden=True)
376
self.assertMessageIDs(['bar', 'foo'], response['messages'])
377
response = client.get_messages('baz', include_hidden=False)
378
self.assertMessageIDs(['bar'], response['messages'])
380
def test_display_type_unknown_value(self):
381
client = GrackleClient('localhost', 8445)
382
archive = {'baz': [make_message('foo', body=u'abcdefghi')]}
383
with ForkedFakeService.from_client(client, archive):
384
with ExpectedException(UnsupportedDisplayType, ''):
385
client.get_messages('baz', display_type='unknown')
387
def test_display_type_headers_only(self):
388
client = GrackleClient('localhost', 8446)
391
make_message('foo', body=u'abcdefghi',
392
headers={'From': 'me', 'To': 'you'})]}
393
with ForkedFakeService.from_client(client, archive):
394
response = client.get_messages('baz', display_type='headers-only')
395
first_message = response['messages'][0]
396
self.assertEqual('foo', first_message['message_id'])
398
{'From': 'me', 'Message-Id': 'foo', 'To': 'you'},
399
first_message['headers'])
400
self.assertNotIn('body', first_message)
402
def test_display_type_text_only(self):
403
client = GrackleClient('localhost', 8446)
408
headers={'From': 'me', 'To': 'you'},
409
attachment_type='text/x-diff')]}
410
with ForkedFakeService.from_client(client, archive):
411
response = client.get_messages('baz', display_type='text-only')
412
first_message = response['messages'][0]
413
self.assertEqual('foo', first_message['message_id'])
414
self.assertEqual('me', first_message['headers']['From'])
415
self.assertEqual('you', first_message['headers']['To'])
416
self.assertEqual('abcdefghi', first_message['body'])
418
def test_display_type_all(self):
419
client = GrackleClient('localhost', 8447)
424
headers={'From': 'me', 'To': 'you'},
425
attachment_type='text/x-diff')]}
426
with ForkedFakeService.from_client(client, archive):
427
response = client.get_messages('baz', display_type='all')
428
first_message = response['messages'][0]
429
self.assertEqual('foo', first_message['message_id'])
430
self.assertEqual('me', first_message['headers']['From'])
431
self.assertEqual('you', first_message['headers']['To'])
433
'abcdefghi\n\nattactment data.', first_message['body'])
435
def test_date_range(self):
436
client = GrackleClient('localhost', 8448)
440
'foo', 'abcdefghi', headers={'date': '2011-12-31'}),
442
'bar', 'abcdefghi', headers={'date': '2012-01-01'}),
444
'qux', 'abcdefghi', headers={'date': '2012-01-15'}),
446
'naf', 'abcdefghi', headers={'date': '2012-01-31'}),
448
'doh', 'abcdefghi', headers={'date': '2012-02-01'}),
450
with ForkedFakeService.from_client(client, archive):
451
response = client.get_messages(
452
'baz', date_range='2012-01-01..2012-01-31')
453
ids = sorted(m['message_id'] for m in response['messages'])
454
self.assertEqual(['bar', 'naf', 'qux'], ids)
456
def test_date_range_unparsabledaterange(self):
457
client = GrackleClient('localhost', 8449)
458
archive = {'baz': [make_message('foo', body=u'abcdefghi')]}
459
with ForkedFakeService.from_client(client, archive):
460
with ExpectedException(UnparsableDateRange, ''):
461
client.get_messages('baz', date_range='2012-01-01')
463
def test_date_range_unparsabledaterange_missing_part(self):
464
client = GrackleClient('localhost', 8450)
465
archive = {'baz': [make_message('foo', body=u'abcdefghi')]}
466
with ForkedFakeService.from_client(client, archive):
467
with ExpectedException(UnparsableDateRange, ''):
468
client.get_messages('baz', date_range='2012-01-01..')
470
def test_date_range_unparsabledaterange_extra_part(self):
471
client = GrackleClient('localhost', 8451)
472
archive = {'baz': [make_message('foo', body=u'abcdefghi')]}
473
with ForkedFakeService.from_client(client, archive):
474
with ExpectedException(UnparsableDateRange, ''):
475
client.get_messages('baz', date_range='2012-01..12-02..12-03')