126 lines
6.2 KiB
Python
126 lines
6.2 KiB
Python
# standard imports
|
|
import json
|
|
|
|
# external imports
|
|
import pytest
|
|
|
|
from cic_types.models.person import Person, get_contact_data_from_vcard
|
|
|
|
# local imports
|
|
from cic_ussd.cache import get_cached_data
|
|
from cic_ussd.account.maps import gender
|
|
from cic_ussd.account.metadata import get_cached_preferred_language
|
|
from cic_ussd.db.enum import AccountStatus
|
|
from cic_ussd.state_machine.logic.account import (edit_user_metadata_attribute,
|
|
parse_gender,
|
|
parse_person_metadata,
|
|
save_complete_person_metadata,
|
|
save_metadata_attribute_to_session_data,
|
|
update_account_status_to_active)
|
|
from cic_ussd.translation import translation_for
|
|
|
|
|
|
# test imports
|
|
|
|
|
|
@pytest.mark.parametrize('user_input', [
|
|
'1',
|
|
'2',
|
|
'3'
|
|
])
|
|
def test_parse_gender(activated_account, cache_preferences, user_input):
|
|
preferred_language = get_cached_preferred_language(activated_account.blockchain_address)
|
|
parsed_gender = parse_gender(activated_account, user_input)
|
|
r_user_input = gender().get(user_input)
|
|
assert parsed_gender == translation_for(f'helpers.{r_user_input}', preferred_language)
|
|
|
|
|
|
def test_parse_person_metadata(activated_account, load_chain_spec, raw_person_metadata):
|
|
parsed_user_metadata = parse_person_metadata(activated_account, raw_person_metadata)
|
|
person = Person()
|
|
user_metadata = person.deserialize(parsed_user_metadata)
|
|
assert parsed_user_metadata == user_metadata.serialize()
|
|
|
|
|
|
@pytest.mark.parametrize("current_state, expected_key, expected_result, user_input", [
|
|
("enter_given_name", "given_name", "John", "John"),
|
|
("enter_family_name", "family_name", "Doe", "Doe"),
|
|
("enter_location", "location", "Kangemi", "Kangemi"),
|
|
("enter_products", "products", "Mandazi", "Mandazi"),
|
|
])
|
|
def test_save_metadata_attribute_to_session_data(activated_account,
|
|
cached_ussd_session,
|
|
celery_session_worker,
|
|
current_state,
|
|
expected_key,
|
|
expected_result,
|
|
init_cache,
|
|
init_database,
|
|
load_chain_spec,
|
|
set_locale_files,
|
|
persisted_ussd_session,
|
|
user_input):
|
|
persisted_ussd_session.state = current_state
|
|
ussd_session = persisted_ussd_session.to_json()
|
|
state_machine_data = (user_input, ussd_session, activated_account, init_database)
|
|
ussd_session_in_cache = get_cached_data(cached_ussd_session.external_session_id)
|
|
ussd_session_in_cache = json.loads(ussd_session_in_cache)
|
|
assert ussd_session_in_cache.get('data') == {}
|
|
ussd_session['state'] = current_state
|
|
save_metadata_attribute_to_session_data(state_machine_data)
|
|
cached_ussd_session = get_cached_data(cached_ussd_session.external_session_id)
|
|
cached_ussd_session = json.loads(cached_ussd_session)
|
|
assert cached_ussd_session.get('data')[expected_key] == expected_result
|
|
|
|
|
|
def test_update_account_status_to_active(generic_ussd_session, init_database, pending_account):
|
|
state_machine_data = ('', generic_ussd_session, pending_account, init_database)
|
|
assert pending_account.get_status(init_database) == AccountStatus.PENDING.name
|
|
update_account_status_to_active(state_machine_data)
|
|
assert pending_account.get_status(init_database) == AccountStatus.ACTIVE.name
|
|
|
|
|
|
def test_save_complete_person_metadata(activated_account,
|
|
cached_ussd_session,
|
|
celery_session_worker,
|
|
init_database,
|
|
load_chain_spec,
|
|
mocker,
|
|
person_metadata,
|
|
raw_person_metadata):
|
|
ussd_session = get_cached_data(cached_ussd_session.external_session_id)
|
|
ussd_session = json.loads(ussd_session)
|
|
ussd_session['data'] = raw_person_metadata
|
|
metadata = parse_person_metadata(activated_account, raw_person_metadata)
|
|
state_machine_data = ('', ussd_session, activated_account, init_database)
|
|
mocked_create_metadata_task = mocker.patch('cic_ussd.tasks.metadata.create_person_metadata.apply_async')
|
|
save_complete_person_metadata(state_machine_data=state_machine_data)
|
|
mocked_create_metadata_task.assert_called_with(
|
|
(activated_account.blockchain_address, metadata), {}, queue='cic-ussd')
|
|
|
|
|
|
def test_edit_user_metadata_attribute(activated_account,
|
|
cache_person_metadata,
|
|
cached_ussd_session,
|
|
celery_session_worker,
|
|
init_cache,
|
|
init_database,
|
|
load_chain_spec,
|
|
mocker,
|
|
person_metadata):
|
|
ussd_session = get_cached_data(cached_ussd_session.external_session_id)
|
|
ussd_session = json.loads(ussd_session)
|
|
assert person_metadata['location']['area_name'] == 'kayaba'
|
|
ussd_session['data'] = {'location': 'nairobi'}
|
|
contact_data = get_contact_data_from_vcard(person_metadata.get('vcard'))
|
|
phone_number = contact_data.get('tel')
|
|
activated_account.phone_number = phone_number
|
|
state_machine_data = ('', ussd_session, activated_account, init_database)
|
|
mocked_edit_metadata = mocker.patch('cic_ussd.tasks.metadata.create_person_metadata.apply_async')
|
|
edit_user_metadata_attribute(state_machine_data)
|
|
person_metadata['date_registered'] = int(activated_account.created.replace().timestamp())
|
|
person_metadata['location']['area_name'] = 'nairobi'
|
|
mocked_edit_metadata.assert_called_with(
|
|
(activated_account.blockchain_address, person_metadata), {}, queue='cic-ussd')
|
|
|