"""Tests for updating statement period adjustment file state.""" from unittest.mock import patch from abacus_state.constants.constants import ( AUTO_GENERATED_STATEMENT_PERIOD_ADJUSTMENT_FILE_ACTION_NAMES, STATEMENT_PERIOD_ADJUSTMENT_FILE_ACTION_NAMES, ) from abacus_state.constants.error import ( ERROR_ALREADY_RUNNING, ERROR_PREVIOUS_ACTIONS_STATUS, ) from abacus_state.logic import statement_period_adjustment_file_state from tests.utils.factories import AbacusStateFactory LOGIC_IMPORT_PATH = 'abacus_state.logic.statement_period_adjustment_file_state' @patch(f'{LOGIC_IMPORT_PATH}.AbacusState') def test_update_statement_period_adjustment_file_state(mock_model, request_engine): """Test update_statement_period_adjustment_file_state method.""" parent_table_id = 123 abacus_state = AbacusStateFactory.create( action_name=STATEMENT_PERIOD_ADJUSTMENT_FILE_ACTION_NAMES.UPLOAD_FILE, action_status='init', parent_table_name='statement_period_adjustment_file', parent_table_id=parent_table_id, ) mock_put_request = {'action_status': 'complete', 'message': 'testing'} res = statement_period_adjustment_file_state.update_statement_period_adjustment_file_state( abacus_state, **mock_put_request ) assert res.status == 200 mock_model.commit_changes.assert_called_once() @patch(f'{LOGIC_IMPORT_PATH}.AbacusState') def test_update_statement_period_adjustment_file_state_error(mock_model): """Test update_statement_period_adjustment_file_state method. Throws an error when the approve_file action state is set to complete while upload_file is in the 'init' state. """ parent_table_id = 123 abacus_states = [ AbacusStateFactory.create( action_name=action_name, action_status='init', parent_table_name='statement_period_adjustment_file', parent_table_id=parent_table_id, ) for action_name in list(STATEMENT_PERIOD_ADJUSTMENT_FILE_ACTION_NAMES) ] mock_put_request = {'action_status': 'complete', 'message': 'testing'} res = statement_period_adjustment_file_state.update_statement_period_adjustment_file_state( abacus_states[1], **mock_put_request ) assert res.status == 400 assert res.errors['message'] == ERROR_PREVIOUS_ACTIONS_STATUS.format( abacus_states[1].action_name ) mock_model.commit_changes.assert_not_called() @patch(f'{LOGIC_IMPORT_PATH}.AbacusState') def test_update_statement_period_adjustment_file_state_status_error(mock_model): """Test update_statement_period_adjustment_file_state method for status error. Throws an error when the action status is already 'running', while trying to update to 'running'. """ parent_table_id = 123 abacus_state = AbacusStateFactory.create( action_name=STATEMENT_PERIOD_ADJUSTMENT_FILE_ACTION_NAMES.UPLOAD_FILE, action_status='running', parent_table_name='statement_period_adjustment_file', parent_table_id=parent_table_id, ) mock_put_request = {'action_status': 'running', 'message': 'testing'} res = statement_period_adjustment_file_state.update_statement_period_adjustment_file_state( abacus_state, **mock_put_request ) assert res.status == 400 assert res.errors['message'] == ERROR_ALREADY_RUNNING mock_model.commit_changes.assert_not_called() @patch(f'{LOGIC_IMPORT_PATH}.StatementPeriodAdjustmentFile') @patch(f'{LOGIC_IMPORT_PATH}.AbacusState') @patch(f'{LOGIC_IMPORT_PATH}.is_abacus_flowthrough_automation_enabled') def test_update_generate_statement_period_adjustment_file_state( mock_feature_enabled, mock_state_model, mock_adjustment_file_model ): """Test update_statement_period_adjustment_file_state method to auto generate adjustments.""" parent_table_id = 123 mock_feature_enabled.return_value = True mock_adjustment_file_model.get_statement_period_adjustment_file.return_value = { 'batch_type': 'auto' } abacus_state = AbacusStateFactory.create( action_name=AUTO_GENERATED_STATEMENT_PERIOD_ADJUSTMENT_FILE_ACTION_NAMES.UPLOAD_FILE, action_status='init', parent_table_name='statement_period_adjustment_file', parent_table_id=parent_table_id, ) mock_put_request = {'action_status': 'complete', 'message': 'testing'} res = statement_period_adjustment_file_state.update_statement_period_adjustment_file_state( abacus_state, **mock_put_request ) assert res.status == 200 mock_adjustment_file_model.get_statement_period_adjustment_file.assert_called_once_with( parent_table_id ) mock_state_model.commit_changes.assert_called_once() @patch(f'{LOGIC_IMPORT_PATH}.StatementPeriodAdjustmentFile') @patch(f'{LOGIC_IMPORT_PATH}.AbacusState') @patch(f'{LOGIC_IMPORT_PATH}.is_abacus_flowthrough_automation_enabled') def test_update_generate_statement_period_adjustment_file_state_error( mock_feature_enabled, mock_state_model, mock_adjustment_file_model ): """Test update_statement_period_adjustment_file_state method to auto generate adjustments. Throws an error if earlier step is not completed. """ parent_table_id = 123 mock_feature_enabled.return_value = True mock_adjustment_file_model.get_statement_period_adjustment_file.return_value = { 'batch_type': 'auto' } actions = [ AUTO_GENERATED_STATEMENT_PERIOD_ADJUSTMENT_FILE_ACTION_NAMES.UPLOAD_FILE, AUTO_GENERATED_STATEMENT_PERIOD_ADJUSTMENT_FILE_ACTION_NAMES.VALIDATE_FILE, ] abacus_states = [ AbacusStateFactory.create( action_name=action, action_status='init', parent_table_name='statement_period_adjustment_file', parent_table_id=parent_table_id, ) for action in actions ] mock_put_request = {'action_status': 'complete', 'message': 'testing'} res = statement_period_adjustment_file_state.update_statement_period_adjustment_file_state( abacus_states[1], **mock_put_request ) assert res.status == 400 assert res.errors['message'] == ERROR_PREVIOUS_ACTIONS_STATUS.format( abacus_states[1].action_name ) mock_adjustment_file_model.get_statement_period_adjustment_file.assert_called_once_with( parent_table_id ) mock_state_model.commit_changes.assert_not_called()