Ejemplo n.º 1
0
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()), [])
Ejemplo n.º 2
0
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')
Ejemplo n.º 3
0
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])
Ejemplo n.º 4
0
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])
Ejemplo n.º 5
0
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')