from sqlalchemy import func, select from payment.api import db """Functional tests for worksheet_account_contract_taxable_revenue endpoints.""" from payment.constants import constants from payment.models import WorksheetAccountContractTaxableRevenue from tests.utils.factories import ( PaymentGroupPaymentAccountFactory, PaymentGroupPaymentBatchAccountFactory, PaymentGroupPaymentBatchFactory, WorksheetAccountContractTaxableRevenueFactory, ) def test_bulk_create_worksheet_account_contract_taxable_revenue_success( fixture_client, mock_abacus_event, mock_statement_periods, mock_accounts, mock_contracts, ): """Test for bulk_create_worksheet_account_contract_taxable_revenue endpoint. POST: /worksheet-account-contract-taxable-revenue/event/{event_id}/bulk """ event_id = 1 post_data = ( { 'contract_id': 1, 'account_id': 1, 'statement_period_id': 1, 'reference_payment_entity_id': 1, 'amount': '10.00', 'currency_code': 'USD', 'is_us_revenue': False, 'revenue_transaction_type': 'digital', }, { 'contract_id': 2, 'account_id': 2, 'statement_period_id': 2, 'reference_payment_entity_id': 1, 'amount': '20.00', 'currency_code': 'USD', 'is_us_revenue': True, 'revenue_transaction_type': 'closing_balance', }, ) res = fixture_client.post( f'/worksheet-account-contract-taxable-revenue/event/{event_id}/bulk', json=post_data, # noqa: E501 ) assert res.status_code == 201 assert res.json == constants.BULK_ENDPOINT_SUCCESS_RESPONSE assert db.session.execute( select(func.count()).select_from( select(WorksheetAccountContractTaxableRevenue).subquery() ) ).scalar_one() == len(post_data) def test_bulk_create_worksheet_account_contract_taxable_revenue_failure_validation( fixture_client, mock_statement_periods, mock_accounts, mock_contracts ): """Test for bulk_create_worksheet_account_contract_taxable_revenue endpoint failure validation. POST: /worksheet-account-contract-taxable-revenue/event/1/bulk """ # noqa: E501 post_data = ( { 'account_id': 1, 'statement_period_id': 1, 'reference_payment_entity_id': 1, 'amount': '10.00', 'currency_code': 'USD', 'is_us_revenue': False, 'revenue_transaction_type': 'digital', }, { 'contract_id': 2, 'statement_period_id': 2, 'reference_payment_entity_id': 2, 'amount': '20.00', 'currency_code': 'USD', 'is_us_revenue': True, 'revenue_transaction_type': 'closing_balance', }, ) res = fixture_client.post( '/worksheet-account-contract-taxable-revenue/event/1/bulk', json=post_data ) assert res.status_code == 400 assert res.json == { 'code': 'error', 'message': { 'json': { '0': {'contract_id': ['Must be specified.']}, '1': {'account_id': ['Must be specified.']}, } }, } assert ( db.session.execute( select(func.count()).select_from( select(WorksheetAccountContractTaxableRevenue).subquery() ) ).scalar_one() == 0 ) def test_bulk_create_worksheet_account_contract_taxable_revenue_failure_logic( fixture_client, mock_statement_periods, mock_accounts, mock_contracts ): """Test for bulk_create_worksheet_account_contract_taxable_revenue endpoint failure logic. POST: /worksheet-account-contract-taxable-revenue/event/1/bulk """ # noqa: E501 post_data = ( { 'contract_id': 1, 'account_id': 1, 'statement_period_id': 1, 'reference_payment_entity_id': 1, 'amount': '10.00', 'currency_code': 'USD', 'is_us_revenue': False, 'revenue_transaction_type': 'digital', }, { 'contract_id': 1, 'account_id': 1, 'statement_period_id': 1, 'reference_payment_entity_id': 1, 'amount': '10.00', 'currency_code': 'USD', 'is_us_revenue': False, 'revenue_transaction_type': 'digital', }, ) res = fixture_client.post( '/worksheet-account-contract-taxable-revenue/event/1/bulk', json=post_data ) assert res.status_code == 400 assert res.json == { 'code': 'error', 'message': 'IntegrityError: Cannot add or update a child row', } assert ( db.session.execute( select(func.count()).select_from( select(WorksheetAccountContractTaxableRevenue).subquery() ) ).scalar_one() == 0 ) def test_bulk_worksheet_account_contract_taxable_revenue( fixture_client, mock_abacus_event, mock_statement_periods, mock_accounts, mock_contracts, mock_worksheet_account_contract_closing_balance, ): """Test bulk_delete_worksheet_account_contract_taxable_revenue endpoint.""" entity = WorksheetAccountContractTaxableRevenueFactory.create(abacus_event_id=1) WorksheetAccountContractTaxableRevenueFactory.create(abacus_event_id=2) res = fixture_client.delete('/worksheet-account-contract-taxable-revenue/event/1/') assert res.status_code == 204, res.text assert db.session.execute( select(WorksheetAccountContractTaxableRevenue).where( WorksheetAccountContractTaxableRevenue.deleted_at != None # noqa ) ).scalars().all() == [entity] def test_get_worksheet_account_contract_taxable_revenue_list_success( fixture_client, mock_contracts, mock_accounts, mock_abacus_event, mock_statement_periods, mock_worksheet_account_contract_closing_balance, ): """Test POST /worksheet-account-contract-taxable-revenue/statement-period/.""" worksheet1 = WorksheetAccountContractTaxableRevenueFactory.create( contract_id=1, worksheet_account_contract_closing_balance_id=1, statement_period_id=1, ) worksheet2 = WorksheetAccountContractTaxableRevenueFactory.create( contract_id=2, worksheet_account_contract_closing_balance_id=2, statement_period_id=1, ) res = fixture_client.post( '/worksheet-account-contract-taxable-revenue/statement-period' '/1/?limit=100&offset=0', json={ 'filters': { 'contract_ids': [1, 2], 'closing_balance_ids': [1, 2], } }, ) assert res.status_code == 200, res.text assert res.json['total_count'] == 2 assert ( res.json['items'][0]['account_contract_taxable_revenue_id'] == worksheet1.account_contract_taxable_revenue_id ) assert ( res.json['items'][1]['account_contract_taxable_revenue_id'] == worksheet2.account_contract_taxable_revenue_id ) def test_get_tax_corrections_failure( fixture_client, mock_contracts, mock_accounts, mock_abacus_event, mock_statement_periods, mock_worksheet_account_contract_closing_balance, ): """Test POST /worksheet-account-contract-taxable-revenue/statement-period/.""" res = fixture_client.post( '/worksheet-account-contract-taxable-revenue/statement-period' '/1/?limit=1a&offset=0b', json={ 'filters': { 'contract_ids': [1, 2], 'closing_balance_ids': [1, 2], } }, ) assert res.status_code == 400, res.text assert res.json == { 'code': 'error', 'message': { 'query': { 'limit': ['Not a valid integer.'], 'offset': ['Not a valid integer.'], } }, } res = fixture_client.post( '/worksheet-account-contract-taxable-revenue/statement-period' '/1/?limit=100&offset=0', json={ 'filters': { 'contract_ids': ['1a', '2b'], 'closing_balance_ids': ['1a', '2b'], } }, ) assert res.status_code == 400, res.text assert res.json == { 'code': 'error', 'message': { 'json': { 'filters': { 'closing_balance_ids': { '0': ['Must be an ' 'integer ' 'greater or ' 'equal to 0.'], '1': ['Must be an ' 'integer ' 'greater or ' 'equal to 0.'], }, 'contract_ids': { '0': ['Must be an integer ' 'greater or equal to ' '0.'], '1': ['Must be an integer ' 'greater or equal to ' '0.'], }, } } }, } def test_get_catchup_taxable_revenue_list_success( fixture_client, mock_abacus_event, mock_statement_periods, mock_accounts, mock_contracts, mock_worksheet_account_contract_closing_balance, create_mock_payment_state, ): """Test POST /worksheet-account-contract-taxable-revenue/catchup.""" payment_group_payment_account = PaymentGroupPaymentAccountFactory.create( account_id=1, current_statement_period_id=1, payment_group_payment_account_id=7, # complete in mocked state ) payment_group_payment_batch = PaymentGroupPaymentBatchFactory.create( payment_group_payment_batch_id=3 # complete in mocked state ) PaymentGroupPaymentBatchAccountFactory.create( payment_group_payment_batch=payment_group_payment_batch, payment_group_payment_account=payment_group_payment_account, ) worksheet = WorksheetAccountContractTaxableRevenueFactory.create( account_id=1, statement_period_id=2 ) res = fixture_client.post( '/worksheet-account-contract-taxable-revenue/catchup' '/?limit=100&offset=0', json={ 'filters': { 'account_ids': [1], } }, ) assert res.status_code == 200, res.text assert res.json['total_count'] == 1 assert ( res.json['items'][0]['account_contract_taxable_revenue_id'] == worksheet.account_contract_taxable_revenue_id ) def test_get_catchup_taxable_revenue_list_failure( fixture_client, mock_abacus_event, mock_statement_periods, mock_accounts, mock_contracts, mock_worksheet_account_contract_closing_balance, create_mock_payment_state, ): """Test POST /worksheet-account-contract-taxable-revenue/catchup.""" res = fixture_client.post( '/worksheet-account-contract-taxable-revenue/catchup' '/?limit=1a&offset=0b', json={ 'filters': { 'account_ids': [1, 2], } }, ) assert res.status_code == 400, res.text assert res.json == { 'code': 'error', 'message': { 'query': { 'limit': ['Not a valid integer.'], 'offset': ['Not a valid integer.'], } }, } res = fixture_client.post( '/worksheet-account-contract-taxable-revenue/catchup' '/?limit=100&offset=0', json={ 'filters': { 'account_ids': ['1a', '2b'], } }, ) assert res.status_code == 400, res.text assert res.json == { 'code': 'error', 'message': { 'json': { 'filters': { 'account_ids': { '0': ['Must be an integer ' 'greater or equal to ' '0.'], '1': ['Must be an integer ' 'greater or equal to ' '0.'], }, } } }, }