"""Tests for EarningsTransferProcessor.""" from __future__ import annotations from unittest.mock import MagicMock, patch import pytest from src.errors import InputValidationError from src.processor import EarningsTransferProcessor class TestProcessRecords: """Test process_records (manual trigger path).""" @patch('src.processor.write_output_to_buffer', return_value=b'xlsx') @patch('src.processor.evaluate') @patch('src.processor.get_s3_connector') def test_success_skips_s3_download( self, mock_s3_factory: MagicMock, mock_evaluate: MagicMock, mock_write: MagicMock, ) -> None: """process_records does not call S3 download.""" mock_s3 = MagicMock() mock_s3_factory.return_value = mock_s3 mock_evaluate.return_value = [MagicMock()] processor = EarningsTransferProcessor('bucket') result = processor.process_records([MagicMock()]) mock_s3.download_object.assert_not_called() mock_s3.upload_buffer.assert_called_once() assert result.record_count == 1 @patch('src.processor.get_s3_connector') def test_empty_records_raises(self, mock_s3_factory: MagicMock) -> None: mock_s3_factory.return_value = MagicMock() processor = EarningsTransferProcessor('bucket') with pytest.raises(InputValidationError, match='No records provided'): processor.process_records([]) @patch('src.processor.write_output_to_buffer', return_value=b'xlsx') @patch('src.processor.evaluate') @patch('src.processor.get_s3_connector') def test_output_key_uses_source( self, mock_s3_factory: MagicMock, mock_evaluate: MagicMock, mock_write: MagicMock, ) -> None: mock_s3 = MagicMock() mock_s3_factory.return_value = mock_s3 mock_evaluate.return_value = [MagicMock()] processor = EarningsTransferProcessor('bucket') result = processor.process_records([MagicMock()], source='my-source') assert result.output_key == 'output/my-source_output.xlsx' assert result.format == 'my-source' @patch('src.processor.write_output_to_buffer', return_value=b'xlsx') @patch('src.processor.evaluate') @patch('src.processor.get_s3_connector') def test_default_source_is_ows_royalties( self, mock_s3_factory: MagicMock, mock_evaluate: MagicMock, mock_write: MagicMock, ) -> None: mock_s3 = MagicMock() mock_s3_factory.return_value = mock_s3 mock_evaluate.return_value = [MagicMock()] processor = EarningsTransferProcessor('bucket') result = processor.process_records([MagicMock()]) assert result.output_key == 'output/ows-royalties_output.xlsx' assert result.format == 'ows-royalties'