def test_exchange_token(mocker, test_client, init_database, create_transfer_account_user): agent_recipient = create_transfer_account_user agent_recipient.phone = make_kenyan_phone(agent_recipient.phone) agent_recipient.set_held_role('TOKEN_AGENT', 'grassroots_token_agent') exchange_token_confirmation = UssdSessionFactory( state="exchange_token_confirmation", session_data=json.loads( "{" + f'"agent_phone": "{agent_recipient.phone}",' '"exchange_amount": "50"' + "}" ) ) user = standard_user() user.phone = phone() state_machine = KenyaUssdStateMachine(exchange_token_confirmation, user) exchange_token = mocker.MagicMock() mocker.patch('server.ussd_tasker.exchange_token', exchange_token) state_machine.feed_char("1") assert state_machine.state == "complete" exchange_token.assert_called_with(user, agent_recipient, 50)
def test_standard_recipient(test_client, init_database, standard_user): session = send_enter_recipient_state() recipient_user = UserFactory(phone=make_kenyan_phone(phone())) state_machine = KenyaUssdStateMachine(session, standard_user) state_machine.feed_char(recipient_user.phone) assert state_machine.state == "send_token_amount" assert session.get_data('recipient_phone') == recipient_user.phone
def test_agent_recipient(test_client, init_database, standard_user): session = send_enter_recipient_state() agent_recipient = UserFactory(phone=make_kenyan_phone(phone())) agent_recipient.set_held_role('TOKEN_AGENT', 'grassroots_token_agent') state_machine = KenyaUssdStateMachine(session, standard_user) state_machine.feed_char(agent_recipient.phone) assert state_machine.state == "exit_use_exchange_menu" assert session.session_data is None
def test_user_recipient(test_client, init_database): session = exchange_token_agent_number_entry_state() user = standard_user() user.phone = phone() user_recipient = UserFactory(phone=make_kenyan_phone(phone())) state_machine = UssdStateMachine(session, user) state_machine.feed_char(user_recipient.phone) assert state_machine.state == "exit_invalid_token_agent" assert session.session_data is None
def test_agent_recipient(test_client, init_database): session = exchange_token_agent_number_entry_state() user = standard_user() user.phone = phone() agent_recipient = UserFactory(phone=make_kenyan_phone(phone())) agent_recipient.set_held_role('TOKEN_AGENT', 'token_agent') state_machine = UssdStateMachine(session, user) state_machine.feed_char(agent_recipient.phone) assert state_machine.state == "exchange_token_amount_entry" assert session.get_data('agent_phone') == agent_recipient.phone
def test_send_token(mocker, test_client, init_database, create_transfer_account_user, standard_user): recipient = create_transfer_account_user recipient.phone = make_kenyan_phone(recipient.phone) send_token_confirmation = UssdSessionFactory( state="send_token_confirmation", session_data=json.loads("{" + f'"recipient_phone": "{recipient.phone}",' '"transaction_amount": "10",' '"transaction_reason_i18n": "A reason",' '"transaction_reason_id": "1"' + "}")) state_machine = KenyaUssdStateMachine(send_token_confirmation, standard_user) send_token = mocker.MagicMock() mocker.patch('server.ussd_tasker.send_token', send_token) state_machine.feed_char("1") assert state_machine.state == "complete" send_token.assert_called_with(standard_user, recipient, 10, "A reason", 1)
def test_golden_path_send_token(mocker, test_client, init_database, initialised_blockchain_network, init_seed): token = Token.query.filter_by(symbol="SM1").first() org = OrganisationFactory(country_code='KE') sender = UserFactory(preferred_language="en", phone=make_kenyan_phone(phone()), first_name="Bob", last_name="Foo", pin_hash=User.salt_hash_secret('0000'), default_organisation=org) create_transfer_account_for_user(sender, token, 4220) recipient = UserFactory(preferred_language="sw", phone=make_kenyan_phone(phone()), first_name="Joe", last_name="Bar", default_organisation=org) create_transfer_account_for_user(recipient, token, 1980) messages = [] session_id = 'ATUid_05af06225e6163ec2dc9dc9cf8bc97aa' usages = TransferUsage.query.filter_by(default=True).order_by( TransferUsage.priority).all() top_priority = usages[0] # Take the last to ensure that we're not going to simply reinforce the existing order usage = usages[-1] # do two of these transfers to ensure last is is the first shown make_payment_transfer(100, token=token, send_user=sender, receive_user=recipient, transfer_use=str(int(usage.id)), is_ghost_transfer=False, require_sender_approved=False, require_recipient_approved=False) make_payment_transfer(100, token=token, send_user=sender, receive_user=recipient, transfer_use=str(int(usage.id)), is_ghost_transfer=False, require_sender_approved=False, require_recipient_approved=False) def mock_send_message(phone, message): messages.append({'phone': phone, 'message': message}) mocker.patch(f'server.utils.phone._send_twilio_message.submit', mock_send_message) mocker.patch(f'server.utils.phone._send_messagebird_message.submit', mock_send_message) mocker.patch(f'server.utils.phone._send_at_message.submit', mock_send_message) def req(text): response = test_client.post( f'/api/v1/ussd/kenya?username={config.EXTERNAL_AUTH_USERNAME}&password={config.EXTERNAL_AUTH_PASSWORD}', headers=dict(Accept='application/json'), json={ 'sessionId': session_id, 'phoneNumber': sender.phone, 'text': text, 'serviceCode': '*384*23216#' }) assert response.status_code == 200 return response.data.decode("utf-8") def get_session(): return UssdSession.query.filter_by(session_id=session_id).first() assert get_session() is None resp = req("") assert get_session() is not None assert "CON Welcome" in resp resp = req("1") assert "CON Enter Phone" in resp resp = req(recipient.phone) assert "CON Enter Amount" in resp resp = req("12.5") assert "CON Transfer Reason" in resp assert f"1. {top_priority.translations['en']}" in resp assert "9." in resp resp = req("9") assert "CON Please specify" in resp assert "10. Show previous" in resp assert "9." not in resp resp = req("10") resp = req("4") assert "CON Please enter your PIN" in resp resp = req("0000") assert "CON Send 12.5 SM1" in resp # went to second page, should not be the first assert f"for {top_priority.translations['en']}" not in resp resp = req("1") assert "END Your request has been sent." in resp assert default_transfer_account(sender).balance == (4220 - 100 - 100 - 1250) assert default_transfer_account(recipient).balance == (1980 + 100 + 100 + 1250) assert len(messages) == 3 sent_message = messages[1] assert sent_message['phone'] == sender.phone assert f"sent a payment of 12.50 SM1 to {recipient.first_name}" in sent_message[ 'message'] received_message = messages[2] assert received_message['phone'] == recipient.phone assert f"Umepokea 12.50 SM1 kutoka kwa {sender.first_name}" in received_message[ 'message']