"""Unit tests for response schemas.""" import pytest from pydantic import ValidationError from src.enums import EventType from src.schemas.responses import ( AdjustmentFilePrepareResponse, AdjustmentFilePrepareResponseData, AdjustmentFilePrepareResponseDetail, AdjustmentFilePrepareResponseMetadata, ) class TestAdjustmentFilePrepareResponse: """Tests for AdjustmentFilePrepareResponse model.""" def test_valid_response_with_all_fields(self): """Test AdjustmentFilePrepareResponse with all fields.""" response = AdjustmentFilePrepareResponse( detail_type=EventType.ADJUSTMENT_BATCH_PREPARED, detail=AdjustmentFilePrepareResponseDetail( metadata=AdjustmentFilePrepareResponseMetadata( target_type='worksheet_flowthrough_batch', target_id=123, correlation_id='corr-123', ), data=AdjustmentFilePrepareResponseData( valid_row_count=1000, invalid_row_count=10, total_file_amount_multicurrency=5000.50, total_rounded_amount_multicurrency=5001.00, s3_bucket='test-bucket', s3_key='staging/123/prepared.csv.gz', ), ), ) assert response.detail_type == EventType.ADJUSTMENT_BATCH_PREPARED assert response.detail.metadata.correlation_id == 'corr-123' assert response.detail.data.valid_row_count == 1000 assert response.detail.data.invalid_row_count == 10 def test_valid_response_without_correlation_id(self): """Test AdjustmentFilePrepareResponse without optional correlation_id.""" response = AdjustmentFilePrepareResponse( detail_type=EventType.ADJUSTMENT_BATCH_PREPARED, detail=AdjustmentFilePrepareResponseDetail( metadata=AdjustmentFilePrepareResponseMetadata( target_type='worksheet_flowthrough_batch', target_id=123, ), data=AdjustmentFilePrepareResponseData( valid_row_count=500, invalid_row_count=5, total_file_amount_multicurrency=2500.25, total_rounded_amount_multicurrency=2500.00, s3_bucket='test-bucket', s3_key='staging/456/prepared.csv.gz', ), ), ) assert response.detail_type == EventType.ADJUSTMENT_BATCH_PREPARED assert response.detail.metadata.correlation_id is None assert response.detail.data.valid_row_count == 500 assert response.detail.data.invalid_row_count == 5 def test_missing_required_field_raises_error(self): """Test missing required fields raise ValidationError.""" with pytest.raises(ValidationError) as exc_info: AdjustmentFilePrepareResponseData( s3_bucket='test-bucket', s3_key='staging/123/prepared.csv.gz', ) assert 'valid_row_count' in str(exc_info.value) with pytest.raises(ValidationError) as exc_info: AdjustmentFilePrepareResponseData( valid_row_count=100, invalid_row_count=10, total_file_amount_multicurrency=1000.0, total_rounded_amount_multicurrency=1000.0, s3_key='staging/123/prepared.csv.gz', ) assert 's3_bucket' in str(exc_info.value) # s3_key is now optional, so this should not raise an error data = AdjustmentFilePrepareResponseData( valid_row_count=100, invalid_row_count=10, total_file_amount_multicurrency=1000.0, total_rounded_amount_multicurrency=1000.0, s3_bucket='test-bucket', ) assert data.s3_key is None def test_invalid_field_type_raises_error(self): """Test invalid field type raises ValidationError.""" with pytest.raises(ValidationError) as exc_info: AdjustmentFilePrepareResponseData( valid_row_count='not-an-int', invalid_row_count=10, total_file_amount_multicurrency=1000.0, total_rounded_amount_multicurrency=1000.0, s3_bucket='test-bucket', s3_key='staging/123/prepared.csv.gz', ) assert 'valid_row_count' in str(exc_info.value) def test_model_dump_with_all_fields(self): """Test model_dump() returns correct dict with all fields.""" response = AdjustmentFilePrepareResponse( detail_type=EventType.ADJUSTMENT_BATCH_PREPARED, detail=AdjustmentFilePrepareResponseDetail( metadata=AdjustmentFilePrepareResponseMetadata( target_type='worksheet_flowthrough_batch', target_id=123, correlation_id='corr-xyz', ), data=AdjustmentFilePrepareResponseData( valid_row_count=5000, invalid_row_count=50, total_file_amount_multicurrency=10000.75, total_rounded_amount_multicurrency=10001.00, s3_bucket='test-bucket', s3_key='staging/789/prepared.csv.gz', ), ), ) response_dict = response.model_dump() assert response_dict['detail_type'] == 'adjustment_batch.prepared' assert response_dict['detail']['data'] == { 'valid_row_count': 5000, 'invalid_row_count': 50, 'total_file_amount_multicurrency': 10000.75, 'total_rounded_amount_multicurrency': 10001.00, 's3_bucket': 'test-bucket', 's3_key': 'staging/789/prepared.csv.gz', } assert response_dict['detail']['metadata']['correlation_id'] == 'corr-xyz' def test_model_dump_without_correlation_id(self): """Test model_dump() returns correct dict without correlation_id.""" response = AdjustmentFilePrepareResponse( detail_type=EventType.ADJUSTMENT_BATCH_PREPARED, detail=AdjustmentFilePrepareResponseDetail( metadata=AdjustmentFilePrepareResponseMetadata( target_type='worksheet_flowthrough_batch', target_id=123, ), data=AdjustmentFilePrepareResponseData( valid_row_count=250, invalid_row_count=25, total_file_amount_multicurrency=1250.50, total_rounded_amount_multicurrency=1251.00, s3_bucket='test-bucket', s3_key='staging/999/prepared.csv.gz', ), ), ) response_dict = response.model_dump() assert response_dict['detail_type'] == 'adjustment_batch.prepared' assert response_dict['detail']['data'] == { 'valid_row_count': 250, 'invalid_row_count': 25, 'total_file_amount_multicurrency': 1250.50, 'total_rounded_amount_multicurrency': 1251.00, 's3_bucket': 'test-bucket', 's3_key': 'staging/999/prepared.csv.gz', } assert response_dict['detail']['metadata']['correlation_id'] is None