"""Worksheet tax correction logic tests.""" from decimal import Decimal from unittest.mock import call, patch import pytest from sqlalchemy import exc from payment.constants import error from payment.logic import worksheet_account_contract_taxable_revenue as logic from payment.logic.exceptions import LogicError from tests.utils.factories import ( WorksheetAccountContractTaxableRevenueFactory, ) @patch( 'payment.logic.worksheet_account_contract_taxable_revenue' '.WorksheetAccountContractTaxableRevenue' ) def test_bulk_create_success( mock_model, mock_abacus_event, mock_statement_periods, mock_accounts, mock_contracts, ): """Test bulk_create_method success.""" test_create_params = [ { 'account_id': 1, 'contract_id': 1, 'statement_period_id': 1, 'reference_payment_entity_id': 1, 'amount': Decimal(10.00), 'currency_code': 'USD', 'is_us_revenue': False, 'revenue_transaction_type': 'digital', }, { 'account_id': 2, 'contract_id': 2, 'statement_period_id': 2, 'reference_payment_entity_id': 1, 'amount': Decimal(20.00), 'currency_code': 'USD', 'is_us_revenue': True, 'revenue_transaction_type': 'closing_balance', }, ] event_id = 1 worksheet1 = WorksheetAccountContractTaxableRevenueFactory.build( **test_create_params[0] ) # noqa: E501 worksheet2 = WorksheetAccountContractTaxableRevenueFactory.build( **test_create_params[1] ) # noqa: E501 mock_model.side_effect = [worksheet1, worksheet2] instances = logic.bulk_create(event_id, test_create_params) assert instances == [worksheet1, worksheet2] assert mock_model.call_args_list == [ call(**{**param, 'abacus_event_id': event_id}) for param in test_create_params ] assert mock_model.bulk_create.call_args_list == [call([worksheet1, worksheet2])] @patch( 'payment.logic.worksheet_account_contract_taxable_revenue' '.WorksheetAccountContractTaxableRevenue' ) def test_bulk_create_failure( mock_model, mock_abacus_event, mock_statement_periods, mock_accounts, mock_contracts, ): """Test bulk_create_method failure.""" event_id = 1 test_create_params = [ { 'account_id': 1, 'statement_period_id': 1, 'reference_payment_entity_id': 1, 'amount': Decimal(10.00), 'currency_code': 'USD', 'is_us_revenue': False, 'revenue_transaction_type': 'digital', }, { 'contract_id': 2, 'statement_period_id': 2, 'reference_payment_entity_id': 1, 'amount': Decimal(20.00), 'currency_code': 'USD', 'is_us_revenue': True, 'revenue_transaction_type': 'closing_balance', }, ] worksheet1 = WorksheetAccountContractTaxableRevenueFactory.build( **test_create_params[0] ) # noqa: E501 worksheet2 = WorksheetAccountContractTaxableRevenueFactory.build( **test_create_params[1] ) # noqa: E501 mock_model.side_effect = [worksheet1, worksheet2] mock_model.bulk_create.side_effect = exc.IntegrityError(None, None, None) with pytest.raises(LogicError, match=error.ERROR_INTEGRITY): logic.bulk_create(event_id, test_create_params) assert mock_model.call_args_list == [ call(**{**param, 'abacus_event_id': event_id}) for param in test_create_params ] assert mock_model.bulk_create.call_args_list == [call([worksheet1, worksheet2])] @patch( 'payment.logic.worksheet_account_contract_taxable_revenue.' 'WorksheetAccountContractTaxableRevenue' ) def test_bulk_delete(mock_model, faker): """Def test bulk_delete_method.""" event_id = faker.pyint() logic.bulk_delete(event_id) assert mock_model.soft_delete_by_event_id(event_id) @patch( 'payment.logic.worksheet_account_contract_taxable_revenue.WorksheetAccountContractTaxableRevenue' ) def test_get_list( mock_model, mock_abacus_event, mock_statement_periods, mock_accounts, mock_contracts, mock_worksheet_account_contract_closing_balance, faker, ): """Test get_list function.""" worksheet = WorksheetAccountContractTaxableRevenueFactory.create() statement_period_id = faker.pyint() contract_ids = faker.pylist(value_types=[int]) closing_balance_ids = faker.pylist(value_types=[int]) limit = faker.pyint(20, 300) offset = faker.pyint(1, 10) mock_model.get_filtered_items.return_value = ( [worksheet], 1, ) result = logic.get_list( statement_period_id, limit, offset, contract_ids, closing_balance_ids, ) assert result == {'items': [worksheet], 'total_count': 1} assert mock_model.get_filtered_items.call_args_list == [ call( statement_period_id=statement_period_id, limit=limit, offset=offset, contract_ids=contract_ids, closing_balance_ids=closing_balance_ids, ) ] @patch('payment.logic.worksheet_account_contract_taxable_revenue.repository') def test_catchup_taxable_revenue( mock_repository, mock_abacus_event, mock_statement_periods, mock_accounts, mock_contracts, mock_worksheet_account_contract_closing_balance, faker, ): """Test catchup_taxable_revenue function.""" worksheet = WorksheetAccountContractTaxableRevenueFactory.create() account_ids = faker.pylist(value_types=[int]) limit = faker.pyint(20, 300) offset = faker.pyint(1, 10) mock_repository.catchup_taxable_revenue.return_value = ( [worksheet], 1, ) result = logic.catchup_taxable_revenue( limit, offset, account_ids, ) assert result == {'items': [worksheet], 'total_count': 1} assert mock_repository.catchup_taxable_revenue.call_args_list == [ call( limit=limit, offset=offset, account_ids=account_ids, ) ]