"""Functional testcases for StatementPeriodAdjustmentBatchCriteria.""" import pytest from royalties.constants.constants import PAYMENT_SCHEDULES, STATEMENT_PERIOD_STATUSES from royalties.constants.error import ( ERROR_ADJUSTMENT_BATCH_CRITERIA_NOT_FOUND, ERROR_BATCH_CRITERIA_ALREADY_EXITS, ERROR_INVALID_CRITERIA_DUPLICATE_PAYMENT_ENTITIES, ERROR_INVALID_CRITERIA_DUPLICATE_PAYMENT_SCHEDULES, ERROR_NO_CURRENT_STATEMENT_PERIOD, ) from royalties.tests.utils.factories import ( StatementPeriodAdjustmentBatchCriteriaFactory, StatementPeriodAdjustmentFileFactory, StatementPeriodFactory, ) def test_get_statement_period_adjustment_batch_criteria(fixture_client): """Test to get statement_period_adjustment_batch_criteria.""" mock_adjustment_batch = StatementPeriodAdjustmentBatchCriteriaFactory.create() statement_period_adjustment_file_id = ( mock_adjustment_batch.statement_period_adjustment_file_id ) result = fixture_client.get( f'/statement-period-adjustment-file/{statement_period_adjustment_file_id}/batch-criteria' ) assert result.status_code == 200 assert result.json == { 'batch_criteria': { 'payment_schedules': [ PAYMENT_SCHEDULES.SCHEDULE_30_DAYS_MONTH, PAYMENT_SCHEDULES.SCHEDULE_90_DAYS_HALFYEAR, ], 'reference_payment_entities': [1, 2, 3, 4], }, 'statement_period_adjustment_file_id': mock_adjustment_batch.statement_period_adjustment_file_id, 'statement_period_adjustment_batch_criteria_id': mock_adjustment_batch.statement_period_adjustment_batch_criteria_id, } def test_get_statement_period_adjustment_batch_criteria_not_found(fixture_client): """Test to get statement_period_adjustment_batch_criteria if file is deleted.""" mock_adjustment_file = StatementPeriodAdjustmentFileFactory.create( deleted_by='Test User' ) StatementPeriodAdjustmentBatchCriteriaFactory.create( statement_period_adjustment_file=mock_adjustment_file ) statement_period_adjustment_file_id = ( mock_adjustment_file.statement_period_adjustment_file_id ) result = fixture_client.get( f'/statement-period-adjustment-file/{statement_period_adjustment_file_id}/batch-criteria' ) assert result.status_code == 404 assert result.data.decode( 'utf-8' ) == ERROR_ADJUSTMENT_BATCH_CRITERIA_NOT_FOUND.format( statement_period_adjustment_file_id ) def test_create_statement_period_adjustment_batch_criteria(fixture_client): """Test to create statement_period_adjustment_batch_criteria.""" mock_adjustment_file = StatementPeriodAdjustmentFileFactory.create() statement_period_adjustment_file_id = ( mock_adjustment_file.statement_period_adjustment_file_id ) mock_post_request = { 'statement_period_adjustment_file_id': statement_period_adjustment_file_id, 'batch_criteria': { 'payment_schedules': [PAYMENT_SCHEDULES.SCHEDULE_30_DAYS_MONTH], 'reference_payment_entities': [1, 2], }, } result = fixture_client.post( '/statement-period-adjustment-batch-criteria', json=mock_post_request ) assert result.status_code == 201 assert result.json == { 'batch_criteria': { 'payment_schedules': [PAYMENT_SCHEDULES.SCHEDULE_30_DAYS_MONTH], 'reference_payment_entities': [1, 2], }, 'statement_period_adjustment_file_id': statement_period_adjustment_file_id, 'statement_period_adjustment_batch_criteria_id': result.json[ 'statement_period_adjustment_batch_criteria_id' ], } def test_create_batch_criteria_file_not_found(fixture_client): """Tests that an error is returned for an invalid statement file id.""" statement_period_adjustment_file_id = 12345 mock_post_request = { 'statement_period_adjustment_file_id': statement_period_adjustment_file_id, 'batch_criteria': { 'payment_schedules': [PAYMENT_SCHEDULES.SCHEDULE_30_DAYS_MONTH], 'reference_payment_entities': [1, 2], }, } result = fixture_client.post( '/statement-period-adjustment-batch-criteria', json=mock_post_request ) assert result.status_code == 400 assert ( result.json['message'] == 'StatementPeriodAdjustmentFile 12345 does not exist.' ) def test_create_batch_criteria_file_with_file_id_missing(fixture_client): """Tests that an error is returned if statement file id is missing.""" mock_post_request = { 'batch_criteria': { 'payment_schedules': [PAYMENT_SCHEDULES.SCHEDULE_30_DAYS_MONTH], 'reference_payment_entities': [1, 2], }, } result = fixture_client.post( '/statement-period-adjustment-batch-criteria', json=mock_post_request ) assert result.status_code == 400 assert result.json['message'] == { 'statement_period_adjustment_file_id': ['Must be specified.'] } def test_create_batch_criteria_file_with_criteria_field_missing(fixture_client): """Tests that an error is returned if batch_criteria field is missing.""" statement_period_adjustment_file_id = 12345 mock_post_request = { 'statement_period_adjustment_file_id': statement_period_adjustment_file_id } result = fixture_client.post( '/statement-period-adjustment-batch-criteria', json=mock_post_request ) assert result.status_code == 400 assert result.json['message'] == {'batch_criteria': ['Must be specified.']} def test_create_batch_criteria_file_with_duplicate_schedule_values(fixture_client): """Tests that an error is returned if batch_criteria contains duplicate schedule values.""" statement_period_adjustment_file_id = 12345 mock_post_request = { 'statement_period_adjustment_file_id': statement_period_adjustment_file_id, 'batch_criteria': { 'payment_schedules': [ PAYMENT_SCHEDULES.SCHEDULE_30_DAYS_MONTH, PAYMENT_SCHEDULES.SCHEDULE_30_DAYS_MONTH, ], 'reference_payment_entities': [1, 2], }, } result = fixture_client.post( '/statement-period-adjustment-batch-criteria', json=mock_post_request ) assert result.status_code == 400 assert result.json['message'] == { 'batch_criteria': { '_schema': [ERROR_INVALID_CRITERIA_DUPLICATE_PAYMENT_SCHEDULES] } } def test_create_batch_criteria_file_with_duplicate_entity_values(fixture_client): """Tests that an error is returned if batch_criteria contains duplicate entity values.""" statement_period_adjustment_file_id = 12345 mock_post_request = { 'statement_period_adjustment_file_id': statement_period_adjustment_file_id, 'batch_criteria': { 'payment_schedules': [ PAYMENT_SCHEDULES.SCHEDULE_30_DAYS_MONTH, PAYMENT_SCHEDULES.SCHEDULE_45_DAYS_MONTH, ], 'reference_payment_entities': [1, 2, 1], }, } result = fixture_client.post( '/statement-period-adjustment-batch-criteria', json=mock_post_request ) assert result.status_code == 400 assert result.json['message'] == { 'batch_criteria': { '_schema': [ERROR_INVALID_CRITERIA_DUPLICATE_PAYMENT_ENTITIES] } } @pytest.mark.db('mysql') def test_create_statement_period_adjustment_file_and_batch_criteria(fixture_client): """Test to create statement period adjustment file and batch_criteria.""" mock_statement_period = StatementPeriodFactory.create( statement_period_status=STATEMENT_PERIOD_STATUSES.CURRENT ) statement_period_id = mock_statement_period.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} res = fixture_client.post( f'/statement-period/{statement_period_id}/adjustment-file/batch-criteria', json=mock_request_post_body, ) assert res.status_code == 201 assert res.json == { 'statement_period_adjustment_file_id': res.json[ 'statement_period_adjustment_file_id' ], 'file_name': file_name, 'batch_type': 'auto', 'invalid_file_location': None, 'total_rounded_amount_multicurrency': None, 'invalid_row_count': None, 'md5sum': None, 'valid_file_location': None, 'total_file_amount_multicurrency': None, 'valid_row_count': None, 'statement_period_adjustment_file_id': 1, 'statement_period_id': statement_period_id, 'error_type': None, 'source_file_upload_id': None, 'created_by': 'default_user_id', } @pytest.mark.db('mysql') def test_create_file_and_batch_criteria_invalid_period(fixture_client): """Test returns an error if statement period is not in current state.""" mock_statement_period = StatementPeriodFactory.create( statement_period_status=STATEMENT_PERIOD_STATUSES.CLOSED ) statement_period_id = mock_statement_period.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} res = fixture_client.post( f'/statement-period/{statement_period_id}/adjustment-file/batch-criteria', json=mock_request_post_body, ) assert res.status_code == 400 assert res.json['message'] == ERROR_NO_CURRENT_STATEMENT_PERIOD @pytest.mark.db('mysql') def test_create_file_with_matching_batch_criteria(fixture_client): """Test returns an error if file with matching criteria already exist.""" batch_criteria = { 'payment_schedules': [ PAYMENT_SCHEDULES.SCHEDULE_30_DAYS_MONTH, PAYMENT_SCHEDULES.SCHEDULE_90_DAYS_HALFYEAR, ], 'reference_payment_entities': [1, 2, 3, 4], } mock_statement_period = StatementPeriodFactory.create( statement_period_status=STATEMENT_PERIOD_STATUSES.CURRENT ) mock_adjustment_file = StatementPeriodAdjustmentFileFactory.create( statement_period=mock_statement_period ) StatementPeriodAdjustmentBatchCriteriaFactory.create( batch_criteria=batch_criteria, statement_period_adjustment_file=mock_adjustment_file, ) statement_period_id = mock_statement_period.statement_period_id batch_criteria = { 'payment_schedules': [ PAYMENT_SCHEDULES.SCHEDULE_30_DAYS_MONTH, PAYMENT_SCHEDULES.SCHEDULE_60_DAYS_MONTH, ], 'reference_payment_entities': [1, 2, 3], } file_name = 'Test flowthrough adjustment' mock_request_post_body = {'batch_criteria': batch_criteria, 'file_name': file_name} res = fixture_client.post( f'/statement-period/{statement_period_id}/adjustment-file/batch-criteria', json=mock_request_post_body, ) assert res.status_code == 400 assert res.json['message'] == ERROR_BATCH_CRITERIA_ALREADY_EXITS.format( statement_period_id ) @pytest.mark.db('mysql') def test_create_file_and_batch_criteria_file_name_missing(fixture_client): """Tests that an error is returned if file_name is missing.""" mock_post_request = { 'batch_criteria': { 'payment_schedules': [PAYMENT_SCHEDULES.SCHEDULE_30_DAYS_MONTH], 'reference_payment_entities': [1, 2], }, } statement_period_id = 1 result = fixture_client.post( f'/statement-period/{statement_period_id}/adjustment-file/batch-criteria', json=mock_post_request, ) assert result.status_code == 400 assert result.json['message'] == {'file_name': ['Must be specified.']} @pytest.mark.db('mysql') def test_create_file_and_batch_criteria_field_missing(fixture_client): """Tests that an error is returned if batch_criteria is missing.""" mock_post_request = {'file_name': 'Test filename'} statement_period_id = 1 result = fixture_client.post( f'/statement-period/{statement_period_id}/adjustment-file/batch-criteria', json=mock_post_request, ) assert result.status_code == 400 assert result.json['message'] == {'batch_criteria': ['Must be specified.']} @pytest.mark.db('mysql') def test_create_file_and_batch_criteria_with_duplicate_schedule_values(fixture_client): """Tests that an error is returned if batch_criteria contains duplicate schedule values.""" statement_period_id = 1 mock_post_request = { 'batch_criteria': { 'payment_schedules': [ PAYMENT_SCHEDULES.SCHEDULE_30_DAYS_MONTH, PAYMENT_SCHEDULES.SCHEDULE_30_DAYS_MONTH, ], 'reference_payment_entities': [1, 2], }, 'file_name': 'Test file', } result = fixture_client.post( f'/statement-period/{statement_period_id}/adjustment-file/batch-criteria', json=mock_post_request, ) assert result.status_code == 400 assert result.json['message'] == { 'batch_criteria': { '_schema': [ERROR_INVALID_CRITERIA_DUPLICATE_PAYMENT_SCHEDULES] } } @pytest.mark.db('mysql') def test_create_file_and_batch_criteria_with_duplicate_entity_values(fixture_client): """Tests that an error is returned if batch_criteria contains duplicate entity values.""" statement_period_adjustment_file_id = 12345 mock_post_request = { 'statement_period_adjustment_file_id': statement_period_adjustment_file_id, 'batch_criteria': { 'payment_schedules': [ PAYMENT_SCHEDULES.SCHEDULE_30_DAYS_MONTH, PAYMENT_SCHEDULES.SCHEDULE_45_DAYS_MONTH, ], 'reference_payment_entities': [1, 2, 1], }, } result = fixture_client.post( '/statement-period-adjustment-batch-criteria', json=mock_post_request ) assert result.status_code == 400 assert result.json['message'] == { 'batch_criteria': { '_schema': [ERROR_INVALID_CRITERIA_DUPLICATE_PAYMENT_ENTITIES] } }