Skip to content
This repository was archived by the owner on Oct 27, 2022. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 28 additions & 31 deletions go_http/send.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import json
import logging
import pprint
import uuid

import requests
Expand Down Expand Up @@ -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.
Expand All @@ -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",
Expand Down
69 changes: 69 additions & 0 deletions go_http/tests/test_send.py
Original file line number Diff line number Diff line change
Expand Up @@ -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, {
Expand Down