"""Pytest configuration and fixtures.""" import gc from unittest.mock import Mock import pytest from src.constants import AdjustmentInputSchema def pytest_sessionfinish(session, exitstatus): """Clean up after test session to prevent hangs. Args: session: The pytest session object. exitstatus: The exit status of the test session. """ gc.collect() gc.collect() # Run twice to handle circular references # Shared Fixtures @pytest.fixture def mock_royalty_accounting_client(): """Mock RoyaltyAccountingClient with common defaults.""" mock = Mock() mock.update_batch_status.return_value = 1 mock.delete_batch_from_staging.return_value = 0 mock_cursor = Mock() mock_cursor.rowcount = 100 mock_cursor.__enter__ = Mock(return_value=mock_cursor) mock_cursor.__exit__ = Mock(return_value=False) mock_conn = Mock() mock_conn.cursor.return_value = mock_cursor mock.conn = mock_conn return mock @pytest.fixture def mock_s3_connector(): """Mock S3Connector with common defaults.""" mock = Mock() metadata = Mock() metadata.size = 10 * 1024 * 1024 # 10 MB metadata.etag = 'abc123-2' # Multipart ETag (skips checksum validation) mock.get_file_metadata.return_value = metadata return mock @pytest.fixture def mock_duck_conn(): """Mock DuckDBConnector with common defaults.""" mock = Mock() mock.get_file_columns.return_value = { c.display_name for c in AdjustmentInputSchema.COLUMNS } mock.get_table_columns.return_value = [ c.display_name for c in AdjustmentInputSchema.COLUMNS ] mock.get_table_row_count.return_value = 10 # Mock inner connection inner_conn = Mock() cursor = Mock() cursor.__enter__ = Mock(return_value=cursor) cursor.__exit__ = Mock(return_value=False) inner_conn.cursor.return_value = cursor # Mock execute().fetchall() for get_file_columns execute_result = Mock() execute_result.fetchall.return_value = [ (c.display_name,) for c in AdjustmentInputSchema.COLUMNS ] inner_conn.execute.return_value = execute_result mock._conn = inner_conn mock.cursor.return_value = cursor return mock @pytest.fixture def mock_s3_file_downloader(): """Mock S3 file downloader.""" return Mock() @pytest.fixture def mock_adjustment_file_validator(): """Mock DuckDBValidator with common defaults.""" mock = Mock() mock.init.return_value = None # Mock the validation result validation_result = Mock() validation_result.valid_rows = 10 validation_result.invalid_rows = 0 validation_result.total_amount_raw = 1000.0 validation_result.total_amount = 1000.0 mock.validate.return_value = validation_result return mock @pytest.fixture def mock_adjustment_file_loader(): """Mock AdjustmentFileLoader.""" return Mock() @pytest.fixture def mock_reference_data_service(): """Mock ReferenceDataService.""" return Mock()