"""Update Accounting Period State logic tests.""" from unittest.mock import patch from abacus_state.constants.constants import ACCOUNTING_PERIOD_ACTION_NAMES from abacus_state.logic import accounting_period_state as logic from tests.utils.factories import AbacusStateFactory @patch('abacus_state.logic.accounting_period_state.AccountingRun') @patch( 'abacus_state.logic.accounting_period_state._validation_accounting_period_actions' ) @patch('abacus_state.logic.accounting_period_state.AbacusState') def test_update_accounting_period_state_success( mock_model, mock_validation, mock_model_accounting_run, mock_accounting_runs ): """Test update_accounting_period_state method.""" actions = ACCOUNTING_PERIOD_ACTION_NAMES abacus_states = [ AbacusStateFactory.create( action_name=action, action_status='complete' if index < len(actions) - 1 else 'init', ) for index, action in enumerate(actions) ] mock_put_request = {'action_status': 'complete', 'message': 'testing'} mock_model_accounting_run.return_value = mock_accounting_runs mock_validation.return_value = True mock_model.get_action_status_list.return_value = abacus_states res = logic.update_accounting_period_state( abacus_states[len(actions) - 1], **mock_put_request ) assert res.status == 200 mock_model.commit_changes.assert_called_once() @patch( 'abacus_state.logic.accounting_period_state._validation_accounting_period_actions' ) @patch('abacus_state.logic.accounting_period_state.AbacusState') def test_update_accounting_period_state_error(mock_model, mock_validation): """Test update_accounting_period_state when earlier actions are not complete.""" abacus_states = [ AbacusStateFactory.create(action_name=action, action_status='init') for _, action in enumerate(ACCOUNTING_PERIOD_ACTION_NAMES) ] mock_put_request = {'action_status': 'running', 'message': 'testing'} mock_validation.return_value = False mock_model.get_action_status_list.return_value = abacus_states res = logic.update_accounting_period_state(abacus_states[3], **mock_put_request) assert res.status == 400 mock_model.commit_changes.assert_not_called() @patch('abacus_state.logic.accounting_period_state.AccountingRun') def test_validation_accounting_period_actions( mock_model_accounting_run, mock_accounting_runs ): """Test _validation method when earlier actions are not complete.""" actions = dict() for _, action in enumerate(ACCOUNTING_PERIOD_ACTION_NAMES): actions.update({action: 'init'}) period_id = 1 mock_model_accounting_run.get_accounting_runs_by_accounting_period_id.return_value = mock_accounting_runs action_name = ACCOUNTING_PERIOD_ACTION_NAMES.APPROVE_SALES_FILES res = logic._validation_accounting_period_actions(actions, action_name, period_id) assert res is False @patch('abacus_state.logic.accounting_period_state.AccountingRun') def test_validation_accounting_period_actions_for_runs( mock_model_accounting_run, mock_accounting_runs ): """Test _validation method for close period with 'running' accounting_run status.""" actions = dict() for _, action in enumerate(ACCOUNTING_PERIOD_ACTION_NAMES): actions.update({action: 'complete'}) period_id = 1 mock_accounting_runs.append( {'accounting_run_id': 2, 'accounting_run_status': 'Running'} ) mock_model_accounting_run.get_accounting_runs_by_accounting_period_id.return_value = mock_accounting_runs action_name = ACCOUNTING_PERIOD_ACTION_NAMES.CLOSE_PERIOD res = logic._validation_accounting_period_actions(actions, action_name, period_id) assert res is False @patch('abacus_state.logic.accounting_period_state.AccountingRun') def test_validation_accounting_period_actions_success( mock_model_accounting_run, mock_accounting_runs ): """Test _validation method for close period when data is valid.""" actions = dict() for _, action in enumerate(ACCOUNTING_PERIOD_ACTION_NAMES): actions.update({action: 'complete'}) period_id = 1 mock_model_accounting_run.get_accounting_runs_by_accounting_period_id.return_value = mock_accounting_runs action_name = ACCOUNTING_PERIOD_ACTION_NAMES.CLOSE_PERIOD res = logic._validation_accounting_period_actions(actions, action_name, period_id) assert res is True