"""Worksheet tax correction vat logic tests.""" from unittest.mock import call, patch import pytest from sqlalchemy import exc from payment.constants import constants, error from payment.logic import worksheet_tax_correction_vat as logic from payment.logic.exceptions import LogicError from tests.utils.factories import WorksheetTaxCorrectionVATFactory @patch('payment.logic.worksheet_tax_correction_vat.WorksheetTaxCorrectionVAT') def test_bulk_create_success( mock_model, mock_statement_periods, mock_accounts, mock_contracts ): """Test bulk_create_method success.""" test_create_params = [ { 'payable_detail_type_id': 1, 'account_id': 1, 'correction_statement_period_id': 1, 'base_amount_payee_currency': 10.00, 'payee_currency_code': 'USD', 'vat_currency_code': 'USD', 'vat_rate': 10.00, 'vat_amount_payee_currency': 10.00, 'vat_amount_vat_currency': 10.00, 'net_amount_payee_currency': 10.00, 'note': 'test note 1', }, { 'payable_detail_type_id': 2, 'contract_id': 2, 'correction_statement_period_id': 2, 'base_amount_payee_currency': 10.00, 'payee_currency_code': 'USD', 'vat_currency_code': 'USD', 'vat_rate': 10.00, 'vat_amount_payee_currency': 10.00, 'vat_amount_vat_currency': 10.00, 'net_amount_payee_currency': 10.00, 'note': 'test note 1', }, ] worksheet1 = WorksheetTaxCorrectionVATFactory.build(**test_create_params[0]) worksheet2 = WorksheetTaxCorrectionVATFactory.build(**test_create_params[1]) mock_model.side_effect = [worksheet1, worksheet2] instances = logic.bulk_create(test_create_params) assert instances == [worksheet1, worksheet2] assert mock_model.call_args_list == [call(**param) for param in test_create_params] assert mock_model.bulk_create.call_args_list == [call([worksheet1, worksheet2])] @patch('payment.logic.worksheet_tax_correction_vat.WorksheetTaxCorrectionVAT') def test_bulk_create_failure( mock_model, mock_statement_periods, mock_accounts, mock_contracts ): """Test bulk_create_method failure.""" test_create_params = [ { 'payable_detail_type_id': 1, 'account_id': 1, 'correction_statement_period_id': 1, 'base_amount_payee_currency': 10.00, 'payee_currency_code': 'USD', 'vat_currency_code': 'USD', 'vat_rate': 10.00, 'vat_amount_payee_currency': 10.00, 'vat_amount_vat_currency': 10.00, 'net_amount_payee_currency': 10.00, 'note': 'test note 1', }, { 'payable_detail_type_id': 2, 'contract_id': 2, 'correction_statement_period_id': 2, 'base_amount_payee_currency': 10.00, 'payee_currency_code': 'USD', 'vat_currency_code': 'USD', 'vat_rate': 10.00, 'vat_amount_payee_currency': 10.00, 'vat_amount_vat_currency': 10.00, 'net_amount_payee_currency': 10.00, 'note': 'test note 1', }, ] worksheet1 = WorksheetTaxCorrectionVATFactory.build(**test_create_params[0]) worksheet2 = WorksheetTaxCorrectionVATFactory.build(**test_create_params[1]) 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(test_create_params) assert mock_model.call_args_list == [call(**param) for param in test_create_params] assert mock_model.bulk_create.call_args_list == [call([worksheet1, worksheet2])] def test_bulk_create_failure_no_instances( mock_statement_periods, mock_accounts, mock_contracts ): """Test bulk_create_method failure.""" with pytest.raises(LogicError, match=error.ERROR_NO_INSTANCES_TO_CREATE): logic.bulk_create([]) @pytest.mark.parametrize( 'correction_status', ( (constants.CORRECTION_STATUSES.PENDING,), (constants.CORRECTION_STATUSES.ACTIVE,), ), ) @patch('payment.logic.worksheet_tax_correction_vat.repository') def test_get_tax_corrections_vat( mock_repository, correction_status, mock_accounts, mock_contracts, mock_abacus_event, mock_ledger_account_contracts, faker, ): """Test get_tax_corrections_vat method.""" tax_correction = WorksheetTaxCorrectionVATFactory.create() correction_statement_period_id = faker.pyint() contract_ids = faker.pylist(value_types=[int]) worksheet_tax_correction_vat_ids = faker.pylist(value_types=[int]) test_limit = faker.pyint(20, 300) test_offset = faker.pyint(1, 10) mock_repository.get_filtered_worksheet_tax_corrections_vat.return_value = ( [tax_correction], 1, ) result = logic.get_tax_corrections_vat( correction_status, correction_statement_period_id, contract_ids, worksheet_tax_correction_vat_ids, test_limit, test_offset, ) assert result == {'items': [tax_correction], 'total_count': 1} assert ( mock_repository.get_filtered_worksheet_tax_corrections_vat.call_args_list == [ call( correction_status, correction_statement_period_id, contract_ids, worksheet_tax_correction_vat_ids, test_limit, test_offset, ) ] ) @patch('payment.logic.worksheet_tax_correction_vat.WorksheetTaxCorrectionVAT') def test_delete_worksheet_tax_corrections_vat(mock_model, faker): """Def test delete_worksheet_tax_corrections_vat function.""" ids = faker.pylist(value_types=[int]) logic.delete_worksheet_tax_corrections_vat(ids) assert mock_model.soft_delete_by_ids(ids)