cic-stack/apps/cic-ussd/tests/cic_ussd/state_machine/logic/test_transaction_logic.py

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'