"""Unit tests for WorksheetAdjustment schemas.""" import pytest from marshmallow import ValidationError from abacus_worksheet.constants import constants from abacus_worksheet.constants.error import ( ERROR_INVALID_ACCOUNT_IDS, ERROR_INVALID_CONTRACT_IDS, ) from abacus_worksheet.schemas.worksheet_adjustment import ( PendingWorksheetAdjustmentsRequestParamsSchema, WorksheetAdjustmentAccountContractFilterSchema, WorksheetAdjustmentAccountsListSchema, WorksheetAdjustmentAndDetailFilterSchema, WorksheetAdjustmentAndDetailSchema, WorksheetAdjustmentContractsListSchema, WorksheetAdjustmentImportSchema, WorksheetAdjustmentListSchema, WorksheetAdjustmentSchema, ) from tests.utils.factories import WorksheetAdjustmentFactory def test_worksheet_adjustment_schema(): """Test WorksheetAdjustment schema.""" mock_worksheet_adjustment = WorksheetAdjustmentFactory.create() response = WorksheetAdjustmentSchema().dump(mock_worksheet_adjustment) assert response == { 'worksheet_adjustment_id': 1, 'statement_period_adjustment_file_id': 1, 'abacus_event_id': 1, 'account_id': 1, 'contract_id': 1, 'activity_statement_period_id': 1, 'apply_to_statement_period_id': 2, 'reference_adjustment_type_id': 1, 'apply_to_flowthrough_payment': None, 'adjustment_amount': '125.42', 'adjustment_currency_code': 'USD', 'note': 'informative message', 'internal_note': None, } def test_worksheet_adjustment_list_schema(): """Test WorksheetAdjustmentList schema.""" mock_worksheet_adjustment = WorksheetAdjustmentFactory.create() response = WorksheetAdjustmentListSchema().dump(mock_worksheet_adjustment) assert response == { 'worksheet_adjustment_id': 1, 'statement_period_adjustment_file_id': 1, 'abacus_event_id': 1, 'account_id': 1, 'contract_id': 1, 'activity_statement_period_id': 1, 'apply_to_statement_period_id': 2, 'reference_adjustment_type_id': 1, 'apply_to_flowthrough_payment': None, 'adjustment_amount': '125.42', 'adjustment_currency_code': 'USD', 'account_currency_code': 'AUD', 'account_payment_entity_id': 1, 'note': 'informative message', 'internal_note': None, 'details': [], } def test_worksheet_adjustment_import_schema(): """Test WorksheetAdjustment import schema.""" mock_worksheet_adjustment = WorksheetAdjustmentFactory.create() response = WorksheetAdjustmentImportSchema().dump(mock_worksheet_adjustment) assert response == {'statement_period_adjustment_file_id': 1, 'abacus_event_id': 1} def test_worksheet_adjustment_and_detail_schema(): """Test WorksheetAdjustmentAndDetail schema.""" mock_worksheet_adjustment = { 'worksheet_adjustment_id': 1, 'statement_period_adjustment_file_id': 1, 'abacus_event_id': 1, 'account_id': 1, 'contract_id': 1, 'activity_statement_period_id': 1, 'apply_to_statement_period_id': 2, 'reference_adjustment_type_id': 1, 'adjustment_amount': '125.42', 'adjustment_currency_code': 'USD', 'note': 'informative message', 'internal_note': None, 'distribution_type': 'digital', 'upc': '123455555', 'worksheet_adjustment_detail_id': 2, } response = WorksheetAdjustmentAndDetailSchema().dump(mock_worksheet_adjustment) assert response == { 'worksheet_adjustment_id': 1, 'statement_period_adjustment_file_id': 1, 'abacus_event_id': 1, 'account_id': 1, 'contract_id': 1, 'activity_statement_period_id': 1, 'apply_to_statement_period_id': 2, 'reference_adjustment_type_id': 1, 'adjustment_amount': '125.42', 'adjustment_currency_code': 'USD', 'note': 'informative message', 'internal_note': None, 'distribution_type': 'digital', 'upc': '123455555', 'worksheet_adjustment_detail_id': 2, } def test_pending_worksheet_adjustments_request_params_schema_success(): """Test PendingWorksheetAdjustmentsRequestParamsSchema load.""" response = PendingWorksheetAdjustmentsRequestParamsSchema().load( { 'limit': '10', 'offset': '0', 'statement_period_id': '1', 'reference_payment_entity_id': '2', } ) assert response == { 'limit': 10, 'offset': 0, 'statement_period_id': 1, 'reference_payment_entity_id': 2, } response = PendingWorksheetAdjustmentsRequestParamsSchema().load( {'statement_period_id': '1', 'reference_payment_entity_id': '2'} ) assert response == { 'limit': constants.DEFAULT_PAGE_LIMIT, 'offset': constants.DEFAULT_PAGE_OFFSET, 'statement_period_id': 1, 'reference_payment_entity_id': 2, } def test_pending_worksheet_adjustments_request_params_schema_failure(): """Test PendingWorksheetAdjustmentsRequestParamsSchema load.""" with pytest.raises(ValidationError) as excinfo: PendingWorksheetAdjustmentsRequestParamsSchema().load( { 'limit': 'abc', 'offset': 'abc', 'statement_period_id': 'abc', 'reference_payment_entity_id': 'abc', } ) assert list(excinfo.value.messages_dict.keys()) == [ 'limit', 'offset', 'statement_period_id', 'reference_payment_entity_id', ] def test_worksheet_adjustment_contracts_list_schema(): """Test WorksheetAdjustmentContractsList schema.""" mock_worksheet_adjustment = { 'worksheet_adjustment_id': 1, 'statement_period_adjustment_file_id': 1, 'abacus_event_id': 1, 'account_id': 1, 'contract_id': 1, 'activity_statement_period_id': 1, 'apply_to_statement_period_id': 2, 'reference_adjustment_type_id': 1, 'adjustment_amount': '125.42', 'adjustment_currency_code': 'USD', 'note': 'informative message', 'internal_note': None, 'distribution_type': 'digital', 'upc': '123455555', 'worksheet_adjustment_detail_id': 2, } response = WorksheetAdjustmentContractsListSchema().dump(mock_worksheet_adjustment) assert response == {'contract_id': 1} def test_worksheet_adjustment_accounts_list_schema(): """Test WorksheetAdjustmentAccountsListSchema schema.""" mock_worksheet_adjustment = { 'worksheet_adjustment_id': 1, 'statement_period_adjustment_file_id': 1, 'abacus_event_id': 1, 'account_id': 1, 'contract_id': 1, 'activity_statement_period_id': 1, 'apply_to_statement_period_id': 2, 'reference_adjustment_type_id': 1, 'adjustment_amount': '125.42', 'adjustment_currency_code': 'USD', 'note': 'informative message', 'internal_note': None, 'distribution_type': 'digital', 'upc': '123455555', 'worksheet_adjustment_detail_id': 2, } response = WorksheetAdjustmentAccountsListSchema().dump(mock_worksheet_adjustment) assert response == {'account_id': 1} def test_worksheet_adjustment_accounts_contracts_filter_schema(): """Test WorksheetAdjustmentAccountsContractsFilter schema.""" mock_filter_params = { 'account_search_term': 'agreement,awal', 'contract_search_term': 'agreement,awal', 'limit': 25, 'offset': 0, } res = WorksheetAdjustmentAccountContractFilterSchema().load(mock_filter_params) assert res == mock_filter_params def test_worksheet_adjustment_and_detail_filter_schema(): """Test WorksheetAdjustmentAndDetailFilter schema.""" mock_filter_params = { 'account_ids': '12,11,10', 'contract_ids': '1,2,3', 'apply_to_flowthrough_payment': '0,1,null', 'limit': 25, 'offset': 0, } res = WorksheetAdjustmentAndDetailFilterSchema().load(mock_filter_params) assert res == { **mock_filter_params, 'is_deleted': False, } def test_worksheet_adjustment_and_detail_filter_is_deleted(): """is_deleted parses via BooleanFilter: false/true/all -> False/True/None.""" schema = WorksheetAdjustmentAndDetailFilterSchema() assert schema.load({'is_deleted': 'false'})['is_deleted'] is False assert schema.load({'is_deleted': 'true'})['is_deleted'] is True assert schema.load({'is_deleted': 'all'})['is_deleted'] is None assert schema.load({})['is_deleted'] is False # default active with pytest.raises(ValidationError): schema.load({'is_deleted': 'bogus'}) def test_worksheet_adjustment_and_detail_filter_invalid_contract_ids(): """Test WorksheetAdjustmentAndDetailFilter schema validation for contract_ids.""" mock_filter_params = {'contract_ids': '1,2#,3$, Test', 'limit': 25, 'offset': 0} with pytest.raises(ValidationError) as exc_info: res = WorksheetAdjustmentAndDetailFilterSchema().load(mock_filter_params) assert res is None assert exc_info.value.args[0] == {'_schema': [ERROR_INVALID_CONTRACT_IDS]} def test_worksheet_adjustment_and_detail_filter_invalid_account_ids(): """Test WorksheetAdjustmentAndDetailFilter schema validation for account_ids.""" mock_filter_params = {'account_ids': '1,2#,3$, Test', 'limit': 25, 'offset': 0} with pytest.raises(ValidationError) as exc_info: res = WorksheetAdjustmentAndDetailFilterSchema().load(mock_filter_params) assert res is None assert exc_info.value.args[0] == {'_schema': [ERROR_INVALID_ACCOUNT_IDS]} def test_worksheet_adjustment_and_detail_filter_invalid_flowthrough_payment_flags(): """Test WorksheetAdjustmentAndDetailFilter schema validation for apply_to_flowthrough_payment.""" mock_filter_params = { 'apply_to_flowthrough_payment': '11,1,0,None,null', 'limit': 25, 'offset': 0, } with pytest.raises(ValidationError) as exc_info: res = WorksheetAdjustmentAndDetailFilterSchema().load(mock_filter_params) assert res is None assert exc_info.value.args[0] == {'_schema': ['Must be 0, 1, or null']}