From 4bd3a521a83984f31d6cecac17988cd0b64c9560 Mon Sep 17 00:00:00 2001 From: Simon Cross Date: Thu, 30 Jul 2015 18:37:16 +0200 Subject: [PATCH] Add support for voice and session events to logging sender. --- go_http/send.py | 59 ++++++++++++++++---------------- go_http/tests/test_send.py | 69 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 31 deletions(-) diff --git a/go_http/send.py b/go_http/send.py index c166ceb..b6581bb 100644 --- a/go_http/send.py +++ b/go_http/send.py @@ -3,6 +3,7 @@ import json import logging +import pprint import uuid import requests @@ -157,7 +158,7 @@ def fire_metric(self, metric, value, agg="last"): return self._api_request('metrics.json', data) -class LoggingSender(object): +class LoggingSender(HttpApiSender): """ A helper for pretending to sending text messages and fire metrics by instead logging them via Python's logging module. @@ -172,36 +173,32 @@ def __init__(self, logger, level=logging.INFO): self._logger = logging.getLogger(logger) self._level = level - def send_text(self, to_addr, content): - """ Send a message to an address. - - :param str to_addr: - Address to send to. - :param str content: - Text to send. - """ - self._logger.log( - self._level, "Message: %r sent to %r" % (content, to_addr)) - return { - "message_id": uuid.uuid4().hex, - "content": content, - "to_addr": to_addr, - } - - def fire_metric(self, metric, value, agg="last"): - """ Fire a value for a metric. - - :param str metric: - Name of the metric to fire. - :param float value: - Value for the metric. - :param str agg: - Aggregation type. Defaults to ``'last'``. Other allowed values are - ``'sum'``, ``'avg'``, ``'max'`` and ``'min'``. - """ - assert agg in ["last", "sum", "avg", "max", "min"] - self._logger.log( - self._level, "Metric: %r [%s] -> %g" % (metric, agg, float(value))) + def _api_request(self, suffix, py_data): + if suffix == "messages.json": + return self._handle_messages(py_data) + elif suffix == "metrics.json": + return self._handle_metrics(py_data) + else: + raise ValueError("XXX") + + def _handle_messages(self, data): + data["message_id"] = uuid.uuid4().hex + msg = "Message: %r sent to %r" % (data['content'], data['to_addr']) + if data.get("session_event"): + msg += " [session_event: %s]" % data["session_event"] + if data.get("helper_metadata"): + for key, value in sorted(data["helper_metadata"].items()): + msg += " [%s: %s]" % (key, pprint.pformat(value)) + self._logger.log(self._level, msg) + return data + + def _handle_metrics(self, data): + for metric, value, agg in data: + assert agg in ["last", "sum", "avg", "max", "min"] + self._logger.log( + self._level, "Metric: %r [%s] -> %g" % ( + metric, agg, float(value), + )) return { "success": True, "reason": "Metrics published", diff --git a/go_http/tests/test_send.py b/go_http/tests/test_send.py index d83d0e6..22e0654 100644 --- a/go_http/tests/test_send.py +++ b/go_http/tests/test_send.py @@ -229,6 +229,75 @@ def test_send_text(self): }) self.check_logs("Message: 'Hello!' sent to 'to-addr-1'") + def test_send_text_with_session_event(self): + result = self.sender.send_text( + "to-addr-1", "Hello!", session_event='close') + self.assertEqual(result, { + "message_id": result["message_id"], + "to_addr": "to-addr-1", + "content": "Hello!", + "session_event": "close", + }) + self.check_logs( + "Message: 'Hello!' sent to 'to-addr-1'" + " [session_event: close]") + + def test_send_voice(self): + result = self.sender.send_voice("to-addr-1", "Hello!") + self.assertEqual(result, { + "message_id": result["message_id"], + "to_addr": "to-addr-1", + "content": "Hello!", + }) + self.check_logs("Message: 'Hello!' sent to 'to-addr-1'") + + def test_send_voice_with_session_event(self): + result = self.sender.send_voice( + "to-addr-1", "Hello!", session_event='close') + self.assertEqual(result, { + "message_id": result["message_id"], + "to_addr": "to-addr-1", + "content": "Hello!", + "session_event": "close", + }) + self.check_logs( + "Message: 'Hello!' sent to 'to-addr-1'" + " [session_event: close]") + + def test_send_voice_with_speech_url(self): + result = self.sender.send_voice( + "to-addr-1", "Hello!", speech_url='http://example.com/voice.ogg') + self.assertEqual(result, { + "message_id": result["message_id"], + "to_addr": "to-addr-1", + "content": "Hello!", + "helper_metadata": { + "voice": { + "speech_url": "http://example.com/voice.ogg", + }, + } + }) + self.check_logs( + "Message: 'Hello!' sent to 'to-addr-1'" + " [voice: {'speech_url': 'http://example.com/voice.ogg'}]") + + def test_send_voice_with_wait_for(self): + result = self.sender.send_voice( + "to-addr-1", "Hello!", wait_for="#") + self.assertEqual(result, { + "message_id": result["message_id"], + "to_addr": "to-addr-1", + "content": "Hello!", + "helper_metadata": { + "voice": { + "wait_for": "#", + }, + } + }) + self.check_logs( + "Message: 'Hello!' sent to 'to-addr-1'" + " [voice: {'wait_for': '#'}]") + def test_fire_metric(self): result = self.sender.fire_metric("metric-1", 5.1, agg="max") self.assertEqual(result, {