"""Functional tests for account_payee abacus_states.""" import pytest from abacus_common_logic.utils import dates from abacus_state.constants import constants, error from tests.utils.factories import AbacusStateFactory def test_create_account_payee_states(fixture_client): """Test creating account_payee states by parent_table.""" parent_table_name = 'account-payee' parent_table_id = 123 res = fixture_client.post(f'abacus-states/{parent_table_name}/{parent_table_id}') assert res.status_code == 201 assert len(res.json) == len(constants.ACCOUNT_PAYEE_ACTION_NAMES) def test_get_account_payee_states(fixture_client): """Test getting list of account_payee states.""" payment_eligibility = AbacusStateFactory.create( action_name=constants.ACCOUNT_PAYEE_ACTION_NAMES.PAYMENT_ELIGIBILITY, action_status=constants.ACTION_STATUSES.INIT, parent_table_name=constants.PARENT_TABLE_NAMES.ACCOUNT_PAYEE, parent_table_id=123, ) tax_eligibility = AbacusStateFactory.create( action_name=constants.ACCOUNT_PAYEE_ACTION_NAMES.TAX_ELIGIBILITY, action_status=constants.ACTION_STATUSES.INIT, parent_table_name=constants.PARENT_TABLE_NAMES.ACCOUNT_PAYEE, parent_table_id=123, ) res = fixture_client.get('/abacus-state/account-payee/123') assert res.status_code == 200 assert len(res.json) == 2 assert res.json == [ { 'abacus_state_id': payment_eligibility.abacus_state_id, 'action_name': payment_eligibility.action_name, 'action_status': payment_eligibility.action_status, 'message': None, 'parent_table_name': payment_eligibility.parent_table_name, 'parent_table_id': payment_eligibility.parent_table_id, 'created_at': dates.safe_format_datetime(payment_eligibility.created_at), 'created_by': payment_eligibility.created_by, 'last_modified': dates.safe_format_datetime( payment_eligibility.last_modified ), 'last_modified_by': payment_eligibility.last_modified_by, }, { 'abacus_state_id': tax_eligibility.abacus_state_id, 'action_name': tax_eligibility.action_name, 'action_status': tax_eligibility.action_status, 'message': None, 'parent_table_name': payment_eligibility.parent_table_name, 'parent_table_id': payment_eligibility.parent_table_id, 'created_at': dates.safe_format_datetime(tax_eligibility.created_at), 'created_by': tax_eligibility.created_by, 'last_modified': dates.safe_format_datetime(tax_eligibility.last_modified), 'last_modified_by': tax_eligibility.last_modified_by, }, ] def test_update_account_payee_payment_eligibility_success(fixture_client): """Test successfully updating account_payee payment_eligibility state.""" abacus_state = AbacusStateFactory.create( action_name=constants.ACCOUNT_PAYEE_ACTION_NAMES.PAYMENT_ELIGIBILITY, action_status=constants.ACTION_STATUSES.INIT, parent_table_name=constants.PARENT_TABLE_NAMES.ACCOUNT_PAYEE, parent_table_id=123, ) params = {'action_status': constants.ACTION_STATUSES.RUNNING} res = fixture_client.put( f'/abacus-state/{abacus_state.abacus_state_id}', json=params ) assert res.status_code == 200 assert res.json == { 'abacus_state_id': abacus_state.abacus_state_id, 'action_name': abacus_state.action_name, 'action_status': params.get('action_status'), 'message': None, 'parent_table_name': abacus_state.parent_table_name, 'parent_table_id': abacus_state.parent_table_id, 'created_at': dates.safe_format_datetime(abacus_state.created_at), 'created_by': 'default_user_id', 'last_modified': dates.safe_format_datetime(abacus_state.last_modified), 'last_modified_by': 'default_user_id', } assert abacus_state.action_status == constants.ACTION_STATUSES.RUNNING def test_update_account_payee_payment_eligibility_failure(fixture_client): """Test error is returned when updating account_payee payment_eligibility state.""" abacus_state = AbacusStateFactory.create( action_name=constants.ACCOUNT_PAYEE_ACTION_NAMES.PAYMENT_ELIGIBILITY, action_status=constants.ACTION_STATUSES.INIT, parent_table_name=constants.PARENT_TABLE_NAMES.ACCOUNT_PAYEE, parent_table_id=123, ) params = {'action_status': constants.ACTION_STATUSES.REJECTED} res = fixture_client.put( f'/abacus-state/{abacus_state.abacus_state_id}', json=params ) assert res.status_code == 400 assert res.json['message'] == error.ERROR_MESSAGE_IS_REQUIRED.format( action_status=constants.ACTION_STATUSES.REJECTED ) assert abacus_state.action_status != constants.ACTION_STATUSES.REJECTED @pytest.mark.parametrize( 'allowed_status', ( constants.ACTION_STATUSES.RUNNING, constants.ACTION_STATUSES.REJECTED, constants.ACTION_STATUSES.COMPLETE, ), ) def test_update_account_payee_tax_eligibility_success(fixture_client, allowed_status): """Test successfully updating account_payee tax_eligibility state.""" abacus_state = AbacusStateFactory.create( action_name=constants.ACCOUNT_PAYEE_ACTION_NAMES.TAX_ELIGIBILITY, action_status=constants.ACTION_STATUSES.INIT, parent_table_name=constants.PARENT_TABLE_NAMES.ACCOUNT_PAYEE, parent_table_id=123, ) params = {'action_status': allowed_status} res = fixture_client.put( f'/abacus-state/{abacus_state.abacus_state_id}', json=params ) assert res.status_code == 200 assert res.json == { 'abacus_state_id': abacus_state.abacus_state_id, 'action_name': abacus_state.action_name, 'action_status': allowed_status, 'message': None, 'parent_table_name': abacus_state.parent_table_name, 'parent_table_id': abacus_state.parent_table_id, 'created_at': dates.safe_format_datetime(abacus_state.created_at), 'created_by': abacus_state.created_by, 'last_modified': dates.safe_format_datetime(abacus_state.last_modified), 'last_modified_by': abacus_state.last_modified_by, } assert abacus_state.action_status == allowed_status def test_update_account_payee_tax_eligibility_failure(fixture_client): """Test error is returned when updating account_payee tax_eligibility state.""" abacus_state = AbacusStateFactory.create( action_name=constants.ACCOUNT_PAYEE_ACTION_NAMES.TAX_ELIGIBILITY, action_status=constants.ACTION_STATUSES.INIT, parent_table_name=constants.PARENT_TABLE_NAMES.ACCOUNT_PAYEE, parent_table_id=123, ) params = {'action_status': constants.ACTION_STATUSES.APPROVED} res = fixture_client.put( f'/abacus-state/{abacus_state.abacus_state_id}', json=params ) assert res.status_code == 400 assert res.json['message'] == error.ERROR_INVALID_ACTION_STATUS.format( action_name=abacus_state.action_name, action_status=params.get('action_status'), parent_table_name=abacus_state.parent_table_name, ) assert abacus_state.action_status != constants.ACTION_STATUSES.APPROVED