class SessionManagerTestCase(TestCase): def setUp(self): self.fake_redis = FakeRedis() self.sm = SessionManager(self.fake_redis, prefix="test") def tearDown(self): self.sm.stop() self.fake_redis.teardown() def test_active_sessions(self): def get_sessions(): return sorted(self.sm.active_sessions()) def ids(): return [x[0] for x in get_sessions()] self.assertEqual(ids(), []) self.sm.create_session("u1") self.assertEqual(ids(), ["u1"]) # 10 seconds later self.sm.create_session("u2", created_at=time.time() + 10) self.assertEqual(ids(), ["u1", "u2"]) s1, s2 = get_sessions() self.assertTrue(s1[1]['created_at'] < s2[1]['created_at']) def test_schedule_session_expiry(self): self.sm.max_session_length = 60.0 self.sm.create_session("u1") def test_create_and_retrieve_session(self): session = self.sm.create_session("u1") self.assertEqual(sorted(session.keys()), ['created_at']) self.assertTrue(time.time() - float(session['created_at']) < 10.0) loaded = self.sm.load_session("u1") self.assertEqual(loaded, session) def test_save_session(self): test_session = {"foo": 5, "bar": "baz"} self.sm.create_session("u1") self.sm.save_session("u1", test_session) session = self.sm.load_session("u1") self.assertTrue(session.pop('created_at') is not None) # Redis saves & returns all session values as strings self.assertEqual(session, dict([map(str, kvs) for kvs in test_session.items()])) def test_lazy_clearing(self): self.sm.save_session('user_id', {}) self.assertEqual(list(self.sm.active_sessions()), [])
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 TestMessageStore(ApplicationTestCase): # inherits from ApplicationTestCase for .mkmsg_in and .mkmsg_out def setUp(self): self.r_server = FakeRedis() self.store = MessageStore(self.r_server, 'teststore') def tearDown(self): self.r_server.teardown() def test_batch_start(self): tag1 = ("poolA", "tag1") batch_id = self.store.batch_start([tag1]) self.assertEqual(self.store.batch_messages(batch_id), []) self.assertEqual(self.store.batch_status(batch_id), { 'ack': 0, 'delivery_report': 0, 'message': 0, 'sent': 0, }) self.assertEqual(self.store.batch_common(batch_id), {"tags": [tag1]}) self.assertEqual(self.store.tag_common(tag1), {"current_batch_id": batch_id}) def test_batch_done(self): tag1 = ("poolA", "tag1") batch_id = self.store.batch_start([tag1]) self.store.batch_done(batch_id) self.assertEqual(self.store.batch_common(batch_id), {"tags": [tag1]}) self.assertEqual(self.store.tag_common(tag1), {"current_batch_id": None}) def test_add_outbound_message(self): msg = self.mkmsg_out(content="outfoo") msg_id = msg['message_id'] self.store.add_outbound_message(msg) self.assertEqual(self.store.get_outbound_message(msg_id), msg) self.assertEqual(self.store.message_events(msg_id), []) def test_add_outbound_message_with_batch_id(self): batch_id = self.store.batch_start([("pool", "tag")]) msg = self.mkmsg_out(content="outfoo") msg_id = msg['message_id'] self.store.add_outbound_message(msg, batch_id=batch_id) self.assertEqual(self.store.get_outbound_message(msg_id), msg) self.assertEqual(self.store.message_batches(msg_id), [batch_id]) self.assertEqual(self.store.batch_messages(batch_id), [msg_id]) self.assertEqual(self.store.message_events(msg_id), []) self.assertEqual(self.store.batch_status(batch_id), { 'ack': 0, 'delivery_report': 0, 'message': 1, 'sent': 1, }) def test_add_outbound_message_with_tag(self): batch_id = self.store.batch_start([("pool", "tag")]) msg = self.mkmsg_out(content="outfoo") msg_id = msg['message_id'] self.store.add_outbound_message(msg, tag=("pool", "tag")) self.assertEqual(self.store.get_outbound_message(msg_id), msg) self.assertEqual(self.store.message_batches(msg_id), [batch_id]) self.assertEqual(self.store.batch_messages(batch_id), [msg_id]) self.assertEqual(self.store.message_events(msg_id), []) self.assertEqual(self.store.batch_status(batch_id), { 'ack': 0, 'delivery_report': 0, 'message': 1, 'sent': 1, }) def test_add_ack_event(self): batch_id = self.store.batch_start([("pool", "tag")]) msg = self.mkmsg_out(content="outfoo") msg_id = msg['message_id'] ack = TransportEvent(user_message_id=msg_id, event_type='ack', sent_message_id='xyz') ack_id = ack['event_id'] self.store.add_outbound_message(msg, batch_id=batch_id) self.store.add_event(ack) self.assertEqual(self.store.get_event(ack_id), ack) self.assertEqual(self.store.message_events(msg_id), [ack_id]) def test_add_inbound_message(self): msg = self.mkmsg_in(content="infoo") msg_id = msg['message_id'] self.store.add_inbound_message(msg) self.assertEqual(self.store.get_inbound_message(msg_id), msg) def test_add_inbound_message_with_batch_id(self): batch_id = self.store.batch_start([("pool1", "default10001")]) msg = self.mkmsg_in(content="infoo", to_addr="+1234567810001", transport_type="sms") msg_id = msg['message_id'] self.store.add_inbound_message(msg, batch_id=batch_id) self.assertEqual(self.store.get_inbound_message(msg_id), msg) self.assertEqual(self.store.batch_replies(batch_id), [msg_id]) def test_add_inbound_message_with_tag(self): batch_id = self.store.batch_start([("pool1", "default10001")]) msg = self.mkmsg_in(content="infoo", to_addr="+1234567810001", transport_type="sms") msg_id = msg['message_id'] self.store.add_inbound_message(msg, tag=("pool1", "default10001")) self.assertEqual(self.store.get_inbound_message(msg_id), msg) self.assertEqual(self.store.batch_replies(batch_id), [msg_id])
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')