"""Unit tests for PaymentGroupPaymentAccountDetail model.""" from decimal import Decimal from abacus_common_logic.connectors.database import db from sqlalchemy import func, select from payment.models.payment_group_payment_account_detail import ( PaymentGroupPaymentAccountDetail, ) from tests.utils.factories import ( PaymentGroupPaymentAccountDetailFactory, PaymentGroupPaymentAccountFactory, WorksheetAccountContractClosingBalanceFactory, WorksheetPayableBalanceAfterTaxFactory, ) def test_create( mock_accounts, mock_contracts, mock_abacus_event, mock_ledger_account_contracts ): """Create a PaymentGroupPaymentAccountDetail.""" new_payment_account = PaymentGroupPaymentAccountFactory.create() worksheet_closing_balance = WorksheetAccountContractClosingBalanceFactory.create() worksheet_after_tax = WorksheetPayableBalanceAfterTaxFactory.create( # noqa worksheet_account_contract_closing_balance_id=worksheet_closing_balance.worksheet_account_contract_closing_balance_id ) PaymentGroupPaymentAccountDetail.create( # noqa payment_group_payment_account_id=new_payment_account.payment_group_payment_account_id, account_id=1, contract_id=1, payable_amount_pre_tax=Decimal('100.01'), tax_withholding_amount=Decimal('10.01'), vat_amount=Decimal('-11.11'), payable_amount_post_tax=Decimal('90.00'), currency_code='USD', # noqa worksheet_account_contract_payable_after_tax_id=worksheet_after_tax.worksheet_account_contract_payable_after_tax_id, ) details = ( db.session.execute(select(PaymentGroupPaymentAccountDetail)).scalars().all() ) assert len(details) == 1 assert new_payment_account.details == details detail = details[0] assert detail.account_id == 1 assert detail.contract_id == 1 assert detail.currency_code == 'USD' assert detail.payable_amount_pre_tax == Decimal('100.01') assert detail.tax_withholding_amount == Decimal('10.01') assert detail.vat_amount == Decimal('-11.11') assert detail.payable_amount_post_tax == Decimal('90.00') assert not detail.deleted_at assert not detail.deleted_by def test_soft_delete_by_payment_group_payment( mock_accounts, mock_contracts, mock_abacus_event, mock_ledger_account_contracts ): """Test deleting by payment_group_payment.""" worksheet_closing_balance = WorksheetAccountContractClosingBalanceFactory.create() worksheet_after_tax = WorksheetPayableBalanceAfterTaxFactory.create( # noqa worksheet_account_contract_closing_balance_id=worksheet_closing_balance.worksheet_account_contract_closing_balance_id ) detail1 = PaymentGroupPaymentAccountDetailFactory.create( # noqa worksheet_account_contract_payable_after_tax_id=worksheet_after_tax.worksheet_account_contract_payable_after_tax_id ) PaymentGroupPaymentAccountDetailFactory.create( # noqa worksheet_account_contract_payable_after_tax_id=worksheet_after_tax.worksheet_account_contract_payable_after_tax_id ) PaymentGroupPaymentAccountDetail.soft_delete_by_payment_group_payment( detail1.payment_group_payment_account.payment_group_payment_id ) assert db.session.execute( select(PaymentGroupPaymentAccountDetail).where( PaymentGroupPaymentAccountDetail.deleted_at != None # noqa ) ).scalars().all() == [detail1] def test_soft_delete_by_payment_group_payment_account( mock_accounts, mock_contracts, mock_abacus_event, mock_ledger_account_contracts ): """Test deleting by payment_group_payment_account.""" worksheet_closing_balance = WorksheetAccountContractClosingBalanceFactory.create() worksheet_after_tax = WorksheetPayableBalanceAfterTaxFactory.create( # noqa worksheet_account_contract_closing_balance_id=worksheet_closing_balance.worksheet_account_contract_closing_balance_id ) detail1 = PaymentGroupPaymentAccountDetailFactory.create( # noqa worksheet_account_contract_payable_after_tax_id=worksheet_after_tax.worksheet_account_contract_payable_after_tax_id ) PaymentGroupPaymentAccountDetailFactory.create( # noqa worksheet_account_contract_payable_after_tax_id=worksheet_after_tax.worksheet_account_contract_payable_after_tax_id ) PaymentGroupPaymentAccountDetail.soft_delete_by_payment_group_payment_account( detail1.payment_group_payment_account.payment_group_payment_account_id ) assert db.session.execute( select(PaymentGroupPaymentAccountDetail).where( PaymentGroupPaymentAccountDetail.deleted_at != None # noqa ) ).scalars().all() == [detail1] def test_hard_delete_by_payment_group_payment_account( mock_accounts, mock_contracts, mock_abacus_event, mock_ledger_account_contracts ): """Test hard deleting by payment_group_payment_account.""" worksheet_closing_balance = WorksheetAccountContractClosingBalanceFactory.create() worksheet_after_tax = WorksheetPayableBalanceAfterTaxFactory.create( worksheet_account_contract_closing_balance_id=worksheet_closing_balance.worksheet_account_contract_closing_balance_id ) detail1 = PaymentGroupPaymentAccountDetailFactory.create( worksheet_account_contract_payable_after_tax_id=worksheet_after_tax.worksheet_account_contract_payable_after_tax_id ) detail2 = PaymentGroupPaymentAccountDetailFactory.create( worksheet_account_contract_payable_after_tax_id=worksheet_after_tax.worksheet_account_contract_payable_after_tax_id ) detail1_id = detail1.payment_group_payment_account_detail_id payment_account_id = ( detail1.payment_group_payment_account.payment_group_payment_account_id ) assert ( db.session.execute( select(func.count()).select_from( select(PaymentGroupPaymentAccountDetail) .where( PaymentGroupPaymentAccountDetail.payment_group_payment_account_detail_id == detail1_id ) .subquery() ) ).scalar_one() == 1 ) PaymentGroupPaymentAccountDetail.hard_delete_by_payment_group_payment_account( payment_account_id ) assert ( db.session.execute( select(func.count()).select_from( select(PaymentGroupPaymentAccountDetail) .where( PaymentGroupPaymentAccountDetail.payment_group_payment_account_detail_id == detail1_id ) .subquery() ) ).scalar_one() == 0 )