-
Notifications
You must be signed in to change notification settings - Fork 131
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'develop' into feature/issue-862-index-listof-fields
- Loading branch information
Showing
4 changed files
with
217 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
# -*- test-case-name: vumi.components.tests.test_message_formatters -*- | ||
|
||
from csv import writer | ||
|
||
from zope.interface import Interface, implements | ||
|
||
|
||
class IMessageFormatter(Interface): | ||
""" Interface for writing messages to an HTTP request. """ | ||
|
||
def add_http_headers(request): | ||
""" | ||
Add any needed HTTP headers to the request. | ||
Often used to set the Content-Type header. | ||
""" | ||
|
||
def write_row_header(request): | ||
""" | ||
Write any header bytes that need to be written to the request before | ||
messages. | ||
""" | ||
|
||
def write_row(request, message): | ||
""" | ||
Write a :class:`TransportUserMessage` to the request. | ||
""" | ||
|
||
|
||
class JsonFormatter(object): | ||
""" Formatter for writing messages to requests as JSON. """ | ||
|
||
implements(IMessageFormatter) | ||
|
||
def add_http_headers(self, request): | ||
resp_headers = request.responseHeaders | ||
resp_headers.addRawHeader( | ||
'Content-Type', 'application/json; charset=utf-8') | ||
|
||
def write_row_header(self, request): | ||
pass | ||
|
||
def write_row(self, request, message): | ||
request.write(message.to_json()) | ||
request.write('\n') | ||
|
||
|
||
class CsvFormatter(object): | ||
""" Formatter for writing messages to requests as CSV. """ | ||
|
||
implements(IMessageFormatter) | ||
|
||
FIELDS = ( | ||
'message_id', | ||
'to_addr', | ||
'from_addr', | ||
'in_reply_to', | ||
'session_event', | ||
'content', | ||
'group', | ||
) | ||
|
||
def add_http_headers(self, request): | ||
resp_headers = request.responseHeaders | ||
resp_headers.addRawHeader( | ||
'Content-Type', 'text/csv; charset=utf-8') | ||
|
||
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)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
# -*- coding: utf-8 -*- | ||
|
||
from twisted.web.test.test_web import DummyRequest | ||
|
||
from vumi.components.message_formatters import ( | ||
IMessageFormatter, JsonFormatter, CsvFormatter) | ||
|
||
from vumi.tests.helpers import VumiTestCase, MessageHelper | ||
|
||
|
||
class TestJsonFormatter(VumiTestCase): | ||
def setUp(self): | ||
self.msg_helper = self.add_helper(MessageHelper()) | ||
self.request = DummyRequest(['']) | ||
self.formatter = JsonFormatter() | ||
|
||
def test_implements_IMessageFormatter(self): | ||
self.assertTrue(IMessageFormatter.providedBy(self.formatter)) | ||
|
||
def test_add_http_headers(self): | ||
self.formatter.add_http_headers(self.request) | ||
self.assertEqual( | ||
self.request.responseHeaders.getRawHeaders('Content-Type'), | ||
['application/json; charset=utf-8']) | ||
|
||
def test_write_row_header(self): | ||
self.formatter.write_row_header(self.request) | ||
self.assertEqual(self.request.written, []) | ||
|
||
def test_write_row(self): | ||
msg = self.msg_helper.make_inbound("foo") | ||
self.formatter.write_row(self.request, msg) | ||
self.assertEqual(self.request.written, [ | ||
msg.to_json(), "\n", | ||
]) | ||
|
||
|
||
class TestCsvFormatter(VumiTestCase): | ||
def setUp(self): | ||
self.msg_helper = self.add_helper(MessageHelper()) | ||
self.request = DummyRequest(['']) | ||
self.formatter = CsvFormatter() | ||
|
||
def test_implements_IMessageFormatter(self): | ||
self.assertTrue(IMessageFormatter.providedBy(self.formatter)) | ||
|
||
def test_add_http_headers(self): | ||
self.formatter.add_http_headers(self.request) | ||
self.assertEqual( | ||
self.request.responseHeaders.getRawHeaders('Content-Type'), | ||
['text/csv; charset=utf-8']) | ||
|
||
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" | ||
]) | ||
|
||
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'] | ||
]) | ||
|
||
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'] | ||
]) | ||
|
||
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'] | ||
]) | ||
|
||
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'] | ||
]) | ||
|
||
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'] | ||
]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters