def test(self):
        ussd_client = self.ussd_client()
        ussd_client.send('')
        session = ussd_session(ussd_client.session_id)

        self.assertEqual(
            session['customer_status'],
            "registered"
        )

        self.assertEqual(
            session['aged_24'],
            [
                {
                    'name': "Francis Mwangi",
                    'age': 24,
                    'height': 5.4
                },
                {
                    "name": "Wambui",
                    "age": 24,
                    "height": 5.4
                }
            ]
        )

        self.assertEqual(
            session["height_54"],
            [
                {
                    'name': "Francis Mwangi",
                    'age': 24,
                    'height': 5.4
                },
                {
                    'name': 'Isaac Karanja',
                    'age': 22,
                    'height': 5.4
                },
                {
                    "name": "Wambui",
                    "age": 24,
                    "height": 5.4
                }
            ]
        )
        # test for unregistered user
        ussd_client = self.ussd_client(phone_number=404)
        ussd_client.send('')
        session = ussd_session(ussd_client.session_id)

        self.assertEqual(
            session['customer_status'],
            "not_registered"
        )
Пример #2
0
    def test(self):
        ussd_client = self.ussd_client()
        ussd_client.send('')
        session = ussd_session(ussd_client.session_id)

        self.assertEqual(
            session['customer_status'],
            "registered"
        )

        self.assertEqual(
            session['aged_24'],
            [
                {
                    'name': "Francis Mwangi",
                    'age': 24,
                    'height': 5.4
                },
                {
                    "name": "Wambui",
                    "age": 24,
                    "height": 5.4
                }
            ]
        )

        self.assertEqual(
            session["height_54"],
            [
                {
                    'name': "Francis Mwangi",
                    'age': 24,
                    'height': 5.4
                },
                {
                    'name': 'Isaac Karanja',
                    'age': 22,
                    'height': 5.4
                },
                {
                    "name": "Wambui",
                    "age": 24,
                    "height": 5.4
                }
            ]
        )
        # test for unregistered user
        ussd_client = self.ussd_client(phone_number=404)
        ussd_client.send('')
        session = ussd_session(ussd_client.session_id)

        self.assertEqual(
            session['customer_status'],
            "not_registered"
        )
Пример #3
0
    def test_showing_screen_content(self):
        ussd_client = self.ussd_client()

        self.assertEqual(
            "Enter your height\n",
            ussd_client.send('')  # dial in
        )

        self.assertEqual(
            "Enter your age\n1. back\n",
            ussd_client.send('5')  # enter height
        )

        # confirm height entered is 5 before going back
        self.assertEqual(ussd_session(ussd_client.session_id)["height"], '5')

        self.assertEqual(
            "Enter your height\n",
            ussd_client.send('1')  # enter one to go back
        )

        ussd_client.send('6')  # enter height

        self.assertEqual(
            "Your age is 24 and your height is 6.\n"
            "Enter anything to go back to the first screen\n",
            ussd_client.send('24')  # enter age
        )
Пример #4
0
    def test_if_session_is_already_posted_wont_post_again(self, mock_request):
        mock_response = JsonResponse({"balance": 250})
        mock_request.return_value = mock_response

        session = ussd_session(str(uuid4()))
        session['session_id'] = session.session_key
        session['ussd_interaction'] = []
        session['posted'] = True
        session.save()

        screen_content = {
            "type": "initial_screen",
            "next_screen": "screen_one",
            "ussd_report_session": {
                "session_key":
                "reported",
                "validate_response": [{
                    "expression":
                    "{{reported.status_code}} == 200"
                }],
                "request_conf": {
                    "url": "localhost:8006/api",
                    "method": "post",
                    "data": {
                        "ussd_interaction": "{{ussd_interaction}}",
                        "session_id": "{{session_id}}"
                    }
                },
            }
        }

        report_session(session.session_key, screen_content)
        self.assertFalse(mock_request.called)
    def test_showing_screen_content(self):
        ussd_client = self.ussd_client()

        self.assertEqual(
            "Enter your height\n",
            ussd_client.send('')  # dial in
        )

        self.assertEqual(
            "Enter your age\n1. back\n",
            ussd_client.send('5')  # enter height
        )

        # confirm height entered is 5 before going back
        self.assertEqual(
            ussd_session(ussd_client.session_id)["height"],
            '5'
        )

        self.assertEqual(
            "Enter your height\n",
            ussd_client.send('1')  # enter one to go back
        )

        ussd_client.send('6')  # enter height

        self.assertEqual(
            "Your age is 24 and your height is 6.\n"
            "Enter anything to go back to the first screen\n",
            ussd_client.send('24') # enter age
        )
Пример #6
0
def report_session(session_id, screen_content):
    # to avoid circular import
    from ussd.core import ussd_session, UssdHandlerAbstract

    logger = get_logger(__name__).bind(action="report_session_task",
                                       session_id=session_id)

    ussd_report_session_data = screen_content['ussd_report_session']

    session = ussd_session(session_id)

    if session.get('posted'):
        return

    request_conf = UssdHandlerAbstract.render_request_conf(
        session, ussd_report_session_data['request_conf'])

    UssdHandlerAbstract.make_request(
        http_request_conf=request_conf,
        response_session_key_save=ussd_report_session_data['session_key'],
        session=session,
        logger=logger)

    # check if it is the desired effect
    for expr in ussd_report_session_data['validate_response']:
        if UssdHandlerAbstract.evaluate_jija_expression(expr['expression'],
                                                        session=session):
            session['posted'] = True
            session.save()
            return
    def add_phone_number_status_in_session(ussd_client):
        session = ussd_session(ussd_client.session_id)

        session["phone_numbers"] = {
            "203": ["registered"],
            "204": ["not_registered"],
            "205": ["not_there"]
        }
        session.save()
Пример #8
0
    def add_phone_number_status_in_session(ussd_client):
        session = ussd_session(ussd_client.session_id)

        session["phone_numbers"] = {
            "203": ["registered"],
            "204": ["not_registered"],
            "205": ["not_there"]
        }
        session.save()
Пример #9
0
    def add_vegetable_list_in_session(ussd_client):
        session = ussd_session(ussd_client.session_id)
        session["vegetables_list"] = ["Sukuma", "Carrot", "Cabbage"]
        session['vegetable_quantity'] = OrderedDict()
        session['vegetable_quantity']['small'] = 50
        session['vegetable_quantity']['medium'] = 100
        session['vegetable_quantity']['large'] = 150

        session.save()
Пример #10
0
    def test_retry(self, mock_retry, mock_request):
        mock_response = JsonResponse({"balance": 250}, status=400)
        mock_request.return_value = mock_response
        ussd_client = self.get_ussd_client()
        ussd_client.send('mwas')

        # check posted flag has been set to false
        self.assertFalse(ussd_session(ussd_client.session_id)['posted'], )

        self.assertTrue(mock_retry.called)
Пример #11
0
    def add_vegetable_list_in_session(ussd_client):
        session = ussd_session(ussd_client.session_id)
        session["vegetables_list"] = [
            "Sukuma",
            "Carrot",
            "Cabbage"
        ]
        session['vegetable_quantity'] = OrderedDict()
        session['vegetable_quantity']['small'] = 50
        session['vegetable_quantity']['medium'] = 100
        session['vegetable_quantity']['large'] = 150

        session.save()
    def test_retry(self, mock_retry, mock_request):
        mock_response = JsonResponse({"balance": 250},
                                     status=400
                                     )
        mock_request.return_value = mock_response
        ussd_client = self.get_ussd_client()
        ussd_client.send('mwas')

        # check posted flag has been set to false
        self.assertFalse(
            ussd_session(ussd_client.session_id)['posted'],
        )

        self.assertTrue(mock_retry.called)
    def test_http_call(mock_request):
        mock_response = JsonResponse({"balance": 250})
        mock_request.return_value = mock_response

        session = ussd_session(str(uuid4()))
        session['session_id'] = session.session_key
        session['ussd_interaction'] = []
        session.save()

        screen_content = {
            "type": "initial_screen",
            "next_screen": "screen_one",
            "ussd_report_session": {
                "session_key": "reported",
                "retry_mechanism": {
                    "max_retries": 3
                },
                "validate_response": [
                                {"expression":
                                    "{{reported.status_code}} == 200"}
                            ],
                "request_conf": {
                    "url": "localhost:8006/api",
                    "method": "post",
                    "data": {
                        "ussd_interaction": "{{ussd_interaction}}",
                        "session_id": "{{session_id}}"
                    }
                },
                "async_parameters": {
                    "queue": "report_session",
                    "countdown": 900
                }
            }
        }

        report_session.delay(
            session.session_key,
            screen_content
        )

        mock_request.assert_called_once_with(
            url="localhost:8006/api",
            method="post",
            data=dict(
                ussd_interaction=[],
                session_id=session.session_key
            )
        )
Пример #14
0
    def test_initial_variables_are_created(self):
        ussd_client = self.get_ussd_client()

        # dial in
        ussd_client.send('')

        session = ussd_session(ussd_client.session_id)

        # check ussd variables were created
        expected_variables = {"name": "mwas", "hobbies": [],
                              "environment": "sample_variable_two"}

        for key, value in expected_variables.items():
            self.assertTrue(key in session)
            self.assertEqual(session[key], value)
Пример #15
0
    def test_initial_variables_are_created(self):
        ussd_client = self.get_ussd_client()

        # dial in
        ussd_client.send('')

        session = ussd_session(ussd_client.session_id)

        # check ussd variables were created
        expected_variables = {
            "name": "mwas",
            "hobbies": [],
            "environment": "sample_variable_two"
        }

        for key, value in expected_variables.items():
            self.assertTrue(key in session)
            self.assertEqual(session[key], value)
Пример #16
0
    def test_http_call(mock_request):
        mock_response = JsonResponse({"balance": 250})
        mock_request.return_value = mock_response

        session = ussd_session(str(uuid4()))
        session['session_id'] = session.session_key
        session['ussd_interaction'] = []
        session.save()

        screen_content = {
            "type": "initial_screen",
            "next_screen": "screen_one",
            "ussd_report_session": {
                "session_key":
                "reported",
                "retry_mechanism": {
                    "max_retries": 3
                },
                "validate_response": [{
                    "expression":
                    "{{reported.status_code}} == 200"
                }],
                "request_conf": {
                    "url": "localhost:8006/api",
                    "method": "post",
                    "data": {
                        "ussd_interaction": "{{ussd_interaction}}",
                        "session_id": "{{session_id}}"
                    }
                },
                "async_parameters": {
                    "queue": "report_session",
                    "countdown": 900
                }
            }
        }

        report_session.delay(session.session_key, screen_content)

        mock_request.assert_called_once_with(
            url="localhost:8006/api",
            method="post",
            data=dict(ussd_interaction=[], session_id=session.session_key))
Пример #17
0
def report_session(self, session_id, screen_content):
    # to avoid circular import
    from ussd.core import ussd_session, UssdHandlerAbstract

    logger = get_logger(__name__).bind(action="report_session_task",
                                       session_id=session_id)

    logger.info('start')

    ussd_report_session_data = screen_content['ussd_report_session']

    session = ussd_session(session_id)

    if session.get('posted'):
        logger.info("session_already_reported", posted=session['posted'])
        return

    request_conf = UssdHandlerAbstract.render_request_conf(
        session, ussd_report_session_data['request_conf'])

    UssdHandlerAbstract.make_request(
        http_request_conf=request_conf,
        response_session_key_save=ussd_report_session_data['session_key'],
        session=session,
        logger=logger)

    # check if it is the desired effect
    for expr in ussd_report_session_data['validate_response']:
        if UssdHandlerAbstract.evaluate_jija_expression(expr['expression'],
                                                        session=session):
            session['posted'] = True
            session.save()
            return

    if ussd_report_session_data.get('retry_mechanism'):
        try:
            self.retry(
                **screen_content['ussd_report_session']['retry_mechanism'])
        except MaxRetriesExceededError as e:
            logger.warning("report_session_error", error_message=str(e))
    def test_steps_recording(self):
        ussd_client = self.get_client()

        # dial in
        ussd_client.send('')

        # enter first name
        ussd_client.send('Francis')

        # enter second name
        ussd_client.send('Mwangi')

        # enter 1 to continue
        ussd_client.send('1')

        # press two to go back
        ussd_client.send('2')

        # enter 1 to continue
        ussd_client.send('1')

        # enter 1 to exit
        self.assertEqual(
            "This is the last screen",
            ussd_client.send('1')
        )

        now = datetime_to_string(datetime.now())
        expected_screen_interaction = [
            {
                "screen_name": "screen_one",
                "screen_text": "Enter anything\n",
                "input": "Francis",
                "start_time": now,
                "end_time": now,
                "duration": 0.0
            },
            {
                "screen_name": "screen_two",
                "screen_text": "Enter anything\n",
                "input": "Mwangi",
                "start_time": now,
                "end_time": now,
                "duration": 0.0
            },
            {
                "screen_name": "screen_three",
                "screen_text": "First input was Francis and "
                               "second input was Mwangi\n1. Continue\n",
                "input": "1",
                "start_time": now,
                "end_time": now,
                "duration": 0.0
            },
            {
                "screen_name": "screen_four",
                "screen_text": "Press 1 to exit or 2 to go back\n"
                               "1. Exit\n"
                               "2. Back\n",
                "input": "2",
                "start_time": now,
                "end_time": now,
                "duration": 0.0
            },
            {
                "screen_name": "screen_three",
                "screen_text": "First input was Francis and "
                               "second input was Mwangi\n1. Continue\n",
                "input": "1",
                "start_time": now,
                "end_time": now,
                "duration": 0.0
            },
            {
                "screen_name": "screen_four",
                "screen_text": "Press 1 to exit or 2 to go back\n"
                               "1. Exit\n"
                               "2. Back\n",
                "input": "1",
                "start_time": now,
                "end_time": now,
                "duration": 0.0
            },
            {
                "screen_name": "screen_five",
                "screen_text": "This is the last screen",
                "input": "",
                "start_time": now
            }

        ]

        session = ussd_session(ussd_client.session_id)

        self.assertEqual(
            session['ussd_interaction'],
            expected_screen_interaction
        )
Пример #19
0
    def test_steps_recording(self):
        ussd_client = self.get_client()

        # dial in
        ussd_client.send('')

        # enter first name
        ussd_client.send('Francis')

        # enter second name
        ussd_client.send('Mwangi')

        # enter 1 to continue
        ussd_client.send('1')

        # press two to go back
        ussd_client.send('2')

        # enter 1 to continue
        ussd_client.send('1')

        # enter 1 to exit
        self.assertEqual("This is the last screen", ussd_client.send('1'))

        now = datetime.now()
        expected_screen_interaction = [{
            "screen_name": "screen_one",
            "screen_text": "Enter anything\n",
            "input": "Francis",
            "start_time": now,
            "end_time": now,
            "duration": 0.0
        }, {
            "screen_name": "screen_two",
            "screen_text": "Enter anything\n",
            "input": "Mwangi",
            "start_time": now,
            "end_time": now,
            "duration": 0.0
        }, {
            "screen_name":
            "screen_three",
            "screen_text":
            "First input was Francis and "
            "second input was Mwangi\n1. Continue\n",
            "input":
            "1",
            "start_time":
            now,
            "end_time":
            now,
            "duration":
            0.0
        }, {
            "screen_name":
            "screen_four",
            "screen_text":
            "Press 1 to exit or 2 to go back\n"
            "1. Exit\n"
            "2. Back\n",
            "input":
            "2",
            "start_time":
            now,
            "end_time":
            now,
            "duration":
            0.0
        }, {
            "screen_name":
            "screen_three",
            "screen_text":
            "First input was Francis and "
            "second input was Mwangi\n1. Continue\n",
            "input":
            "1",
            "start_time":
            now,
            "end_time":
            now,
            "duration":
            0.0
        }, {
            "screen_name":
            "screen_four",
            "screen_text":
            "Press 1 to exit or 2 to go back\n"
            "1. Exit\n"
            "2. Back\n",
            "input":
            "1",
            "start_time":
            now,
            "end_time":
            now,
            "duration":
            0.0
        }, {
            "screen_name": "screen_five",
            "screen_text": "This is the last screen",
            "input": "",
            "start_time": now
        }]

        session = ussd_session(ussd_client.session_id)

        self.assertEqual(session['ussd_interaction'],
                         expected_screen_interaction)