"""Test PayoneerRefreshProcessor.""" from unittest.mock import call, MagicMock, patch from src.processors.payoneer_payments import payoneer_refresh_processor as mod from src.processors.payoneer_payments.payoneer_refresh_processor import ( PayoneerRefreshProcessor, ) from tests.unit.factories import ( EventFactory, PayableBalanceAfterTaxEntryFactory, PaymentGroupFactory, ) @patch.object(mod, 'get_all_payable_balance_after_tax_entries_by_event') def test_set_all_worksheet_after_tax_entries(mock_get_all: MagicMock) -> None: """Fetched entries populate the batch list and total count.""" entries = PayableBalanceAfterTaxEntryFactory.batch(3) mock_get_all.return_value = entries processor = PayoneerRefreshProcessor( PaymentGroupFactory.build(), EventFactory.build() ) processor._set_all_worksheet_after_tax_entries() processor._set_total_count() assert processor._all_worksheet_after_tax_entries == entries assert processor._total_count == 3 mock_get_all.assert_called_once_with(processor._abacus_event) @patch.object(mod, 'PaymentBatchRefreshProcessor') @patch.object(mod, 'get_all_payable_balance_after_tax_entries_by_event') def test_process_no_entries_returns_early( mock_get_all: MagicMock, mock_batch_processor: MagicMock ) -> None: """With no entries the processor returns without spawning a batch processor.""" mock_get_all.return_value = [] processor = PayoneerRefreshProcessor( PaymentGroupFactory.build(), EventFactory.build() ) processor.process() mock_batch_processor.assert_not_called() @patch.object(mod, 'PaymentBatchRefreshProcessor') @patch.object(mod, 'get_all_payable_balance_after_tax_entries_by_event') def test_process_batches_entries( mock_get_all: MagicMock, mock_batch_processor: MagicMock ) -> None: """Entries are processed in batches of self._limit, one batch processor each.""" entries = PayableBalanceAfterTaxEntryFactory.batch(3) mock_get_all.return_value = entries processor = PayoneerRefreshProcessor( PaymentGroupFactory.build(), EventFactory.build() ) processor._limit = 2 # force two batches processor.process() assert mock_batch_processor.call_args_list == [ call(processor._abacus_event, entries[0:2], append_vat_corrections=True), call(processor._abacus_event, entries[2:3], append_vat_corrections=True), ] assert mock_batch_processor.return_value.process.call_count == 2 @patch.object(mod, 'PaymentBatchRefreshProcessor') @patch.object(mod, 'get_all_payable_balance_after_tax_entries_by_event') def test_process_check_payment_skips_vat( mock_get_all: MagicMock, mock_batch_processor: MagicMock ) -> None: """Check payments refresh wht only: batches run with append_vat_corrections=False.""" entries = PayableBalanceAfterTaxEntryFactory.batch(2) mock_get_all.return_value = entries processor = PayoneerRefreshProcessor( PaymentGroupFactory.build(), EventFactory.build(), is_check_payment=True ) processor.process() assert mock_batch_processor.call_args_list == [ call(processor._abacus_event, entries[0:2], append_vat_corrections=False), ] def test_get_worksheet_after_tax_batch_data_slices() -> None: """Batch data is sliced by offset and limit.""" entries = PayableBalanceAfterTaxEntryFactory.batch(5) processor = PayoneerRefreshProcessor( PaymentGroupFactory.build(), EventFactory.build() ) processor._all_worksheet_after_tax_entries = entries processor._limit = 2 assert processor._get_worksheet_after_tax_batch_data(0) == entries[0:2] assert processor._get_worksheet_after_tax_batch_data(2) == entries[2:4] assert processor._get_worksheet_after_tax_batch_data(4) == entries[4:5]