Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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)
Exemplo n.º 7
0
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']