"""Test Abacus State functional.""" from abacus_common_logic.utils import dates from abacus_state.constants.constants import ( ACTION_STATUSES, PARENT_TABLE_NAMES, PAYMENT_GROUP_PAYMENT_ACCOUNT_ACTION_NAMES, PAYMENT_GROUP_PAYMENT_ACTION_NAMES as ACTION_NAMES, ) from abacus_state.constants.error import ERROR_PREVIOUS_ACTIONS_STATUS from abacus_state.logic.payment_group_payment_state import ORDERED_ACTIONS from tests.utils.factories import AbacusStateFactory def test_create_abacus_states_for_payments(fixture_client): """Test new abacus states creation new flow.""" post_data = [ { 'action_name': action_name, 'parent_table_name': 'payment_group_payment', 'parent_table_id': '1', } for action_name in list(ACTION_NAMES) ] res = fixture_client.post('/abacus-states', json=post_data) assert res.status_code == 201 created_actions = res.json assert len(created_actions) == len(ACTION_NAMES) assert all([item['action_status'] == 'init' for item in created_actions]) sorted_action_names = [ item['action_name'] for item in sorted(created_actions, key=lambda x: x['abacus_state_id']) ] assert sorted_action_names == ORDERED_ACTIONS def test_get_abacus_state_for_payments(fixture_client): """Test endpoint passes request body to logic layer.""" generate_state = AbacusStateFactory.create( parent_table_name='payment_group_payment', parent_table_id=1, action_name=ACTION_NAMES.GENERATE_PAYMENTS, action_status='complete', ) send_state = AbacusStateFactory.create( parent_table_name='payment_group_payment', parent_table_id=1, action_name=ACTION_NAMES.SEND_PAYMENTS, action_status='init', ) res = fixture_client.get('/abacus-state/payment-group-payment/1') assert res.status_code == 200 assert sorted(res.json, key=lambda x: x['abacus_state_id']) == [ { 'action_name': 'generate_payments', 'action_status': 'complete', 'abacus_state_id': 1, 'message': None, 'parent_table_name': 'payment_group_payment', 'parent_table_id': 1, 'created_at': dates.safe_format_datetime(generate_state.created_at), 'created_by': 'default_user_id', 'last_modified': dates.safe_format_datetime(generate_state.last_modified), 'last_modified_by': 'default_user_id', }, { 'action_name': 'send_payments', 'action_status': 'init', 'abacus_state_id': 2, 'message': None, 'parent_table_name': 'payment_group_payment', 'parent_table_id': 1, 'created_at': dates.safe_format_datetime(send_state.created_at), 'created_by': 'default_user_id', 'last_modified': dates.safe_format_datetime(send_state.last_modified), 'last_modified_by': 'default_user_id', }, ] def test_update_abacus_state_for_payments(fixture_client): """Test endpoint to update abacus state by payment id.""" created_states = [] for action_name in ORDERED_ACTIONS: state = AbacusStateFactory.create( action_name=action_name, parent_table_name='payment_group_payment', parent_table_id=1, action_status='init', ) created_states.append(state) update_payload = {'action_status': 'complete'} generate_payments_id = ACTION_NAMES.index(ACTION_NAMES.CALCULATE_PAYMENTS) + 1 generate_payments_state = created_states[generate_payments_id - 1] res = fixture_client.put( f'/abacus-state/{generate_payments_id}', json=update_payload ) assert res.status_code == 200 assert res.json == { 'abacus_state_id': generate_payments_id, 'action_name': ACTION_NAMES.CALCULATE_PAYMENTS, 'action_status': ACTION_STATUSES.COMPLETE, 'parent_table_name': 'payment_group_payment', 'parent_table_id': 1, 'message': None, 'created_at': dates.safe_format_datetime(generate_payments_state.created_at), 'created_by': 'default_user_id', 'last_modified': dates.safe_format_datetime( generate_payments_state.last_modified ), 'last_modified_by': 'default_user_id', } update_payload = {'action_status': 'complete'} res = fixture_client.put( f'/abacus-state/{ORDERED_ACTIONS.index(ACTION_NAMES.UPLOAD_APPROVAL) + 1}', json=update_payload, ) assert res.status_code == 400 assert res.json == { 'code': 'error', 'message': ERROR_PREVIOUS_ACTIONS_STATUS.format('upload_approval'), } def test_bulk_update_abacus_states_for_payment_accounts(fixture_client): """Test endpoint for bulk updating abacus states by parent table.""" action_name = PAYMENT_GROUP_PAYMENT_ACCOUNT_ACTION_NAMES.SEND_PAYMENTS parent_table_name = PARENT_TABLE_NAMES.PAYMENT_GROUP_PAYMENT_ACCOUNT first_state = AbacusStateFactory.create( action_name=action_name, parent_table_name=parent_table_name, parent_table_id=1, action_status='init', ) second_state = AbacusStateFactory.create( action_name=action_name, parent_table_name=parent_table_name, parent_table_id=2, action_status='init', ) mock_put_request = [ {'action_status': 'complete', 'parent_table_id': 1}, {'action_status': 'complete', 'parent_table_id': 2}, ] res = fixture_client.put( f'/abacus-states/{parent_table_name}', json=mock_put_request ) expected_results = [ { 'action_name': action_name, 'action_status': ACTION_STATUSES.COMPLETE, 'abacus_state_id': 1, 'message': None, 'parent_table_name': parent_table_name, 'parent_table_id': 1, 'created_by': 'default_user_id', 'created_at': dates.safe_format_datetime(first_state.created_at), 'last_modified_by': 'default_user_id', 'last_modified': dates.safe_format_datetime(first_state.last_modified), }, { 'action_name': action_name, 'action_status': ACTION_STATUSES.COMPLETE, 'abacus_state_id': 2, 'message': None, 'parent_table_name': parent_table_name, 'parent_table_id': 2, 'created_by': 'default_user_id', 'created_at': dates.safe_format_datetime(second_state.created_at), 'last_modified_by': 'default_user_id', 'last_modified': dates.safe_format_datetime(second_state.last_modified), }, ] assert res.status_code == 200 assert res.json == expected_results def test_bulk_update_abacus_states_for_payment_accounts_failure(fixture_client): """Test errors are returned when updating abacus states in bulk.""" parent_table_name = PARENT_TABLE_NAMES.PAYMENT_GROUP_PAYMENT_ACCOUNT mock_put_request = [ { 'action_status': 'complete', }, {'action_status': ACTION_STATUSES.COMPLETE, 'parent_table_id': 2}, ] res = fixture_client.put( f'/abacus-states/{parent_table_name}', json=mock_put_request ) assert res.status_code == 400 assert res.json['message'] == {'0': {'parent_table_id': ['Must be specified.']}}