116 lines
5.9 KiB
Python
116 lines
5.9 KiB
Python
# standard imports
|
|
import json
|
|
|
|
# external imports
|
|
import pytest
|
|
|
|
# local imports
|
|
from cic_ussd.account.metadata import get_cached_preferred_language
|
|
from cic_ussd.account.tokens import get_active_token_symbol, get_cached_token_data
|
|
from cic_ussd.account.transaction import to_wei
|
|
from cic_ussd.cache import get_cached_data
|
|
from cic_ussd.state_machine.logic.transaction import (is_valid_recipient,
|
|
is_valid_transaction_amount,
|
|
has_sufficient_balance,
|
|
process_transaction_request,
|
|
retrieve_recipient_metadata,
|
|
save_recipient_phone_to_session_data,
|
|
save_transaction_amount_to_session_data)
|
|
|
|
# test imports
|
|
|
|
|
|
def test_is_valid_recipient(activated_account,
|
|
generic_ussd_session,
|
|
init_database,
|
|
load_e164_region,
|
|
pending_account,
|
|
valid_recipient):
|
|
state_machine = ('0112365478', generic_ussd_session, valid_recipient, init_database)
|
|
assert is_valid_recipient(state_machine) is False
|
|
state_machine = (valid_recipient.phone_number, generic_ussd_session, activated_account, init_database)
|
|
assert is_valid_recipient(state_machine) is True
|
|
|
|
|
|
@pytest.mark.parametrize("amount, expected_result", [
|
|
('50', True),
|
|
('', False)
|
|
])
|
|
def test_is_valid_transaction_amount(activated_account, amount, expected_result, generic_ussd_session, init_database):
|
|
state_machine_data = (amount, generic_ussd_session, activated_account, init_database)
|
|
assert is_valid_transaction_amount(state_machine_data) is expected_result
|
|
|
|
|
|
@pytest.mark.parametrize("value, expected_result", [
|
|
('45', True),
|
|
('75', False)
|
|
])
|
|
def test_has_sufficient_balance(activated_account,
|
|
cache_balances,
|
|
cache_token_data,
|
|
expected_result,
|
|
generic_ussd_session,
|
|
init_database,
|
|
set_active_token,
|
|
value):
|
|
state_machine_data = (value, generic_ussd_session, activated_account, init_database)
|
|
assert has_sufficient_balance(state_machine_data=state_machine_data) == expected_result
|
|
|
|
|
|
def test_process_transaction_request(activated_account,
|
|
cache_token_data,
|
|
cached_ussd_session,
|
|
celery_session_worker,
|
|
init_cache,
|
|
init_database,
|
|
load_chain_spec,
|
|
load_config,
|
|
mock_transfer_api,
|
|
set_active_token,
|
|
valid_recipient):
|
|
blockchain_address = activated_account.blockchain_address
|
|
token_symbol = get_active_token_symbol(blockchain_address)
|
|
token_data = get_cached_token_data(blockchain_address, token_symbol)
|
|
decimals = token_data.get("decimals")
|
|
cached_ussd_session.set_data('recipient_phone_number', valid_recipient.phone_number)
|
|
cached_ussd_session.set_data('transaction_amount', '50')
|
|
ussd_session = get_cached_data(cached_ussd_session.external_session_id)
|
|
ussd_session = json.loads(ussd_session)
|
|
state_machine_data = ('', ussd_session, activated_account, init_database)
|
|
process_transaction_request(state_machine_data)
|
|
assert mock_transfer_api['from_address'] == activated_account.blockchain_address
|
|
assert mock_transfer_api['to_address'] == valid_recipient.blockchain_address
|
|
assert mock_transfer_api['value'] == to_wei(decimals, 50)
|
|
assert mock_transfer_api['token_symbol'] == load_config.get('TEST_TOKEN_SYMBOL')
|
|
|
|
|
|
def test_retrieve_recipient_metadata(activated_account,
|
|
generic_ussd_session,
|
|
init_database,
|
|
load_chain_spec,
|
|
mocker,
|
|
valid_recipient):
|
|
state_machine_data = (valid_recipient.phone_number, generic_ussd_session, activated_account, init_database)
|
|
mocked_query_metadata = mocker.patch('cic_ussd.tasks.metadata.query_person_metadata.apply_async')
|
|
retrieve_recipient_metadata(state_machine_data)
|
|
mocked_query_metadata.assert_called_with((valid_recipient.blockchain_address, ), {}, queue='cic-ussd')
|
|
|
|
|
|
def test_transaction_information_to_session_data(activated_account,
|
|
cached_ussd_session,
|
|
init_cache,
|
|
init_database,
|
|
load_e164_region,
|
|
valid_recipient):
|
|
assert cached_ussd_session.to_json()['data'] == {}
|
|
state_machine_data = (valid_recipient.phone_number, cached_ussd_session.to_json(), activated_account, init_database)
|
|
save_recipient_phone_to_session_data(state_machine_data)
|
|
ussd_session = get_cached_data(cached_ussd_session.external_session_id)
|
|
ussd_session = json.loads(ussd_session)
|
|
assert ussd_session.get('data')['recipient_phone_number'] == valid_recipient.phone_number
|
|
state_machine_data = ('25', cached_ussd_session.to_json(), activated_account, init_database)
|
|
save_transaction_amount_to_session_data(state_machine_data)
|
|
ussd_session = get_cached_data(cached_ussd_session.external_session_id)
|
|
ussd_session = json.loads(ussd_session)
|
|
assert ussd_session.get('data')['transaction_amount'] == '25'
|