Skip to content

Instantly share code, notes, and snippets.

@hodgestar
Last active August 29, 2015 14:24
Show Gist options
  • Save hodgestar/7f61d8e2bf97e6a3ff30 to your computer and use it in GitHub Desktop.
Save hodgestar/7f61d8e2bf97e6a3ff30 to your computer and use it in GitHub Desktop.
Vxyowsup Test Tweaks
diff --git a/vxyowsup/tests/test_whatsapp.py b/vxyowsup/tests/test_whatsapp.py
index 2f80f2d..73568c8 100644
--- a/vxyowsup/tests/test_whatsapp.py
+++ b/vxyowsup/tests/test_whatsapp.py
@@ -1,6 +1,7 @@
import base64
-from twisted.internet.defer import inlineCallbacks
+from twisted.internet.defer import inlineCallbacks, DeferredQueue
+from twisted.internet import reactor
from vumi.tests.utils import LogCatcher
from vumi.tests.helpers import VumiTestCase
@@ -9,7 +10,7 @@ from vumi.errors import ConfigError
from vumi.transports.tests.helpers import TransportHelper
-from vxyowsup.whatsapp import WhatsAppTransport, StackClient
+from vxyowsup.whatsapp import WhatsAppTransport
from yowsup.stacks import YowStackBuilder
from yowsup.layers.logger import YowLoggerLayer
from yowsup.layers import YowLayer
@@ -17,20 +18,19 @@ from yowsup.layers.protocol_messages.protocolentities import (
TextMessageProtocolEntity)
-class DummyStackBuilder(YowStackBuilder):
- @staticmethod
- def getCoreLayers():
- return (
- YowLoggerLayer,
- TestingLayer,
- )[::-1]
+@staticmethod
+def getDummyCoreLayers():
+ return (
+ YowLoggerLayer,
+ TestingLayer,
+ )[::-1]
class TestWhatsAppTransport(VumiTestCase):
@inlineCallbacks
def setUp(self):
- self.patch(StackClient, 'STACK_BUILDER', DummyStackBuilder)
+ self.patch(YowStackBuilder, 'getCoreLayers', getDummyCoreLayers)
self.tx_helper = self.add_helper(TransportHelper(WhatsAppTransport))
self.config = {
'cc': '27',
@@ -39,15 +39,40 @@ class TestWhatsAppTransport(VumiTestCase):
}
self.transport = yield self.tx_helper.get_transport(self.config)
+ self.test_layer = self.transport.stack_client.network_layer
- def test_nothing(self):
- pass
+ def assert_nodes_equal(self, a, b):
+ b["id"] = a["id"]
+ self.assertEqual(a.toString(), b.toString())
+
+ def assert_ack(self, ack, msg):
+ self.assertEqual(ack.payload['event_type'], 'ack')
+ self.assertEqual(ack.payload['user_message_id'], msg['message_id'])
+ self.assertEqual(ack.payload['sent_message_id'], 'remote-message-id')
+
+ @inlineCallbacks
+ def test_outbound(self):
+ msg = self.tx_helper.make_outbound(
+ content="Hello!", to_addr="+1234", from_addr="+5678")
+ self.tx_helper.dispatch_outbound(msg)
+ sent = yield self.test_layer.sent.get()
+ self.assert_nodes_equal(
+ sent,
+ TextMessageProtocolEntity(
+ "Hello!", to="[email protected]").toProtocolTreeNode())
+ [ack] = yield self.tx_helper.wait_for_dispatched_events(1)
+ self.assert_ack(ack, msg)
class TestingLayer(YowLayer):
+ def __init__(self):
+ YowLayer.__init__(self)
+ self.sent = DeferredQueue()
+
def onEvent(self, event):
- print event
+ print "EVENT!", event
+ return True
def receive(self, data):
# data would've been decrypted bytes,
@@ -55,13 +80,14 @@ class TestingLayer(YowLayer):
# for convenience
# receive from lower (no lower in this layer)
# send to upper
+ print "RECEIVE!", data
self.toUpper(data)
def send(self, data):
# data is yowsup.structs.protocoltreenode.ProtocolTreeNode
# receive from upper
# send to lower (no lower in this layer)
- print(data)
+ reactor.callFromThread(self.sent.put, data)
def send_to_transport(self, text, to_address):
# method to be used in testing
diff --git a/vxyowsup/whatsapp.py b/vxyowsup/whatsapp.py
index 93e43b3..f4852a6 100644
--- a/vxyowsup/whatsapp.py
+++ b/vxyowsup/whatsapp.py
@@ -67,11 +67,11 @@ class WhatsAppTransport(Transport):
log.info('Sending %r' % (message.to_json(),))
if message['content'] == 'fail!':
return self.publish_nack(message['message_id'], 'failed')
- return self.publish_ack(
- message['message_id'], 'remote-message-id')
# assumes message['to_addr'] will be the phone number
self.stack_client.send_to_stack(
message['content'], message['to_addr'] + '@s.whatsapp.net')
+ return self.publish_ack(
+ message['message_id'], 'remote-message-id')
def catch_exit(self, f):
f.trap(WhatsAppClientDone)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment