"""Unit tests for event schemas.""" import pytest from pydantic import ValidationError from src.schemas import ( AdjustmentFilePrepareEvent, AdjustmentFilePrepareEventData, AdjustmentFilePrepareEventDetail, AdjustmentFilePrepareEventMetadata, ) class TestAdjustmentFilePrepareEvent: """Tests for AdjustmentFilePrepareEvent schema.""" def test_valid_event_with_all_fields(self): """Test valid event with all fields.""" event = AdjustmentFilePrepareEvent( detail_type='adjustment_batch.initialized', detail=AdjustmentFilePrepareEventDetail( metadata=AdjustmentFilePrepareEventMetadata( target_type='worksheet_flowthrough_batch', target_id=123, correlation_id='corr-789', ), data=AdjustmentFilePrepareEventData( s3_bucket='test-bucket', s3_key='test/file.csv', ), ), ) assert event.detail.metadata.target_id == 123 assert event.detail.metadata.correlation_id == 'corr-789' assert event.detail.data.s3_bucket == 'test-bucket' assert event.detail.data.s3_key == 'test/file.csv' def test_valid_event_without_correlation_id(self): """Test valid event without optional correlation_id.""" event = AdjustmentFilePrepareEvent( detail_type='adjustment_batch.initialized', detail=AdjustmentFilePrepareEventDetail( metadata=AdjustmentFilePrepareEventMetadata( target_type='worksheet_flowthrough_batch', target_id=456, ), data=AdjustmentFilePrepareEventData( s3_bucket='another-bucket', s3_key='another/file.xlsx', ), ), ) assert event.detail.metadata.target_id == 456 assert event.detail.metadata.correlation_id is None assert event.detail.data.s3_bucket == 'another-bucket' assert event.detail.data.s3_key == 'another/file.xlsx' def test_missing_required_field_raises_error(self): """Test missing required fields raise ValidationError.""" with pytest.raises(ValidationError) as exc_info: AdjustmentFilePrepareEventData( s3_key='test/file.csv', ) assert 's3_bucket' in str(exc_info.value) with pytest.raises(ValidationError) as exc_info: AdjustmentFilePrepareEventData( s3_bucket='test-bucket', ) assert 's3_key' in str(exc_info.value) def test_invalid_field_type_raises_error(self): """Test invalid field type raises ValidationError.""" with pytest.raises(ValidationError) as exc_info: AdjustmentFilePrepareEventData( s3_bucket=123, # Should be string s3_key='test/file.csv', ) assert 's3_bucket' in str(exc_info.value) def test_event_ignores_extra_fields(self): """Test event ignores extra fields (extra='ignore').""" event = AdjustmentFilePrepareEvent( detail_type='adjustment_batch.initialized', detail=AdjustmentFilePrepareEventDetail( metadata=AdjustmentFilePrepareEventMetadata( target_type='worksheet_flowthrough_batch', target_id=123, ), data=AdjustmentFilePrepareEventData( s3_bucket='test-bucket', s3_key='test/file.csv', ), ), extra_field='should_be_ignored', ) assert event.detail.metadata.target_id == 123 assert not hasattr(event, 'extra_field')