"""Unit tests for account_payee abacus_state logic.""" from unittest.mock import patch import pytest from marshmallow import ValidationError from abacus_state.constants.constants import ( ACCOUNT_PAYEE_ACTION_NAMES, ACTION_STATUSES, PARENT_TABLE_NAMES, ) from abacus_state.logic import account_payee_state as logic from tests.utils.factories import AbacusStateFactory @patch('abacus_state.logic.account_payee_state._validate_status_update') @patch('abacus_state.logic.account_payee_state.AbacusState') def test_update_account_payee_state_success(mock_model, mock_validation): """Test successfully updating account_payee abacus_state.""" abacus_state = AbacusStateFactory.create( action_name=ACCOUNT_PAYEE_ACTION_NAMES.PAYMENT_ELIGIBILITY, action_status=ACTION_STATUSES.INIT, parent_table_name=PARENT_TABLE_NAMES.ACCOUNT_PAYEE, parent_table_id=123, ) mock_model.commit_changes.return_value = None mock_validation.return_value = None mock_put_request = { 'action_status': ACTION_STATUSES.REJECTED, 'message': 'a very real reason', 'current_status': ACTION_STATUSES.INIT, } res = logic.update_account_payee_state(abacus_state, **mock_put_request) assert res.status == 200 mock_model.commit_changes.assert_called_once() mock_validation.assert_called_once_with( abacus_state.action_name, mock_put_request.get('action_status'), mock_put_request.get('message'), ) @patch('abacus_state.logic.account_payee_state._validate_status_update') @patch('abacus_state.logic.account_payee_state.AbacusState') def test_update_account_payee_state_failure(mock_model, mock_validation): """Test failure updating account_payee abacus_state.""" abacus_state = AbacusStateFactory.create( action_name=ACCOUNT_PAYEE_ACTION_NAMES.PAYMENT_ELIGIBILITY, action_status=ACTION_STATUSES.INIT, parent_table_name=PARENT_TABLE_NAMES.ACCOUNT_PAYEE, parent_table_id=123, ) mock_model.commit_changes.return_value = None mock_validation.side_effect = ValidationError('nope') mock_put_request = { 'action_status': ACTION_STATUSES.REJECTED, 'message': None, 'current_status': ACTION_STATUSES.INIT, } res = logic.update_account_payee_state(abacus_state, **mock_put_request) assert res.status == 400 mock_model.commit_changes.assert_not_called() mock_validation.assert_called_once_with( abacus_state.action_name, mock_put_request.get('action_status'), mock_put_request.get('message'), ) def test_validate_status_update_tax_eligibility_status(): """Test a validation for tax_eligibility status.""" action_name = ACCOUNT_PAYEE_ACTION_NAMES.TAX_ELIGIBILITY logic._validate_status_update(action_name, ACTION_STATUSES.INIT, None) logic._validate_status_update(action_name, ACTION_STATUSES.RUNNING, None) logic._validate_status_update(action_name, ACTION_STATUSES.COMPLETE, None) logic._validate_status_update(action_name, ACTION_STATUSES.REJECTED, None) with pytest.raises(ValidationError): logic._validate_status_update(action_name, ACTION_STATUSES.APPROVED, None) def test_validate_status_update_invalid_payment_eligibility_status(): """Test error is raised when payment_eligibility is rejected with no message.""" action_name = ACCOUNT_PAYEE_ACTION_NAMES.PAYMENT_ELIGIBILITY action_status = ACTION_STATUSES.REJECTED message = None with pytest.raises(ValidationError): logic._validate_status_update(action_name, action_status, message) def test_validate_status_update_valid(): """Test no validation error is raised with update is valid.""" action_name = ACCOUNT_PAYEE_ACTION_NAMES.TAX_ELIGIBILITY action_status = ACTION_STATUSES.COMPLETE message = None res = logic._validate_status_update(action_name, action_status, message) assert res is None