def dl_processor(initialised_blockchain_network, create_transfer_usage): transfer_usage = create_transfer_usage user = UserFactory(phone=phone(), business_usage_id=transfer_usage.id) token = Token.query.filter_by(symbol="SM1").first() create_transfer_account_for_user(user, token, 200) return DirectoryListingProcessor(user, transfer_usage)
def test_fetch_exchange_rate(mocker, test_client, init_database, initialised_blockchain_network, user_type, preferred_language, exchange_text, limit_text): user = UserFactory(preferred_language=preferred_language, phone=phone()) if user_type == "group": user.set_held_role('GROUP_ACCOUNT', 'group_account') user.is_phone_verified = True kyc = KycApplication(type='INDIVIDUAL') kyc.user = user kyc.kyc_status = 'VERIFIED' token1 = Token.query.filter_by(symbol="SM1").first() create_transfer_account_for_user(user, token1, 20000) def mock_convert(exchange_contract, from_token, to_token, from_amount): return from_amount * 1.2 mocker.patch('server.bt.get_conversion_amount', mock_convert) def mock_send_message(phone, message): assert exchange_text in message assert limit_text in message mocker.patch('server.utils.phone.send_message', mock_send_message) TokenProcessor.fetch_exchange_rate(user)
def test_exchange_token(mocker, test_client, init_database, initialised_blockchain_network, mock_sms_apis): org = OrganisationFactory(country_code='KE') sender = UserFactory(preferred_language="en", phone=phone(), first_name="Bob", last_name="Foo", default_organisation=org) sender.set_held_role('GROUP_ACCOUNT', 'group_account') token1 = Token.query.filter_by(symbol="SM1").first() create_transfer_account_for_user(sender, token1, 20000) agent = UserFactory(phone=phone(), first_name="Joe", last_name="Bar", default_organisation=org) agent.set_held_role('TOKEN_AGENT', 'token_agent') # this is under the assumption that token agent would have default token being the reserve token. is this the case? reserve = Token.query.filter_by(symbol="AUD").first() create_transfer_account_for_user(agent, reserve, 30000) def mock_convert(exchange_contract, from_token, to_token, from_amount, signing_address): return from_amount * 1.2 mocker.patch('server.bt.get_conversion_amount', mock_convert) def mock_validate(self, transfer): pass mocker.patch( 'server.utils.transfer_limits.MinimumSentLimit.validate_transfer', mock_validate) TokenProcessor.exchange_token(sender, agent, 1000) assert default_transfer_account(sender).balance == 19000 assert default_transfer_account(agent).balance == 31200 messages = mock_sms_apis assert len(messages) == 2 sent_message = messages[0] assert sent_message['phone'] == sender.phone assert 'sent a payment of 10.00 SM1 = 12.00 AUD' in sent_message['message'] received_message = messages[1] assert received_message['phone'] == agent.phone assert 'received a payment of 12.00 AUD = 10.00 SM1' in received_message[ 'message']
def test_send_token(mocker, test_client, init_database, initialised_blockchain_network, lang, mock_sms_apis, token1_symbol, token2_symbol, recipient_balance, expected_send_msg, expected_receive_msg): org = OrganisationFactory(country_code='KE') sender = UserFactory(preferred_language=lang, phone=phone(), first_name="Bob", last_name="Foo", default_organisation=org) token1 = Token.query.filter_by(symbol=token1_symbol).first() create_transfer_account_for_user(sender, token1, 20000) recipient = UserFactory(preferred_language=lang, phone=phone(), first_name="Joe", last_name="Bar", default_organisation=org) token2 = Token.query.filter_by(symbol=token2_symbol).first() create_transfer_account_for_user(recipient, token2, 30000) def mock_convert(exchange_contract, from_token, to_token, from_amount, signing_address): if from_token.symbol == "SM1": return from_amount * 1.5 else: return from_amount * 0.75 mocker.patch('server.bt.get_conversion_amount', mock_convert) TransferUsage.find_or_create("Alf DVDs") TokenProcessor.send_token(sender, recipient, 1000, "1", 1) assert default_transfer_account(sender).balance == 19000 assert default_transfer_account(recipient).balance == recipient_balance messages = mock_sms_apis assert len(messages) == 2 sent_message = messages[0] assert sent_message['phone'] == sender.phone assert expected_send_msg in sent_message['message'] received_message = messages[1] assert received_message['phone'] == recipient.phone assert expected_receive_msg in received_message['message']
def test_send_balance_sms(mocker, test_client, init_database, initialised_blockchain_network, user_type, limit, preferred_language, sample_text): user = UserFactory(preferred_language=preferred_language, phone=phone()) if user_type == "group": user.set_held_role('GROUP_ACCOUNT', 'group_account') user.is_phone_verified = True kyc = KycApplication(type='INDIVIDUAL') kyc.user = user kyc.kyc_status = 'VERIFIED' token1 = Token.query.filter_by(symbol="SM1").first() token2 = Token.query.filter_by(symbol="SM2").first() token3 = Token.query.filter_by(symbol="SM3").first() create_transfer_account_for_user(user, token1, 20000) create_transfer_account_for_user(user, token2, 35000, is_default=False) # this one should not show up in balance create_transfer_account_for_user(user, token3, 0, is_default=False, is_ghost=True) def mock_convert(exchange_contract, from_token, to_token, from_amount): if from_token.symbol == "SM1": return from_amount * 1.4124333344353534 else: return from_amount * 0.8398339289133232 mocker.patch('server.bt.get_conversion_amount', mock_convert) def mock_send_message(phone, message): assert sample_text in message assert "SM1 200" in message assert "SM2 350" in message assert "SM3" not in message if limit: assert "{:.2f} SM1 (1 SM1 = 1.41 AUD)".format(limit * 200) in message assert "{:.2f} SM2 (1 SM2 = 0.84 AUD)".format(limit * 350) in message mocker.patch('server.utils.phone.send_message', mock_send_message) TokenProcessor.send_balance_sms(user)
def create_user(cat, token, is_market_enabled): _user = UserFactory(phone=phone(), business_usage_id=cat.id, is_market_enabled=is_market_enabled) create_transfer_account_for_user(_user, token, 200) return _user
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']