class FakeRedisIncrTestCase(TestCase): def test_incr(self): self.r_server = FakeRedis() self.r_server.set("inc", 1) self.assertEqual('1', self.r_server.get("inc")) self.assertEqual('2', self.r_server.incr("inc")) self.assertEqual('3', self.r_server.incr("inc")) def test_incrby(self): self.r_server = FakeRedis() self.r_server.set("inc", 1) self.assertEqual('1', self.r_server.get("inc")) self.assertEqual('2', self.r_server.incrby("inc", 1)) self.assertEqual('4', self.r_server.incrby("inc", 2)) self.assertEqual('7', self.r_server.incrby("inc", 3)) self.assertEqual('11', self.r_server.incrby("inc", 4)) self.assertEqual('111', self.r_server.incrby("inc", 100))
class TestContentKeywordRouter(DispatcherTestCase): dispatcher_class = BaseDispatchWorker transport_name = 'test_transport' @inlineCallbacks def setUp(self): yield super(TestContentKeywordRouter, self).setUp() self.config = { 'dispatcher_name': 'keyword_dispatcher', 'router_class': 'vumi.dispatchers.base.ContentKeywordRouter', 'transport_names': ['transport1', 'transport2'], 'transport_mappings': { 'shortcode1': 'transport1', 'shortcode2': 'transport2', }, 'exposed_names': ['app1', 'app2', 'app3', 'fallback_app'], 'rules': [{'app': 'app1', 'keyword': 'KEYWORD1', 'to_addr': '8181', 'prefix': '+256', }, {'app': 'app2', 'keyword': 'KEYWORD2', }], 'keyword_mappings': { 'app2': 'KEYWORD3', 'app3': 'KEYWORD1', }, 'fallback_application': 'fallback_app', 'expire_routing_memory': '3', } self.fake_redis = FakeRedis() self.dispatcher = yield self.get_dispatcher(self.config) self.router = self.dispatcher._router self.router.r_server = self.fake_redis def tearDown(self): self.fake_redis.teardown() super(TestContentKeywordRouter, self).tearDown() @inlineCallbacks def test_inbound_message_routing(self): msg = self.mkmsg_in(content='KEYWORD1 rest of a msg', to_addr='8181', from_addr='+256788601462') yield self.dispatch(msg, transport_name='transport1', direction='inbound') msg2 = self.mkmsg_in(content='KEYWORD2 rest of a msg', to_addr='8181', from_addr='+256788601462') yield self.dispatch(msg2, transport_name='transport1', direction='inbound') msg3 = self.mkmsg_in(content='KEYWORD3 rest of a msg', to_addr='8181', from_addr='+256788601462') yield self.dispatch(msg3, transport_name='transport1', direction='inbound') app1_inbound_msg = self.get_dispatched_messages('app1', direction='inbound') self.assertEqual(app1_inbound_msg, [msg]) app2_inbound_msg = self.get_dispatched_messages('app2', direction='inbound') self.assertEqual(app2_inbound_msg, [msg2, msg3]) app3_inbound_msg = self.get_dispatched_messages('app3', direction='inbound') self.assertEqual(app3_inbound_msg, [msg]) @inlineCallbacks def test_inbound_message_routing_empty_message_content(self): msg = self.mkmsg_in(content=None) yield self.dispatch(msg, transport_name='transport1', direction='inbound') app1_inbound_msg = self.get_dispatched_messages('app1', direction='inbound') self.assertEqual(app1_inbound_msg, []) app2_inbound_msg = self.get_dispatched_messages('app2', direction='inbound') self.assertEqual(app2_inbound_msg, []) fallback_msgs = self.get_dispatched_messages('fallback_app', direction='inbound') self.assertEqual(fallback_msgs, [msg]) @inlineCallbacks def test_inbound_message_routing_not_casesensitive(self): msg = self.mkmsg_in(content='keyword1 rest of a msg', to_addr='8181', from_addr='+256788601462') yield self.dispatch(msg, transport_name='transport1', direction='inbound') app1_inbound_msg = self.get_dispatched_messages('app1', direction='inbound') self.assertEqual(app1_inbound_msg, [msg]) @inlineCallbacks def test_inbound_event_routing_ok(self): msg = self.mkmsg_ack(user_message_id='1', transport_name='transport1') self.router.r_server.set('keyword_dispatcher:message:1', 'app2') yield self.dispatch(msg, transport_name='transport1', direction='event') app2_event_msg = self.get_dispatched_messages('app2', direction='event') self.assertEqual(app2_event_msg, [msg]) app1_event_msg = self.get_dispatched_messages('app1', direction='event') self.assertEqual(app1_event_msg, []) @inlineCallbacks def test_inbound_event_routing_failing_publisher_not_defined(self): msg = self.mkmsg_ack(transport_name='transport1') yield self.dispatch(msg, transport_name='transport1', direction='event') app1_routed_msg = self.get_dispatched_messages('app1', direction='event') self.assertEqual(app1_routed_msg, []) app2_routed_msg = self.get_dispatched_messages('app2', direction='event') self.assertEqual(app2_routed_msg, []) @inlineCallbacks def test_inbound_event_routing_failing_no_routing_back_in_redis(self): msg = self.mkmsg_ack(transport_name='transport1') yield self.dispatch(msg, transport_name='transport1', direction='event') app1_routed_msg = self.get_dispatched_messages('app1', direction='event') self.assertEqual(app1_routed_msg, []) app2_routed_msg = self.get_dispatched_messages('app2', direction='event') self.assertEqual(app2_routed_msg, []) @inlineCallbacks def test_outbound_message_routing(self): msg = self.mkmsg_out(content="KEYWORD1 rest of msg", from_addr='shortcode1', transport_name='app2') yield self.dispatch(msg, transport_name='app2', direction='outbound') transport1_msgs = self.get_dispatched_messages('transport1', direction='outbound') self.assertEqual(transport1_msgs, [msg]) transport2_msgs = self.get_dispatched_messages('transport2', direction='outbound') self.assertEqual(transport2_msgs, []) app2_route = self.fake_redis.get('keyword_dispatcher:message:1') self.assertEqual(app2_route, 'app2')
class FakeRedisTestCase(TestCase): def test_delete(self): self.r_server = FakeRedis() self.r_server.set("delete_me", 1) self.assertEqual(True, self.r_server.delete("delete_me")) self.assertEqual(False, self.r_server.delete("delete_me")) def test_incr(self): self.r_server = FakeRedis() self.r_server.set("inc", 1) self.assertEqual('1', self.r_server.get("inc")) self.assertEqual(2, self.r_server.incr("inc")) self.assertEqual(3, self.r_server.incr("inc")) self.assertEqual('3', self.r_server.get("inc")) def test_incr_with_by_param(self): self.r_server = FakeRedis() self.r_server.set("inc", 1) self.assertEqual('1', self.r_server.get("inc")) self.assertEqual(2, self.r_server.incr("inc", 1)) self.assertEqual(4, self.r_server.incr("inc", 2)) self.assertEqual(7, self.r_server.incr("inc", 3)) self.assertEqual(11, self.r_server.incr("inc", 4)) self.assertEqual(111, self.r_server.incr("inc", 100)) self.assertEqual('111', self.r_server.get("inc")) def test_zrange(self): self.r_server = FakeRedis() self.r_server.zadd('set', one=0.1, two=0.2, three=0.3) self.assertEqual(self.r_server.zrange('set', 0, 0), ['one']) self.assertEqual(self.r_server.zrange('set', 0, 1), ['one', 'two']) self.assertEqual(self.r_server.zrange('set', 0, 2), ['one', 'two', 'three']) self.assertEqual(self.r_server.zrange('set', 0, 3), ['one', 'two', 'three']) self.assertEqual(self.r_server.zrange('set', 0, -1), ['one', 'two', 'three']) self.assertEqual(self.r_server.zrange('set', 0, -1, withscores=True), [(0.1, 'one'), (0.2, 'two'), (0.3, 'three')]) self.assertEqual(self.r_server.zrange('set', 0, -1, desc=True), ['three', 'two', 'one']) self.assertEqual( self.r_server.zrange('set', 0, -1, desc=True, withscores=True), [(0.3, 'three'), (0.2, 'two'), (0.1, 'one')]) def test_hgetall_returns_copy(self): self.r_server = FakeRedis() self.r_server.hset("hash", "foo", "1") data = self.r_server.hgetall("hash") data["foo"] = "2" self.assertEqual(self.r_server.hgetall("hash"), { "foo": "1", }) def test_hincrby(self): self.r_server = FakeRedis() hincrby = self.r_server.hincrby self.assertEqual(hincrby("inc", "field1"), 1) self.assertEqual(hincrby("inc", "field1"), 2) self.assertEqual(hincrby("inc", "field1", 3), 5) self.assertEqual(hincrby("inc", "field1", "2"), 7) self.assertRaises(Exception, hincrby, "inc", "field1", "1.5") self.r_server.hset("inc", "field2", "a") self.assertRaises(Exception, hincrby, "inc", "field2") self.r_server.set("key", "string") self.assertRaises(Exception, self.r_server.hincrby, "key", "field1") def test_sadd(self): self.r_server = FakeRedis() self.r_server.sadd('set', 1) self.r_server.sadd('set', 2, 3, 4) self.assertEqual(self.r_server.smembers('set'), set(['1', '2', '3', '4'])) def test_smove(self): self.r_server = FakeRedis() self.r_server.sadd('set1', 1) self.r_server.sadd('set2', 2) self.assertEqual(self.r_server.smove('set1', 'set2', '1'), True) self.assertEqual(self.r_server.smembers('set1'), set()) self.assertEqual(self.r_server.smembers('set2'), set(['1', '2'])) self.assertEqual(self.r_server.smove('set1', 'set2', '1'), False) self.assertEqual(self.r_server.smove('set2', 'set3', '1'), True) self.assertEqual(self.r_server.smembers('set2'), set(['2'])) self.assertEqual(self.r_server.smembers('set3'), set(['1'])) def test_sunion(self): self.r_server = FakeRedis() self.r_server.sadd('set1', 1) self.r_server.sadd('set2', 2) self.assertEqual(self.r_server.sunion('set1'), set(['1'])) self.assertEqual(self.r_server.sunion('set1', 'set2'), set(['1', '2'])) self.assertEqual(self.r_server.sunion('other'), set())
class TestContentKeywordRouter(DispatcherTestCase): dispatcher_class = BaseDispatchWorker transport_name = 'test_transport' @inlineCallbacks def setUp(self): yield super(TestContentKeywordRouter, self).setUp() self.config = { 'dispatcher_name': 'keyword_dispatcher', 'router_class': 'vumi.dispatchers.base.ContentKeywordRouter', 'transport_names': ['transport1', 'transport2'], 'transport_mappings': { 'shortcode1': 'transport1', 'shortcode2': 'transport2', }, 'exposed_names': ['app1', 'app2', 'app3', 'fallback_app'], 'rules': [{ 'app': 'app1', 'keyword': 'KEYWORD1', 'to_addr': '8181', 'prefix': '+256', }, { 'app': 'app2', 'keyword': 'KEYWORD2', }], 'keyword_mappings': { 'app2': 'KEYWORD3', 'app3': 'KEYWORD1', }, 'fallback_application': 'fallback_app', 'expire_routing_memory': '3', } self.fake_redis = FakeRedis() self.dispatcher = yield self.get_dispatcher(self.config) self.router = self.dispatcher._router self.router.r_server = self.fake_redis def tearDown(self): self.fake_redis.teardown() super(TestContentKeywordRouter, self).tearDown() @inlineCallbacks def test_inbound_message_routing(self): msg = self.mkmsg_in(content='KEYWORD1 rest of a msg', to_addr='8181', from_addr='+256788601462') yield self.dispatch(msg, transport_name='transport1', direction='inbound') msg2 = self.mkmsg_in(content='KEYWORD2 rest of a msg', to_addr='8181', from_addr='+256788601462') yield self.dispatch(msg2, transport_name='transport1', direction='inbound') msg3 = self.mkmsg_in(content='KEYWORD3 rest of a msg', to_addr='8181', from_addr='+256788601462') yield self.dispatch(msg3, transport_name='transport1', direction='inbound') app1_inbound_msg = self.get_dispatched_messages('app1', direction='inbound') self.assertEqual(app1_inbound_msg, [msg]) app2_inbound_msg = self.get_dispatched_messages('app2', direction='inbound') self.assertEqual(app2_inbound_msg, [msg2, msg3]) app3_inbound_msg = self.get_dispatched_messages('app3', direction='inbound') self.assertEqual(app3_inbound_msg, [msg]) @inlineCallbacks def test_inbound_message_routing_empty_message_content(self): msg = self.mkmsg_in(content=None) yield self.dispatch(msg, transport_name='transport1', direction='inbound') app1_inbound_msg = self.get_dispatched_messages('app1', direction='inbound') self.assertEqual(app1_inbound_msg, []) app2_inbound_msg = self.get_dispatched_messages('app2', direction='inbound') self.assertEqual(app2_inbound_msg, []) fallback_msgs = self.get_dispatched_messages('fallback_app', direction='inbound') self.assertEqual(fallback_msgs, [msg]) @inlineCallbacks def test_inbound_message_routing_not_casesensitive(self): msg = self.mkmsg_in(content='keyword1 rest of a msg', to_addr='8181', from_addr='+256788601462') yield self.dispatch(msg, transport_name='transport1', direction='inbound') app1_inbound_msg = self.get_dispatched_messages('app1', direction='inbound') self.assertEqual(app1_inbound_msg, [msg]) @inlineCallbacks def test_inbound_event_routing_ok(self): msg = self.mkmsg_ack(user_message_id='1', transport_name='transport1') self.router.r_server.set('keyword_dispatcher:message:1', 'app2') yield self.dispatch(msg, transport_name='transport1', direction='event') app2_event_msg = self.get_dispatched_messages('app2', direction='event') self.assertEqual(app2_event_msg, [msg]) app1_event_msg = self.get_dispatched_messages('app1', direction='event') self.assertEqual(app1_event_msg, []) @inlineCallbacks def test_inbound_event_routing_failing_publisher_not_defined(self): msg = self.mkmsg_ack(transport_name='transport1') yield self.dispatch(msg, transport_name='transport1', direction='event') app1_routed_msg = self.get_dispatched_messages('app1', direction='event') self.assertEqual(app1_routed_msg, []) app2_routed_msg = self.get_dispatched_messages('app2', direction='event') self.assertEqual(app2_routed_msg, []) @inlineCallbacks def test_inbound_event_routing_failing_no_routing_back_in_redis(self): msg = self.mkmsg_ack(transport_name='transport1') yield self.dispatch(msg, transport_name='transport1', direction='event') app1_routed_msg = self.get_dispatched_messages('app1', direction='event') self.assertEqual(app1_routed_msg, []) app2_routed_msg = self.get_dispatched_messages('app2', direction='event') self.assertEqual(app2_routed_msg, []) @inlineCallbacks def test_outbound_message_routing(self): msg = self.mkmsg_out(content="KEYWORD1 rest of msg", from_addr='shortcode1', transport_name='app2') yield self.dispatch(msg, transport_name='app2', direction='outbound') transport1_msgs = self.get_dispatched_messages('transport1', direction='outbound') self.assertEqual(transport1_msgs, [msg]) transport2_msgs = self.get_dispatched_messages('transport2', direction='outbound') self.assertEqual(transport2_msgs, []) app2_route = self.fake_redis.get('keyword_dispatcher:message:1') self.assertEqual(app2_route, 'app2')
class FakeRedisTestCase(TestCase): def test_delete(self): self.r_server = FakeRedis() self.r_server.set("delete_me", 1) self.assertEqual(True, self.r_server.delete("delete_me")) self.assertEqual(False, self.r_server.delete("delete_me")) def test_incr(self): self.r_server = FakeRedis() self.r_server.set("inc", 1) self.assertEqual('1', self.r_server.get("inc")) self.assertEqual(2, self.r_server.incr("inc")) self.assertEqual(3, self.r_server.incr("inc")) self.assertEqual('3', self.r_server.get("inc")) def test_incr_with_by_param(self): self.r_server = FakeRedis() self.r_server.set("inc", 1) self.assertEqual('1', self.r_server.get("inc")) self.assertEqual(2, self.r_server.incr("inc", 1)) self.assertEqual(4, self.r_server.incr("inc", 2)) self.assertEqual(7, self.r_server.incr("inc", 3)) self.assertEqual(11, self.r_server.incr("inc", 4)) self.assertEqual(111, self.r_server.incr("inc", 100)) self.assertEqual('111', self.r_server.get("inc")) def test_zrange(self): self.r_server = FakeRedis() self.r_server.zadd('set', one=0.1, two=0.2, three=0.3) self.assertEqual(self.r_server.zrange('set', 0, 0), ['one']) self.assertEqual(self.r_server.zrange('set', 0, 1), ['one', 'two']) self.assertEqual(self.r_server.zrange('set', 0, 2), ['one', 'two', 'three']) self.assertEqual(self.r_server.zrange('set', 0, 3), ['one', 'two', 'three']) self.assertEqual(self.r_server.zrange('set', 0, -1), ['one', 'two', 'three']) self.assertEqual(self.r_server.zrange('set', 0, -1, withscores=True), [(0.1, 'one'), (0.2, 'two'), (0.3, 'three')]) self.assertEqual(self.r_server.zrange('set', 0, -1, desc=True), ['three', 'two', 'one']) self.assertEqual(self.r_server.zrange('set', 0, -1, desc=True, withscores=True), [(0.3, 'three'), (0.2, 'two'), (0.1, 'one')]) def test_hgetall_returns_copy(self): self.r_server = FakeRedis() self.r_server.hset("hash", "foo", "1") data = self.r_server.hgetall("hash") data["foo"] = "2" self.assertEqual(self.r_server.hgetall("hash"), { "foo": "1", }) def test_hincrby(self): self.r_server = FakeRedis() hincrby = self.r_server.hincrby self.assertEqual(hincrby("inc", "field1"), 1) self.assertEqual(hincrby("inc", "field1"), 2) self.assertEqual(hincrby("inc", "field1", 3), 5) self.assertEqual(hincrby("inc", "field1", "2"), 7) self.assertRaises(Exception, hincrby, "inc", "field1", "1.5") self.r_server.hset("inc", "field2", "a") self.assertRaises(Exception, hincrby, "inc", "field2") self.r_server.set("key", "string") self.assertRaises(Exception, self.r_server.hincrby, "key", "field1") def test_sadd(self): self.r_server = FakeRedis() self.r_server.sadd('set', 1) self.r_server.sadd('set', 2, 3, 4) self.assertEqual(self.r_server.smembers('set'), set([ '1', '2', '3', '4'])) def test_smove(self): self.r_server = FakeRedis() self.r_server.sadd('set1', 1) self.r_server.sadd('set2', 2) self.assertEqual(self.r_server.smove('set1', 'set2', '1'), True) self.assertEqual(self.r_server.smembers('set1'), set()) self.assertEqual(self.r_server.smembers('set2'), set(['1', '2'])) self.assertEqual(self.r_server.smove('set1', 'set2', '1'), False) self.assertEqual(self.r_server.smove('set2', 'set3', '1'), True) self.assertEqual(self.r_server.smembers('set2'), set(['2'])) self.assertEqual(self.r_server.smembers('set3'), set(['1'])) def test_sunion(self): self.r_server = FakeRedis() self.r_server.sadd('set1', 1) self.r_server.sadd('set2', 2) self.assertEqual(self.r_server.sunion('set1'), set(['1'])) self.assertEqual(self.r_server.sunion('set1', 'set2'), set(['1', '2'])) self.assertEqual(self.r_server.sunion('other'), set())