Skip to content

Commit

Permalink
Add timestamp to CSV message exports.
Browse files Browse the repository at this point in the history
  • Loading branch information
hodgestar committed Dec 11, 2014
1 parent cc3ddda commit c29dcf6
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 45 deletions.
20 changes: 17 additions & 3 deletions vumi/components/message_formatters.py
Expand Up @@ -51,6 +51,7 @@ class CsvFormatter(object):
implements(IMessageFormatter)

FIELDS = (
'timestamp',
'message_id',
'to_addr',
'from_addr',
Expand All @@ -69,6 +70,19 @@ def write_row_header(self, request):
writer(request).writerow(self.FIELDS)

def write_row(self, request, message):
writer(request).writerow(list(
(message[key] or '').encode('utf-8')
for key in self.FIELDS))
writer(request).writerow([
self._format_field(field, message) for field in self.FIELDS])

def _format_field(self, field, message):
field_formatter = getattr(self, '_format_field_%s' % (field,), None)
if field_formatter is not None:
field_value = field_formatter(message)
else:
field_value = self._format_field_default(field, message)
return field_value.encode('utf-8')

def _format_field_default(self, field, message):
return message[field] or u''

def _format_field_timestamp(self, message):
return message['timestamp'].isoformat()
43 changes: 25 additions & 18 deletions vumi/components/tests/test_message_formatters.py
Expand Up @@ -53,42 +53,49 @@ def test_add_http_headers(self):
def test_write_row_header(self):
self.formatter.write_row_header(self.request)
self.assertEqual(self.request.written, [
"message_id,to_addr,from_addr,in_reply_to,session_event,content,"
"group\r\n"
"timestamp,message_id,to_addr,from_addr,in_reply_to,session_event,"
"content,group\r\n"
])

def assert_row_written(self, row, row_template, msg):
self.assertEqual(row, [row_template % {
'ts': msg['timestamp'].isoformat(),
'id': msg['message_id'],
}])

def test_write_row(self):
msg = self.msg_helper.make_inbound("foo")
self.formatter.write_row(self.request, msg)
self.assertEqual(self.request.written, [
"%s,9292,+41791234567,,,foo,\r\n" % msg['message_id']
])
self.assert_row_written(
self.request.written,
"%(ts)s,%(id)s,9292,+41791234567,,,foo,\r\n", msg)

def test_write_row_with_in_reply_to(self):
msg = self.msg_helper.make_inbound("foo", in_reply_to="msg-2")
self.formatter.write_row(self.request, msg)
self.assertEqual(self.request.written, [
"%s,9292,+41791234567,msg-2,,foo,\r\n" % msg['message_id']
])
self.assert_row_written(
self.request.written,
"%(ts)s,%(id)s,9292,+41791234567,msg-2,,foo,\r\n", msg)

def test_write_row_with_session_event(self):
msg = self.msg_helper.make_inbound("foo", session_event="new")
self.formatter.write_row(self.request, msg)
self.assertEqual(self.request.written, [
"%s,9292,+41791234567,,new,foo,\r\n" % msg['message_id']
])
self.assert_row_written(
self.request.written,
"%(ts)s,%(id)s,9292,+41791234567,,new,foo,\r\n", msg)

def test_write_row_with_group(self):
msg = self.msg_helper.make_inbound("foo", group="#channel")
self.formatter.write_row(self.request, msg)
self.assertEqual(self.request.written, [
"%s,9292,+41791234567,,,foo,#channel\r\n" % msg['message_id']
])
self.assert_row_written(
self.request.written,
"%(ts)s,%(id)s,9292,+41791234567,,,foo,#channel\r\n", msg)

def test_write_row_with_unicode_content(self):
msg = self.msg_helper.make_inbound(u"føø", group="#channel")
self.formatter.write_row(self.request, msg)
self.assertEqual(self.request.written, [
u"%s,9292,+41791234567,,,føø,#channel\r\n".encode("utf-8")
% msg['message_id']
])
self.assert_row_written(
self.request.written,
u"%(ts)s,%(id)s,9292,+41791234567,,,føø,#channel\r\n".encode(
"utf-8"),
msg)
56 changes: 32 additions & 24 deletions vumi/components/tests/test_message_store_resource.py
Expand Up @@ -81,6 +81,14 @@ def make_request(self, method, batch_id, leaf, **params):
def get_batch_resource(self, batch_id):
return self.store_resource.getChild(batch_id, None)

def assert_csv_rows(self, rows, expected):
self.assertEqual(sorted(rows), sorted([
row_template % {
'id': msg['message_id'],
'ts': msg['timestamp'].isoformat(),
} for row_template, msg in expected
]))

@inlineCallbacks
def test_get_inbound(self):
yield self.start_server()
Expand All @@ -104,12 +112,12 @@ def test_get_inbound_csv(self):
rows = resp.delivered_body.split('\r\n')
header, rows = rows[0], rows[1:-1]
self.assertEqual(header, (
"message_id,to_addr,from_addr,in_reply_to,session_event,content,"
"group"))
self.assertEqual(sorted(rows), sorted([
"%s,9292,+41791234567,,,føø," % msg1['message_id'],
"%s,9292,+41791234567,,,føø," % msg2['message_id'],
]))
"timestamp,message_id,to_addr,from_addr,in_reply_to,session_event,"
"content,group"))
self.assert_csv_rows(rows, [
("%(ts)s,%(id)s,9292,+41791234567,,,føø,", msg1),
("%(ts)s,%(id)s,9292,+41791234567,,,føø,", msg2),
])

@inlineCallbacks
def test_get_outbound(self):
Expand All @@ -134,12 +142,12 @@ def test_get_outbound_csv(self):
rows = resp.delivered_body.split('\r\n')
header, rows = rows[0], rows[1:-1]
self.assertEqual(header, (
"message_id,to_addr,from_addr,in_reply_to,session_event,content,"
"group"))
self.assertEqual(sorted(rows), sorted([
"%s,+41791234567,9292,,,føø," % msg1['message_id'],
"%s,+41791234567,9292,,,føø," % msg2['message_id'],
]))
"timestamp,message_id,to_addr,from_addr,in_reply_to,session_event,"
"content,group"))
self.assert_csv_rows(rows, [
("%(ts)s,%(id)s,+41791234567,9292,,,føø,", msg1),
("%(ts)s,%(id)s,+41791234567,9292,,,føø,", msg2),
])

@inlineCallbacks
def test_get_inbound_multiple_pages(self):
Expand Down Expand Up @@ -315,12 +323,12 @@ def test_get_inbound_csv_for_time_range(self):
rows = resp.delivered_body.split('\r\n')
header, rows = rows[0], rows[1:-1]
self.assertEqual(header, (
"message_id,to_addr,from_addr,in_reply_to,session_event,content,"
"group"))
self.assertEqual(sorted(rows), sorted([
"%s,9292,+41791234567,,,føø," % msg2['message_id'],
"%s,9292,+41791234567,,,føø," % msg3['message_id'],
]))
"timestamp,message_id,to_addr,from_addr,in_reply_to,session_event,"
"content,group"))
self.assert_csv_rows(rows, [
("%(ts)s,%(id)s,9292,+41791234567,,,føø,", msg2),
("%(ts)s,%(id)s,9292,+41791234567,,,føø,", msg3),
])

@inlineCallbacks
def test_get_outbound_for_time_range(self):
Expand Down Expand Up @@ -416,9 +424,9 @@ def test_get_outbound_csv_for_time_range(self):
rows = resp.delivered_body.split('\r\n')
header, rows = rows[0], rows[1:-1]
self.assertEqual(header, (
"message_id,to_addr,from_addr,in_reply_to,session_event,content,"
"group"))
self.assertEqual(sorted(rows), sorted([
"%s,+41791234567,9292,,,føø," % msg2['message_id'],
"%s,+41791234567,9292,,,føø," % msg3['message_id'],
]))
"timestamp,message_id,to_addr,from_addr,in_reply_to,session_event,"
"content,group"))
self.assert_csv_rows(rows, [
("%(ts)s,%(id)s,+41791234567,9292,,,føø,", msg2),
("%(ts)s,%(id)s,+41791234567,9292,,,føø,", msg3),
])

0 comments on commit c29dcf6

Please sign in to comment.