cic-stack/apps/cic-ussd/tests/cic_ussd/db/models/test_account.py

97 lines
3.8 KiB
Python

# standard imports
import json
# external imports
import pytest
from cic_types.models.person import get_contact_data_from_vcard
# local imports
from cic_ussd.account.chain import Chain
from cic_ussd.cache import get_cached_data
from cic_ussd.db.enum import AccountStatus
from cic_ussd.db.models.account import Account, create, cache_creation_task_uuid
from cic_ussd.db.models.task_tracker import TaskTracker
# test imports
from tests.helpers.accounts import blockchain_address, phone_number
def test_account(init_database, set_fernet_key):
address = blockchain_address()
phone = phone_number()
account = Account(address, phone)
account.create_password('0000')
account.activate_account()
init_database.add(account)
init_database.commit()
account = init_database.query(Account).get(1)
assert account.blockchain_address == address
assert account.phone_number == phone
assert account.failed_pin_attempts == 0
assert account.verify_password('0000') is True
assert account.get_status(init_database) == AccountStatus.ACTIVE.name
def test_account_repr(activated_account):
assert repr(activated_account) == f'<Account: {activated_account.blockchain_address}>'
def test_account_statuses(init_database, pending_account):
assert pending_account.get_status(init_database) == AccountStatus.PENDING.name
pending_account.create_password('1111')
pending_account.activate_account()
init_database.add(pending_account)
init_database.commit()
assert pending_account.get_status(init_database) == AccountStatus.ACTIVE.name
pending_account.failed_pin_attempts = 3
assert pending_account.get_status(init_database) == AccountStatus.LOCKED.name
pending_account.reset_pin(init_database)
assert pending_account.get_status(init_database) == AccountStatus.RESET.name
pending_account.activate_account()
assert pending_account.get_status(init_database) == AccountStatus.ACTIVE.name
def test_get_by_phone_number(activated_account, init_database):
account = Account.get_by_phone_number(activated_account.phone_number, init_database)
assert account == activated_account
def test_has_preferred_language(activated_account, cache_preferences):
assert activated_account.has_preferred_language() is True
def test_lacks_preferred_language(activated_account):
assert activated_account.has_preferred_language() is False
def test_has_valid_pin(activated_account, init_database, pending_account):
assert activated_account.has_valid_pin(init_database) is True
assert pending_account.has_valid_pin(init_database) is False
def test_pin_is_blocked(activated_account, init_database):
assert activated_account.pin_is_blocked(init_database) is False
activated_account.failed_pin_attempts = 3
init_database.add(activated_account)
init_database.commit()
assert activated_account.pin_is_blocked(init_database) is True
def test_standard_metadata_id(activated_account, cache_person_metadata, pending_account, person_metadata):
contact_information = get_contact_data_from_vcard(person_metadata.get('vcard'))
given_name = contact_information.get('given')
family_name = contact_information.get('family')
phone_number = contact_information.get('tel')
parsed_account_metadata = f'{given_name} {family_name} {phone_number}'
assert activated_account.standard_metadata_id() == parsed_account_metadata
assert pending_account.standard_metadata_id() == pending_account.phone_number
def test_account_create(init_cache, init_database, load_chain_spec, mock_account_creation_task_result, task_uuid):
chain_str = Chain.spec.__str__()
create(chain_str, phone_number(), init_database, 'en')
assert len(init_database.query(TaskTracker).all()) == 1
account_creation_data = get_cached_data(task_uuid)
assert json.loads(account_creation_data).get('status') == AccountStatus.PENDING.name