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" )
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" )
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 )
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 )
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()
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()
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 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 ) )
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)
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)
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))
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 )
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)