"""Tests for reference_sap_profit_center serialization.""" from datetime import datetime, timezone import pytest from marshmallow import ValidationError from abacus_contract.constants.constants import ( SAP_PROFIT_CENTER_SORT_OPTIONS, SORT_ORDER_OPTIONS, ) from abacus_contract.schemas.signing_entity_sap_profit_center import ( SapProfitCenterSigningEntityDataloaderSchema, SigningEntitySapProfitCenterDataloaderSchema, SigningEntitySapProfitCenterPostByProfitCenterSchema, SigningEntitySapProfitCenterWithSapProfitCenterSchema, SigningEntitySapProfitCenterWithSigningEntitySchema, ) from abacus_contract.tests.utils.factories import ( ReferenceSapProfitCenterFactory, ReferenceSigningEntityFactory, SigningEntitySapProfitCenterFactory, ) def test_signing_entity_sap_profit_center_dataloader_schema(): """Test signing entity profit center mapping schema.""" mock_profit_centers = { 'data': [ { 'signing_entity_sap_profit_center_id': 1, 'reference_signing_entity_id': 1, 'created_at': '2026-06-09', 'sap_profit_center': { 'reference_sap_profit_center_id': 1, 'profit_center': 'PC001', 'company_code': '4914', 'business_group': 'ORC', 'display_name': 'Test', }, } ], 'data': None, } result = SigningEntitySapProfitCenterDataloaderSchema().dump(mock_profit_centers) assert result == mock_profit_centers def test_signing_entity_profit_center_schema(): """Test signing entity profit center schema.""" mock_signing_entity = ReferenceSigningEntityFactory.create(with_junction_row=False) mock_profit_center = ReferenceSapProfitCenterFactory.create() mock_signing_entity_profit_center = SigningEntitySapProfitCenterFactory.create( reference_signing_entity=mock_signing_entity, reference_sap_profit_center=mock_profit_center, ) mock_response = { 'signing_entity_sap_profit_center_id': mock_signing_entity_profit_center.signing_entity_sap_profit_center_id, 'reference_signing_entity_id': mock_signing_entity.reference_signing_entity_id, 'created_at': datetime(2026, 6, 9, 0, 0, 0, tzinfo=timezone.utc), 'sap_profit_center': mock_profit_center, } result = SigningEntitySapProfitCenterWithSapProfitCenterSchema().dump(mock_response) assert result == { 'signing_entity_sap_profit_center_id': mock_signing_entity_profit_center.signing_entity_sap_profit_center_id, 'reference_signing_entity_id': mock_signing_entity.reference_signing_entity_id, 'created_at': '2026-06-09T00:00:00.000000+0000', 'sap_profit_center': { 'reference_sap_profit_center_id': mock_profit_center.reference_sap_profit_center_id, 'profit_center': mock_profit_center.profit_center, 'company_code': mock_profit_center.company_code, 'business_group': mock_profit_center.business_group, 'display_name': mock_profit_center.display_name, }, } def test_signing_entity_profit_center_schema_with_missing_fields(): """Test signing entity profit center schema with missing fields.""" mock_profit_center = { 'created_at': '2026-06-09T00:00:00.000000+0000', 'sap_profit_center': { 'reference_sap_profit_center_id': 1, 'profit_center': 'PC001', 'company_code': '4914', 'display_name': 'Test', }, } with pytest.raises(ValidationError) as exc_info: SigningEntitySapProfitCenterWithSapProfitCenterSchema().load(mock_profit_center) assert exc_info.value.messages == { 'signing_entity_sap_profit_center_id': ['Must be specified.'], 'reference_signing_entity_id': ['Must be specified.'], 'sap_profit_center': { 'business_group': ['Must be specified.'], }, } def test_signing_entity_profit_center_schema_with_null_values(): """Test signing entity profit center schema with null values.""" mock_profit_center = { 'signing_entity_sap_profit_center_id': 1, 'reference_signing_entity_id': 1, 'created_at': '2026-06-09T00:00:00.000000+0000', 'sap_profit_center': { 'reference_sap_profit_center_id': None, 'profit_center': None, 'company_code': None, 'business_group': 'ORC', 'display_name': None, }, } with pytest.raises(ValidationError) as exc_info: SigningEntitySapProfitCenterWithSapProfitCenterSchema().load(mock_profit_center) assert exc_info.value.messages == { 'sap_profit_center': { 'reference_sap_profit_center_id': ['Field may not be null.'], 'profit_center': ['Field may not be null.'], 'company_code': ['Field may not be null.'], 'display_name': ['Field may not be null.'], } } def test_sap_profit_center_signing_entity_dataloader_schema(): """Test sap profit center signing entity mapping schema.""" mock_signing_entity = ReferenceSigningEntityFactory.create() mock_signing_entities = { 'data': [ { 'signing_entity_sap_profit_center_id': 1, 'reference_sap_profit_center_id': 1, 'created_at': datetime(2026, 6, 9, 0, 0, 0, tzinfo=timezone.utc), 'signing_entity': { 'reference_signing_entity_id': mock_signing_entity.reference_signing_entity_id, 'reference_sap_profit_center_id': mock_signing_entity.reference_sap_profit_center_id, 'reference_payment_entity_id': mock_signing_entity.reference_payment_entity_id, 'company_code': mock_signing_entity.company_code, 'legal_name': mock_signing_entity.legal_name, 'vat_number': mock_signing_entity.vat_number, 'company_registration_number': mock_signing_entity.company_registration_number, 'address': mock_signing_entity.address, }, } ] } result = SapProfitCenterSigningEntityDataloaderSchema().dump(mock_signing_entities) assert result == { 'data': [ { 'signing_entity_sap_profit_center_id': 1, 'reference_sap_profit_center_id': 1, 'created_at': '2026-06-09T00:00:00.000000+0000', 'signing_entity': { 'reference_signing_entity_id': mock_signing_entity.reference_signing_entity_id, 'reference_sap_profit_center_id': mock_signing_entity.reference_sap_profit_center_id, 'reference_payment_entity_id': mock_signing_entity.reference_payment_entity_id, 'company_code': mock_signing_entity.company_code, 'legal_name': mock_signing_entity.legal_name, 'vat_number': mock_signing_entity.vat_number, 'company_registration_number': mock_signing_entity.company_registration_number, 'address': mock_signing_entity.address, }, } ] } def test_signing_entity_sap_profit_center_with_signing_entity_schema(): """Test signing entity profit center with signing_entity schema.""" mock_signing_entity = ReferenceSigningEntityFactory.create(with_junction_row=False) mock_profit_center = ReferenceSapProfitCenterFactory.create() mock_signing_entity_profit_center = SigningEntitySapProfitCenterFactory.create( reference_signing_entity=mock_signing_entity, reference_sap_profit_center=mock_profit_center, ) mock_signing_entity_res = { 'signing_entity_sap_profit_center_id': mock_signing_entity_profit_center.signing_entity_sap_profit_center_id, 'reference_sap_profit_center_id': mock_profit_center.reference_sap_profit_center_id, 'created_at': datetime(2026, 6, 9, 0, 0, 0, tzinfo=timezone.utc), 'signing_entity': { 'reference_signing_entity_id': mock_signing_entity.reference_signing_entity_id, 'reference_sap_profit_center_id': mock_signing_entity.reference_sap_profit_center_id, 'reference_payment_entity_id': mock_signing_entity.reference_payment_entity_id, 'company_code': mock_signing_entity.company_code, 'legal_name': mock_signing_entity.legal_name, 'vat_number': mock_signing_entity.vat_number, 'company_registration_number': mock_signing_entity.company_registration_number, 'address': mock_signing_entity.address, }, } result = SigningEntitySapProfitCenterWithSigningEntitySchema().dump( mock_signing_entity_res ) assert result == { 'signing_entity_sap_profit_center_id': mock_signing_entity_profit_center.signing_entity_sap_profit_center_id, 'reference_sap_profit_center_id': mock_profit_center.reference_sap_profit_center_id, 'created_at': '2026-06-09T00:00:00.000000+0000', 'signing_entity': { 'reference_signing_entity_id': mock_signing_entity.reference_signing_entity_id, 'reference_sap_profit_center_id': mock_signing_entity.reference_sap_profit_center_id, 'reference_payment_entity_id': mock_signing_entity.reference_payment_entity_id, 'company_code': mock_signing_entity.company_code, 'legal_name': mock_signing_entity.legal_name, 'vat_number': mock_signing_entity.vat_number, 'company_registration_number': mock_signing_entity.company_registration_number, 'address': mock_signing_entity.address, }, } def test_signing_entity_sap_profit_center_with_missing_fields(): """Test signing entity profit center with signing_entity schema with missing fields.""" mock_signing_entity = ReferenceSigningEntityFactory.create(with_junction_row=False) mock_signing_entity_res = { 'created_at': '2026-06-09T00:00:00.000000+0000', 'signing_entity': { 'reference_sap_profit_center_id': mock_signing_entity.reference_sap_profit_center_id, 'reference_payment_entity_id': mock_signing_entity.reference_payment_entity_id, 'legal_name': mock_signing_entity.legal_name, 'vat_number': mock_signing_entity.vat_number, 'company_registration_number': mock_signing_entity.company_registration_number, 'address': mock_signing_entity.address, }, } with pytest.raises(ValidationError) as exc_info: SigningEntitySapProfitCenterWithSigningEntitySchema().load( mock_signing_entity_res ) assert exc_info.value.messages == { 'signing_entity_sap_profit_center_id': ['Must be specified.'], 'reference_sap_profit_center_id': ['Must be specified.'], 'signing_entity': { 'company_code': ['Must be specified.'], 'reference_signing_entity_id': ['Must be specified.'], }, } def test_signing_entity_sap_profit_center_with_null_values(): """Test signing entity profit center with signing_entity schema with null values.""" mock_signing_entity = ReferenceSigningEntityFactory.create(with_junction_row=False) mock_profit_center = ReferenceSapProfitCenterFactory.create() mock_signing_entity_profit_center = SigningEntitySapProfitCenterFactory.create( reference_signing_entity=mock_signing_entity, reference_sap_profit_center=mock_profit_center, ) mock_signing_entity_res = { 'signing_entity_sap_profit_center_id': mock_signing_entity_profit_center.signing_entity_sap_profit_center_id, 'reference_sap_profit_center_id': mock_profit_center.reference_sap_profit_center_id, 'created_at': '2026-06-09T00:00:00.000000+0000', 'signing_entity': { 'reference_signing_entity_id': mock_signing_entity.reference_signing_entity_id, 'reference_sap_profit_center_id': None, 'reference_payment_entity_id': None, 'company_code': mock_signing_entity.company_code, 'legal_name': None, 'vat_number': mock_signing_entity.vat_number, 'company_registration_number': mock_signing_entity.company_registration_number, 'address': mock_signing_entity.address, }, } with pytest.raises(ValidationError) as exc_info: SigningEntitySapProfitCenterWithSigningEntitySchema().load( mock_signing_entity_res ) assert exc_info.value.messages == { 'signing_entity': { 'reference_sap_profit_center_id': ['Field may not be null.'], 'reference_payment_entity_id': ['Field may not be null.'], 'legal_name': ['Field may not be null.'], } } def test_bulk_associate_signing_entities_schema_success(): """Test POST schema accurately processes valid signing entity ID lists.""" mock_request_body = {'reference_signing_entity_ids': [1, 2, 3]} result = SigningEntitySapProfitCenterPostByProfitCenterSchema().dump( mock_request_body ) assert result == mock_request_body def test_bulk_associate_signing_entities_schema_invalid_types(): """Test that schema load fails when string values are passed instead of integers.""" mock_request_body = {'reference_signing_entity_ids': [1, 2, 3, 'test', 'T1']} with pytest.raises(ValidationError) as exc_info: SigningEntitySapProfitCenterPostByProfitCenterSchema().load(mock_request_body) assert exc_info.value.messages == { 'reference_signing_entity_ids': { 3: ['Must be an integer greater or equal to 0.'], 4: ['Must be an integer greater or equal to 0.'], } } def test_bulk_associate_signing_entities_schema_with_zero_id(): """Test that schema validation fails if any ID is less than 1.""" mock_request_body = {'reference_signing_entity_ids': [1, 2, 0, 3]} with pytest.raises(ValidationError) as exc_info: SigningEntitySapProfitCenterPostByProfitCenterSchema().load(mock_request_body) assert exc_info.value.messages == { 'reference_signing_entity_ids': { 2: ['ID must be greater than 0'], } }