"""Unit testcases for StatementPeriodAdjustmentBatchCriteria logic.""" from unittest.mock import patch import pytest from marshmallow import ValidationError from royalties.constants.constants import STATEMENT_PERIOD_ADJUSTMENT_FILE_BATCH_TYPES from royalties.constants.error import ( ERROR_ADJUSTMENT_BATCH_CRITERIA_NOT_FOUND, ERROR_BATCH_CRITERIA_ALREADY_EXITS, ) from royalties.logic import statement_period_adjustment_batch_criteria as logic from royalties.tests.utils.factories import ( StatementPeriodAdjustmentBatchCriteriaFactory, StatementPeriodAdjustmentFileFactory, ) @patch( 'royalties.logic.statement_period_adjustment_batch_criteria.StatementPeriodAdjustmentBatchCriteria' ) def test_get_statement_period_adjustment_batch_criteria(mock_batch_model): """Test to get adjustment batch by file id.""" mock_adjustment_batch = StatementPeriodAdjustmentBatchCriteriaFactory.create() mock_batch_model.get_by_file_id.return_value = mock_adjustment_batch result = logic.get_statement_period_adjustment_batch_criteria( mock_adjustment_batch.statement_period_adjustment_file_id ) assert result.status == 200 assert ( result.message['statement_period_adjustment_batch_criteria_id'] == mock_adjustment_batch.statement_period_adjustment_batch_criteria_id ) @patch( 'royalties.logic.statement_period_adjustment_batch_criteria.StatementPeriodAdjustmentBatchCriteria' ) def test_get_statement_period_adjustment_batch_criteria_not_found(mock_batch_model): """Test to get statement_period_adjustment_batch_criteria if file not found.""" mock_adjustment_batch = StatementPeriodAdjustmentBatchCriteriaFactory.create() statement_period_adjustment_file_id = ( mock_adjustment_batch.statement_period_adjustment_file_id ) mock_batch_model.get_by_file_id.return_value = None result = logic.get_statement_period_adjustment_batch_criteria( mock_adjustment_batch.statement_period_adjustment_file_id ) assert result.status == 404 assert result.message == ERROR_ADJUSTMENT_BATCH_CRITERIA_NOT_FOUND.format( statement_period_adjustment_file_id ) @patch( 'royalties.logic.statement_period_adjustment_batch_criteria.StatementPeriodAdjustmentFile' ) @patch( 'royalties.logic.statement_period_adjustment_batch_criteria.StatementPeriodAdjustmentBatchCriteria' ) def test_create_statement_period_adjustment_batch_criteria( mock_batch_model, mock_file_model ): """Test to create adjustment batch criteria.""" mock_adjustment_file = StatementPeriodAdjustmentFileFactory.create() mock_file_model.get_by_id_or_error.return_value = mock_adjustment_file mock_batch_model.create.return_value = True statement_period_adjustment_file_id = ( mock_adjustment_file.statement_period_adjustment_file_id ) batch_criteria = { 'payment_schedules': ['30_days_after_quarter_end'], 'reference_payment_entities': [1, 2, 3], } result = logic.create_statement_period_adjustment_batch_criteria( statement_period_adjustment_file_id, batch_criteria ) assert result.status == 201 mock_batch_model.create.assert_called_once_with( statement_period_adjustment_file_id=statement_period_adjustment_file_id, batch_criteria=batch_criteria, ) @patch('royalties.logic.statement_period_adjustment_batch_criteria.db') @patch( 'royalties.logic.statement_period_adjustment_batch_criteria._ensure_unique_batch_criteria' ) @patch( 'royalties.logic.statement_period_adjustment_batch_criteria._validate_statement_period_state' ) @patch( 'royalties.logic.statement_period_adjustment_batch_criteria.StatementPeriodAdjustmentFile' ) @patch( 'royalties.logic.statement_period_adjustment_batch_criteria.StatementPeriodAdjustmentBatchCriteria' ) def test_create_adjustment_file_and_batch_criteria( mock_batch_model, mock_file_model, mock__validate_statement_period_state, mock__ensure_unique_batch_criteria, mock_db, ): """Test to create adjustment file and batch criteria.""" mock__validate_statement_period_state.return_value = True mock__ensure_unique_batch_criteria.return_value = None mock_adjustment_file = StatementPeriodAdjustmentFileFactory.create() mock_batch_criteria = StatementPeriodAdjustmentBatchCriteriaFactory.create( statement_period_adjustment_file=mock_adjustment_file ) mock_file_model.build.return_value = mock_adjustment_file mock_batch_model.build.return_value = mock_batch_criteria statement_period_adjustment_file_id = ( mock_adjustment_file.statement_period_adjustment_file_id ) statement_period_id = mock_adjustment_file.statement_period_id batch_criteria = { 'payment_schedules': ['30_days_after_quarter_end'], 'reference_payment_entities': [1, 2, 3], } file_name = 'Test flowthrough adjustment' mock_request_post_body = {'batch_criteria': batch_criteria, 'file_name': file_name} result = logic.create_adjustment_file_and_batch_criteria( statement_period_id, **mock_request_post_body ) assert result.status == 201 mock_file_model.build.assert_called_once_with( batch_type=STATEMENT_PERIOD_ADJUSTMENT_FILE_BATCH_TYPES.AUTO, file_name=file_name, statement_period_id=statement_period_id, ) mock_batch_model.build.assert_called_once_with( batch_criteria=batch_criteria, statement_period_adjustment_file_id=statement_period_adjustment_file_id, ) mock_db.session.commit.assert_called_once() @patch('royalties.logic.statement_period_adjustment_batch_criteria.db') @patch( 'royalties.logic.statement_period_adjustment_batch_criteria._ensure_unique_batch_criteria' ) @patch( 'royalties.logic.statement_period_adjustment_batch_criteria._validate_statement_period_state' ) @patch( 'royalties.logic.statement_period_adjustment_batch_criteria.StatementPeriodAdjustmentFile' ) @patch( 'royalties.logic.statement_period_adjustment_batch_criteria.StatementPeriodAdjustmentBatchCriteria' ) def test_create_adjustment_file_and_batch_criteria_period_error( mock_batch_model, mock_file_model, mock__validate_statement_period_state, mock__ensure_unique_batch_criteria, mock_db, ): """Test throws an error if statement period is not valid.""" mock__validate_statement_period_state.side_effect = ValidationError( 'statement period is not in current state' ) mock__ensure_unique_batch_criteria.return_value = None statement_period_id = 1 batch_criteria = { 'payment_schedules': ['30_days_after_quarter_end'], 'reference_payment_entities': [1, 2, 3], } file_name = 'Test flowthrough adjustment' mock_request_post_body = {'batch_criteria': batch_criteria, 'file_name': file_name} result = logic.create_adjustment_file_and_batch_criteria( statement_period_id, **mock_request_post_body ) assert result.status == 400 assert result.errors == { 'code': 'error', 'message': 'statement period is not in current state', } mock__validate_statement_period_state.assert_called_once_with(statement_period_id) mock__ensure_unique_batch_criteria.assert_not_called() mock_file_model.build.assert_not_called() mock_batch_model.build.assert_not_called() mock_db.session.commit.assert_not_called() @patch('royalties.logic.statement_period_adjustment_batch_criteria.db') @patch( 'royalties.logic.statement_period_adjustment_batch_criteria._ensure_unique_batch_criteria' ) @patch( 'royalties.logic.statement_period_adjustment_batch_criteria._validate_statement_period_state' ) @patch( 'royalties.logic.statement_period_adjustment_batch_criteria.StatementPeriodAdjustmentFile' ) @patch( 'royalties.logic.statement_period_adjustment_batch_criteria.StatementPeriodAdjustmentBatchCriteria' ) def test_create_adjustment_file_and_batch_criteria_error( mock_batch_model, mock_file_model, mock__validate_statement_period_state, mock__ensure_unique_batch_criteria, mock_db, ): """Test throws an error if file with matching batch criteria already exist.""" mock__validate_statement_period_state.return_value = True mock__ensure_unique_batch_criteria.side_effect = ValidationError('Already Exist') statement_period_id = 1 batch_criteria = { 'payment_schedules': ['30_days_after_quarter_end'], 'reference_payment_entities': [1, 2, 3], } file_name = 'Test flowthrough adjustment' mock_request_post_body = {'batch_criteria': batch_criteria, 'file_name': file_name} result = logic.create_adjustment_file_and_batch_criteria( statement_period_id, **mock_request_post_body ) assert result.status == 400 assert result.errors == {'code': 'error', 'message': 'Already Exist'} mock__validate_statement_period_state.assert_called_once_with(statement_period_id) mock__ensure_unique_batch_criteria.assert_called_once_with( batch_criteria, statement_period_id ) mock_file_model.build.assert_not_called() mock_batch_model.build.assert_not_called() mock_db.session.commit.assert_not_called() @patch( 'royalties.logic.statement_period_adjustment_batch_criteria.StatementPeriodAdjustmentBatchCriteria' ) def test__ensure_unique_batch_criteria_error(mock_batch_model): """Test throws an error if file with matching batch criteria already exist.""" mock_adjustment_batch = StatementPeriodAdjustmentBatchCriteriaFactory.create() mock_batch_model.get_by_batch_criteria_and_period_id.return_value = [ mock_adjustment_batch ] statement_period_id = 1 batch_criteria = { 'payment_schedules': ['30_days_after_quarter_end'], 'reference_payment_entities': [1, 2, 3], } with pytest.raises(ValidationError) as exec_info: logic._ensure_unique_batch_criteria(batch_criteria, statement_period_id) assert str(exec_info.value) == ERROR_BATCH_CRITERIA_ALREADY_EXITS.format( statement_period_id ) mock_batch_model.get_by_batch_criteria_and_period_id.assert_called_once_with( batch_criteria, statement_period_id ) @patch( 'royalties.logic.statement_period_adjustment_batch_criteria.StatementPeriodAdjustmentBatchCriteria' ) def test__ensure_unique_batch_criteria(mock_batch_model): """Test return none if there is no file with matching batch criteria.""" mock_batch_model.get_by_batch_criteria_and_period_id.return_value = [] statement_period_id = 1 batch_criteria = { 'payment_schedules': ['30_days_after_quarter_end'], 'reference_payment_entities': [1, 2, 3], } result = logic._ensure_unique_batch_criteria(batch_criteria, statement_period_id) assert result is None mock_batch_model.get_by_batch_criteria_and_period_id.assert_called_once_with( batch_criteria, statement_period_id )