"""Unit tests for worksheet_account_contract_closing_balance logic.""" from unittest.mock import call, patch from sqlalchemy import exc from payment.constants.constants import REVENUE_TRANSACTION_TYPES from payment.logic import worksheet_account_contract_closing_balance as logic from payment.repository.worksheet_account_contract_closing_balance import ( get_closing_balances_related_to_payment_accounts, ) from tests.utils.factories import ( PaymentGroupPaymentAccountDetailFactory, WorksheetAccountContractClosingBalanceFactory, WorksheetAccountContractTaxableRevenueFactory, WorksheetPayableBalanceAfterTaxFactory, ) @patch( 'payment.logic.worksheet_account_contract_closing_balance' '.WorksheetAccountContractClosingBalance' ) def test_delete(worksheet_account_contract_closing_balance_mock): """Test bulk delete method.""" worksheet_account_contract_closing_balance = ( WorksheetAccountContractClosingBalanceFactory.build() ) worksheet_account_contract_closing_balance_mock.soft_delete_by_event_id.return_value = ( # noqa: E501 None ) result = logic.bulk_delete( worksheet_account_contract_closing_balance.abacus_event_id ) assert result is None worksheet_account_contract_closing_balance_mock.soft_delete_by_event_id.assert_called_once_with( # noqa: E501 worksheet_account_contract_closing_balance.abacus_event_id ) @patch( 'payment.logic.worksheet_account_contract_closing_balance' '.WorksheetAccountContractClosingBalance' ) def test_get_by_ids(worksheet_account_contract_closing_balance_mock): """Test get_by_ids passes ids and returns items and total_count.""" instance = WorksheetAccountContractClosingBalanceFactory.build() worksheet_account_contract_closing_balance_mock.get_by_ids.return_value = ( [instance], 1, ) worksheet_closing_balance_ids = [ instance.worksheet_account_contract_closing_balance_id, 999, ] response = logic.get_by_ids( worksheet_closing_balance_ids=worksheet_closing_balance_ids ) assert response == {'items': [instance], 'total_count': 1} worksheet_account_contract_closing_balance_mock.get_by_ids.assert_called_once_with( worksheet_closing_balance_ids=worksheet_closing_balance_ids, limit=None, offset=None, ) @patch( 'payment.logic.worksheet_account_contract_closing_balance' '.WorksheetAccountContractClosingBalance' ) def test_get_by_ids_no_ids(worksheet_account_contract_closing_balance_mock): """Test get_by_ids with no ids passes None to the model.""" worksheet_account_contract_closing_balance_mock.get_by_ids.return_value = ([], 0) response = logic.get_by_ids() assert response == {'items': [], 'total_count': 0} worksheet_account_contract_closing_balance_mock.get_by_ids.assert_called_once_with( worksheet_closing_balance_ids=None, limit=None, offset=None, ) @patch( 'payment.logic.worksheet_account_contract_closing_balance' '.WorksheetAccountContractClosingBalance' ) def test_get_contracts_by_statement_period_id( worksheet_account_contract_closing_balance_mock, ): """Test get contracts by statement period id.""" limit = 10 offset = 0 worksheet_account_contract_closing_balance = ( WorksheetAccountContractClosingBalanceFactory.build() ) worksheet_account_contract_closing_balance_mock.get_by_statement_period_id.return_value = ( # noqa: E501 [worksheet_account_contract_closing_balance], 1, ) response = logic.get_by_statement_period_id( limit=limit, offset=offset, statement_period_id=worksheet_account_contract_closing_balance.statement_period_id, # noqa: E501 account_ids=[worksheet_account_contract_closing_balance.account_id], contract_ids=[worksheet_account_contract_closing_balance.contract_id], ) expected_data = { 'items': [worksheet_account_contract_closing_balance], 'total_count': 1, } assert response == expected_data worksheet_account_contract_closing_balance_mock.get_by_statement_period_id.assert_called_once_with( # noqa: E501 statement_period_id=worksheet_account_contract_closing_balance.statement_period_id, # noqa: E501 account_ids=[worksheet_account_contract_closing_balance.account_id], contract_ids=[worksheet_account_contract_closing_balance.contract_id], limit=limit, offset=offset, ) @patch('payment.logic.worksheet_account_contract_closing_balance.repository') def test_dataload_by_payment_account_ids( mock_repository, mock_accounts, mock_contracts, mock_abacus_event, mock_ledger_account_contracts, ): """Test dataload_by_payment_account_ids method.""" worksheet_closing_balance1 = WorksheetAccountContractClosingBalanceFactory.create( statement_period_id=1, worksheet_account_contract_closing_balance_id=111 ) worksheet_after_tax1 = WorksheetPayableBalanceAfterTaxFactory.create( # noqa worksheet_account_contract_closing_balance_id=worksheet_closing_balance1.worksheet_account_contract_closing_balance_id ) detail1 = PaymentGroupPaymentAccountDetailFactory.create( # noqa worksheet_account_contract_payable_after_tax_id=worksheet_after_tax1.worksheet_account_contract_payable_after_tax_id ) worksheet_closing_balance2 = WorksheetAccountContractClosingBalanceFactory.create( statement_period_id=2, worksheet_account_contract_closing_balance_id=222 ) worksheet_after_tax2 = WorksheetPayableBalanceAfterTaxFactory.create( # noqa worksheet_account_contract_closing_balance_id=worksheet_closing_balance2.worksheet_account_contract_closing_balance_id ) detail2 = PaymentGroupPaymentAccountDetailFactory.create( # noqa worksheet_account_contract_payable_after_tax_id=worksheet_after_tax2.worksheet_account_contract_payable_after_tax_id ) closing_balances_worksheets = get_closing_balances_related_to_payment_accounts( [ detail1.payment_group_payment_account_id, detail2.payment_group_payment_account_id, ] ) mock_repository.get_closing_balances_related_to_payment_accounts.return_value = ( closing_balances_worksheets ) result = logic.dataload_by_payment_account_ids( [ detail2.payment_group_payment_account_id, detail1.payment_group_payment_account_id, ] ) closing_balances_worksheets_sorted = sorted( closing_balances_worksheets, key=lambda i: i.payment_group_payment_account_id ) assert result == { 'items': [ {'data': closing_balances_worksheets_sorted[1]}, {'data': closing_balances_worksheets_sorted[0]}, ] } @patch('payment.logic.worksheet_account_contract_closing_balance.models') def test_create_worksheet_taxable_revenues( mock_models, mock_accounts, mock_statement_periods, mock_contracts, mock_abacus_event, mock_worksheet_account_contract_closing_balance, ): """Test _create_worksheet_taxable_revenues function.""" worksheet = WorksheetAccountContractClosingBalanceFactory.create() res = logic._create_worksheet_taxable_revenues([worksheet]) assert mock_models.WorksheetAccountContractTaxableRevenue.call_args_list == [ call( worksheet_account_contract_closing_balance_id=worksheet.worksheet_account_contract_closing_balance_id, # noqa account_id=worksheet.account_id, contract_id=worksheet.contract_id, reference_payment_entity_id=worksheet.reference_payment_entity_id, abacus_event_id=worksheet.abacus_event_id, statement_period_id=worksheet.statement_period_id, amount=worksheet.amount, revenue_transaction_type=REVENUE_TRANSACTION_TYPES.CLOSING_BALANCE, currency_code=worksheet.currency_code, ) ] assert len(res) == 1 @patch( 'payment.logic.worksheet_account_contract_closing_balance.' '_create_worksheet_taxable_revenues' ) @patch('payment.logic.worksheet_account_contract_closing_balance.models') @patch( 'payment.logic.worksheet_account_contract_closing_balance' '.WorksheetAccountContractClosingBalance' ) def test_bulk_copy_into_taxable_revenue_by_event_id_success( worksheet_account_contract_closing_balance_mock, mock_models, mock_method ): """Test copy logic from close balance to taxable revenue by event id.""" event_id = 1 worksheet_account_contract_closing_balance = ( WorksheetAccountContractClosingBalanceFactory.build() ) worksheet_account_contract_taxable_revenue = ( WorksheetAccountContractTaxableRevenueFactory.build() ) worksheet_account_contract_closing_balance_mock.get_by_abacus_event_id.return_value = [ worksheet_account_contract_closing_balance ] # noqa: E501 mock_method.return_value = [worksheet_account_contract_taxable_revenue] # noqa: E501 logic.bulk_copy_into_taxable_revenue_by_event_id(event_id) worksheet_account_contract_closing_balance_mock.get_by_abacus_event_id.assert_called_once_with( # noqa: E501 event_id ) mock_method.assert_called_once_with( # noqa: E501 [worksheet_account_contract_closing_balance] ) assert ( mock_models.WorksheetAccountContractTaxableRevenue.bulk_create.call_args_list == [call([worksheet_account_contract_taxable_revenue])] ) @patch( 'payment.logic.worksheet_account_contract_closing_balance.' '_create_worksheet_taxable_revenues' ) @patch('payment.logic.worksheet_account_contract_closing_balance.models') @patch( 'payment.logic.worksheet_account_contract_closing_balance' '.WorksheetAccountContractClosingBalance' ) def test_bulk_copy_into_taxable_revenue_by_event_id_failure( worksheet_account_contract_closing_balance_mock, mock_models, mock_method ): """Test copy logic in case of failure.""" event_id = 1 worksheet_account_contract_closing_balance = ( WorksheetAccountContractClosingBalanceFactory.build() ) worksheet_account_contract_taxable_revenue = ( WorksheetAccountContractTaxableRevenueFactory.build() ) worksheet_account_contract_closing_balance_mock.get_by_abacus_event_id.return_value = [ worksheet_account_contract_closing_balance ] # noqa: E501 mock_method.return_value = [worksheet_account_contract_taxable_revenue] # noqa: E501 mock_models.WorksheetAccountContractTaxableRevenue.bulk_create.side_effect = ( exc.IntegrityError(None, None, None) ) logic.bulk_copy_into_taxable_revenue_by_event_id(event_id) worksheet_account_contract_closing_balance_mock.get_by_abacus_event_id.assert_called_once_with( # noqa: E501 event_id ) mock_method.assert_called_once_with( # noqa: E501 [worksheet_account_contract_closing_balance] ) assert ( mock_models.WorksheetAccountContractTaxableRevenue.bulk_create.call_args_list == [call([worksheet_account_contract_taxable_revenue])] )