"""Unit tests for worksheet_account_contract_closing_balance handler.""" from payment.models.worksheet_account_contract_closing_balance import ( WorksheetAccountContractClosingBalance, ) from payment.models.worksheet_account_contract_taxable_revenue import ( WorksheetAccountContractTaxableRevenue, ) from tests.utils.factories import ( PaymentGroupPaymentAccountDetailFactory, WorksheetAccountContractClosingBalanceFactory, WorksheetPayableBalanceAfterTaxFactory, ) def test_bulk_create_success( fixture_client, mock_contracts, mock_accounts, mock_abacus_event, mock_statement_periods, mock_ledger_account_contracts, mock_worksheet_account_contract_closing_balance, ): """Test successful creation of worksheet_account_contract_closing_bal in bulk.""" worksheet_account_contract_closing_balance_1 = ( WorksheetAccountContractClosingBalanceFactory.build() ) worksheet_account_contract_closing_balance_2 = ( WorksheetAccountContractClosingBalanceFactory.build() ) post_body = [ { 'account_id': worksheet_account_contract_closing_balance_1.account_id, 'contract_id': 1, 'amount': str(worksheet_account_contract_closing_balance_1.amount), 'ledger_account_contract_id': worksheet_account_contract_closing_balance_1.ledger_account_contract_id, # noqa: E501 'currency_code': worksheet_account_contract_closing_balance_1.currency_code, 'includes_tax_adjustments': worksheet_account_contract_closing_balance_1.includes_tax_adjustments, # noqa: E501 }, { 'account_id': worksheet_account_contract_closing_balance_2.account_id, 'contract_id': 2, 'amount': str(worksheet_account_contract_closing_balance_2.amount), 'ledger_account_contract_id': worksheet_account_contract_closing_balance_2.ledger_account_contract_id, # noqa: E501 'currency_code': worksheet_account_contract_closing_balance_2.currency_code, 'includes_tax_adjustments': worksheet_account_contract_closing_balance_2.includes_tax_adjustments, # noqa: E501 }, ] event_id = 1 statement_period_id = 1 payment_entity_id = 1 assert WorksheetAccountContractClosingBalance.count_active() == 0 response = fixture_client.post( f'/worksheet-account-contract-closing-balance/event/{event_id}' f'/statement-period/{statement_period_id}' f'/payment-entity/{payment_entity_id}/bulk/', json=post_body, ) assert response.status_code == 201 assert len(response.json) == len(post_body) assert all( [ ( res.get('abacus_event_id') and res.get('statement_period_id') and res.get('reference_payment_entity_id') ) for res in response.json ] ) assert WorksheetAccountContractClosingBalance.count_active() == len(post_body) def test_create_success_not_respect_entity_id_in_post_body_and_throw_error( fixture_client, mock_contracts, mock_accounts, mock_abacus_event, mock_statement_periods, mock_ledger_account_contracts, mock_worksheet_account_contract_closing_balance, ): """Test successful creation of worksheet_account_contract_closing_bal in bulk.""" worksheet_account_contract_closing_balance_1 = ( WorksheetAccountContractClosingBalanceFactory.build() ) event_id = 1 statement_period_id = 1 payment_entity_id = 1 post_body = [ { 'worksheet_account_contract_closing_balance_id': 1, 'account_id': worksheet_account_contract_closing_balance_1.account_id, 'contract_id': 1, 'amount': str(worksheet_account_contract_closing_balance_1.amount), 'ledger_account_contract_id': worksheet_account_contract_closing_balance_1.ledger_account_contract_id, # noqa: E501 'currency_code': worksheet_account_contract_closing_balance_1.currency_code, 'includes_tax_adjustments': worksheet_account_contract_closing_balance_1.includes_tax_adjustments, # noqa: E501 } ] assert WorksheetAccountContractClosingBalance.count_active() == 0 response = fixture_client.post( f'/worksheet-account-contract-closing-balance/event/{event_id}' f'/statement-period/{statement_period_id}' f'/payment-entity/{payment_entity_id}/bulk/', json=post_body, ) assert response.status_code == 400 assert response.json['message'] == { 'json': { '0': {'worksheet_account_contract_closing_balance_id': ['Unknown field.']} } } # noqa: E501 def test_bulk_create_duplicate_contract_id( fixture_client, mock_contracts, mock_accounts, mock_abacus_event, mock_statement_periods, mock_ledger_account_contracts, mock_worksheet_account_contract_closing_balance, ): """Test creation with duplicate contract_id.""" event_id = 1 statement_period_id = 1 payment_entity_id = 1 worksheet_account_contract_closing_balance = ( WorksheetAccountContractClosingBalanceFactory.build() ) post_body = [ { 'account_id': worksheet_account_contract_closing_balance.account_id, 'contract_id': worksheet_account_contract_closing_balance.contract_id, 'amount': str(worksheet_account_contract_closing_balance.amount), 'ledger_account_contract_id': worksheet_account_contract_closing_balance.ledger_account_contract_id, # noqa: E501 'currency_code': worksheet_account_contract_closing_balance.currency_code, 'includes_tax_adjustments': worksheet_account_contract_closing_balance.includes_tax_adjustments, # noqa: E501 }, { 'account_id': worksheet_account_contract_closing_balance.account_id, 'contract_id': worksheet_account_contract_closing_balance.contract_id, 'amount': str(worksheet_account_contract_closing_balance.amount), 'ledger_account_contract_id': worksheet_account_contract_closing_balance.ledger_account_contract_id, # noqa: E501 'currency_code': worksheet_account_contract_closing_balance.currency_code, 'includes_tax_adjustments': worksheet_account_contract_closing_balance.includes_tax_adjustments, # noqa: E501 }, ] response = fixture_client.post( f'/worksheet-account-contract-closing-balance/event/{event_id}' f'/statement-period/{statement_period_id}' f'/payment-entity/{payment_entity_id}/bulk/', json=post_body, ) assert response.status_code == 400 assert response.json['message'] == 'Duplicate contract_id in request' assert WorksheetAccountContractClosingBalance.count_active() == 0 def test_bulk_create_already_exist( fixture_client, mock_contracts, mock_accounts, mock_abacus_event, mock_statement_periods, mock_ledger_account_contracts, mock_worksheet_account_contract_closing_balance, ): """Test creation of worksheet_account_contract_closing_bal with existing record.""" event_id = 1 statement_period_id = 1 payment_entity_id = 1 worksheet_account_contract_closing_balance = ( WorksheetAccountContractClosingBalanceFactory.build() ) post_body = [ { 'account_id': worksheet_account_contract_closing_balance.account_id, 'contract_id': worksheet_account_contract_closing_balance.contract_id, 'amount': str(worksheet_account_contract_closing_balance.amount), 'ledger_account_contract_id': worksheet_account_contract_closing_balance.ledger_account_contract_id, # noqa: E501 'currency_code': worksheet_account_contract_closing_balance.currency_code, 'includes_tax_adjustments': worksheet_account_contract_closing_balance.includes_tax_adjustments, # noqa: E501 } ] fixture_client.post( f'/worksheet-account-contract-closing-balance/event/{event_id}' f'/statement-period/{statement_period_id}' f'/payment-entity/{payment_entity_id}/bulk/', json=post_body, ) post_body = [ { 'account_id': worksheet_account_contract_closing_balance.account_id, 'contract_id': worksheet_account_contract_closing_balance.contract_id, 'amount': str(worksheet_account_contract_closing_balance.amount), 'ledger_account_contract_id': worksheet_account_contract_closing_balance.ledger_account_contract_id, # noqa: E501 'currency_code': worksheet_account_contract_closing_balance.currency_code, 'includes_tax_adjustments': worksheet_account_contract_closing_balance.includes_tax_adjustments, # noqa: E501 } ] response = fixture_client.post( f'/worksheet-account-contract-closing-balance/event/{event_id}' f'/statement-period/{statement_period_id}' f'/payment-entity/{payment_entity_id}/bulk/', json=post_body, ) assert response.status_code == 400 assert response.json['message'] == 'The worksheet already exists' assert WorksheetAccountContractClosingBalance.count_active() == 1 def test_bulk_create_validation_error( fixture_client, mock_contracts, mock_accounts, mock_abacus_event, mock_statement_periods, mock_ledger_account_contracts, mock_worksheet_account_contract_closing_balance, ): """Test creation of worksheet_account_contract_closing_bal with validation error.""" event_id = 1 statement_period_id = 1 payment_entity_id = 1 post_body = [ { 'account_id': -1, 'contract_id': -1, 'amount': 'invalid', 'ledger_account_contract_id': -1, 'currency_code': 'invalid', # technically valid currency code 'includes_tax_adjustments': 'invalid', }, { 'account_id': -1, }, ] response = fixture_client.post( f'/worksheet-account-contract-closing-balance/event/{event_id}' f'/statement-period/{statement_period_id}' f'/payment-entity/{payment_entity_id}/bulk/', json=post_body, ) assert response.status_code == 400 assert response.json['message'] == { 'json': { '0': { 'account_id': ['Must be greater than or equal to 0.'], 'contract_id': ['Must be greater than or equal to 0.'], 'amount': ['Not a valid number.'], 'ledger_account_contract_id': ['Must be greater than or equal to 0.'], 'includes_tax_adjustments': ['Not a valid boolean.'], }, '1': { 'account_id': ['Must be greater than or equal to 0.'], 'contract_id': ['Must be specified.'], 'amount': ['Must be specified.'], 'ledger_account_contract_id': ['Must be specified.'], 'currency_code': ['Must be specified.'], 'includes_tax_adjustments': ['Must be specified.'], }, } } assert WorksheetAccountContractClosingBalance.count_active() == 0 def test_bulk_create_validation_error_no_data( fixture_client, mock_contracts, mock_accounts, mock_abacus_event, mock_statement_periods, mock_ledger_account_contracts, mock_worksheet_account_contract_closing_balance, ): """Test creation of worksheet_account_contract_closing_bal with no data.""" event_id = 1 statement_period_id = 1 payment_entity_id = 1 response = fixture_client.post( f'/worksheet-account-contract-closing-balance/event/{event_id}' f'/statement-period/{statement_period_id}' f'/payment-entity/{payment_entity_id}/bulk/', json=[], ) assert response.status_code == 400 assert response.json['message'] == 'No instances to create' assert WorksheetAccountContractClosingBalance.count_active() == 0 def test_bulk_create_validation_integrity_error( fixture_client, mock_contracts, mock_accounts, mock_abacus_event, mock_statement_periods, mock_ledger_account_contracts, mock_worksheet_account_contract_closing_balance, ): """Test creation of worksheet with integrity error.""" event_id = 999 statement_period_id = 999 payment_entity_id = 999 post_body = [ { 'account_id': 999, 'contract_id': 999, 'amount': '1.00', 'ledger_account_contract_id': 999, 'currency_code': 'USD', 'includes_tax_adjustments': False, } ] response = fixture_client.post( f'/worksheet-account-contract-closing-balance/event/{event_id}' f'/statement-period/{statement_period_id}' f'/payment-entity/{payment_entity_id}/bulk/', json=post_body, ) assert response.status_code == 400 assert ( response.json['message'] == 'IntegrityError: Cannot add or update a child row' ) assert WorksheetAccountContractClosingBalance.count_active() == 0 def test_delete_success( fixture_client, mock_contracts, mock_accounts, mock_abacus_event, mock_statement_periods, mock_ledger_account_contracts, mock_worksheet_account_contract_closing_balance, ): """Test successful deletion of worksheet_account_contract_closing_bal.""" abacus_event_id = 1 WorksheetAccountContractClosingBalanceFactory.create( abacus_event_id=abacus_event_id, contract_id=1, account_id=1, ) WorksheetAccountContractClosingBalanceFactory.create( abacus_event_id=abacus_event_id, contract_id=2, account_id=1, ) WorksheetAccountContractClosingBalanceFactory.create(abacus_event_id=2) response = fixture_client.delete( f'/worksheet-account-contract-closing-balance/event/{abacus_event_id}/bulk' ) assert response.status_code == 204 assert response.data == b'' assert WorksheetAccountContractClosingBalance.count_active() == 1 abacus_event_id = 2 response = fixture_client.delete( f'/worksheet-account-contract-closing-balance/event/{abacus_event_id}/bulk' ) assert response.status_code == 204 assert response.data == b'' assert WorksheetAccountContractClosingBalance.count_active() == 0 """Indicating that no currently active records were located. Essentially, they've all been deleted from a technical standpoint""" abacus_event_id = 999 response = fixture_client.delete( f'/worksheet-account-contract-closing-balance/event/{abacus_event_id}/bulk' ) assert response.status_code == 204 assert response.data == b'' assert WorksheetAccountContractClosingBalance.count_active() == 0 def test_get_by_statement_period_id_success( fixture_client, mock_contracts, mock_accounts, mock_abacus_event, mock_statement_periods, mock_ledger_account_contracts, mock_worksheet_account_contract_closing_balance, ): """Test successful retrieval of worksheet_account_contract_closing_bal.""" statement_period_id = 1 account_id = 1 contract_id = 1 limit = 10 offset = 0 abacus_event_id = 10 WorksheetAccountContractClosingBalanceFactory.create( statement_period_id=statement_period_id, account_id=account_id, contract_id=contract_id, abacus_event_id=abacus_event_id, ) response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 f'?account_ids={account_id}&account_ids=2&limit={limit}&offset={offset}' ) assert response.status_code == 200 assert response.json['total_count'] == 1 assert response.json['items'][0]['statement_period_id'] == statement_period_id response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 f'?contract_ids={contract_id}&contract_ids=2&limit={limit}&offset={offset}' ) assert response.status_code == 200 assert response.json['total_count'] == 1 assert response.json['items'][0]['statement_period_id'] == statement_period_id response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 f'?account_ids={account_id}' ) assert response.status_code == 200 assert response.json['total_count'] == 1 assert response.json['items'][0]['statement_period_id'] == statement_period_id response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 f'?contract_ids={contract_id}' ) assert response.status_code == 200 assert response.json['total_count'] == 1 assert response.json['items'][0]['statement_period_id'] == statement_period_id response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 f'?limit={limit}&offset={offset}' ) assert response.status_code == 200 assert response.json['total_count'] == 1 assert response.json['items'][0]['statement_period_id'] == statement_period_id response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 ) assert response.status_code == 200 assert response.json['total_count'] == 1 assert response.json['items'][0]['statement_period_id'] == statement_period_id account_id = 2 contract_id = 2 abacus_event_id = 11 WorksheetAccountContractClosingBalanceFactory.create( statement_period_id=statement_period_id, account_id=account_id, contract_id=contract_id, abacus_event_id=abacus_event_id, ) response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 f'?account_ids={account_id}&limit={limit}&offset={offset}' ) assert response.status_code == 200 assert response.json['total_count'] == 1 assert response.json['items'][0]['statement_period_id'] == statement_period_id response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 f'?contract_ids={contract_id}&limit={limit}&offset={offset}' ) assert response.status_code == 200 assert response.json['total_count'] == 1 assert response.json['items'][0]['statement_period_id'] == statement_period_id response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 f'?account_ids={account_id}' ) assert response.status_code == 200 assert response.json['total_count'] == 1 assert response.json['items'][0]['statement_period_id'] == statement_period_id response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 f'?contract_ids={contract_id}' ) assert response.status_code == 200 assert response.json['total_count'] == 1 assert response.json['items'][0]['statement_period_id'] == statement_period_id response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 f'?limit={limit}&offset={offset}' ) assert response.status_code == 200 assert response.json['total_count'] == 2 assert response.json['items'][0]['statement_period_id'] == statement_period_id assert response.json['items'][1]['statement_period_id'] == statement_period_id assert ( response.json['items'][0]['account_id'] != response.json['items'][1]['account_id'] ) assert ( response.json['items'][0]['contract_id'] != response.json['items'][1]['contract_id'] ) response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 ) assert response.status_code == 200 assert response.json['total_count'] == 2 assert response.json['items'][0]['statement_period_id'] == statement_period_id assert response.json['items'][1]['statement_period_id'] == statement_period_id assert ( response.json['items'][0]['account_id'] != response.json['items'][1]['account_id'] ) assert ( response.json['items'][0]['contract_id'] != response.json['items'][1]['contract_id'] ) def test_get_by_statement_period_id_fail( fixture_client, mock_contracts, mock_accounts, mock_abacus_event, mock_statement_periods, mock_ledger_account_contracts, mock_worksheet_account_contract_closing_balance, ): """Test retrieval of worksheet_account_contract_closing_bal with no data.""" statement_period_id = 1 response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 ) assert response.status_code == 200 assert response.json['total_count'] == 0 assert response.json['items'] == [] response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 '?account_ids=1' ) assert response.status_code == 200 assert response.json['total_count'] == 0 assert response.json['items'] == [] response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 '?contract_ids=1' ) assert response.status_code == 200 assert response.json['total_count'] == 0 assert response.json['items'] == [] response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 '?limit=10&offset=0' ) assert response.status_code == 200 assert response.json['total_count'] == 0 assert response.json['items'] == [] response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 '?account_ids=1&limit=10&offset=0' ) assert response.status_code == 200 assert response.json['total_count'] == 0 assert response.json['items'] == [] response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 '?contract_ids=1&limit=10&offset=0' ) assert response.status_code == 200 assert response.json['total_count'] == 0 assert response.json['items'] == [] WorksheetAccountContractClosingBalanceFactory.create( statement_period_id=1, account_id=2, abacus_event_id=12, ) response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 ) assert response.status_code == 200 assert response.json['total_count'] == 1 assert response.json['items'][0]['statement_period_id'] == statement_period_id response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 '?account_ids=-1' ) assert response.status_code == 400 assert response.json['message'] == { 'query': {'account_ids': {'0': ['Must be greater than or equal to 1.']}} } response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 '?contract_ids=-1' ) assert response.status_code == 400 assert response.json['message'] == { 'query': {'contract_ids': {'0': ['Must be greater than or equal to 1.']}} } response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 '?account_ids=1&limit=0&offset=1' ) assert response.status_code == 400 assert response.json['message'] == { 'query': { 'limit': [ 'Must be greater than or equal to 1 and less than or equal to 300.' ] } } response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 '?account_ids=1&limit=1&offset=-1' ) assert response.status_code == 400 assert response.json['message'] == { 'query': {'offset': ['Must be greater than or equal to 0.']} } response = fixture_client.get( '/worksheet-account-contract-closing-balance/statement-period/-1/' '?account_ids=1&limit=1&offset=0' ) assert response.status_code == 404 account_ids = ','.join([str(i) for i in range(1, 400)]) response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 f'?account_ids={account_ids}&limit=1&offset=0' ) assert response.status_code == 400 assert response.json['message'] == { 'query': {'account_ids': ['Length must be between 0 and 300.']} } contact_ids = ','.join([str(i) for i in range(1, 400)]) response = fixture_client.get( f'/worksheet-account-contract-closing-balance/statement-period/{statement_period_id}/' # noqa: E501 f'?contract_ids={contact_ids}&limit=1&offset=0' ) assert response.status_code == 400 assert response.json['message'] == { 'query': {'contract_ids': ['Length must be between 0 and 300.']} } def test_worksheets_by_payment_account_ids_dataloader_success( fixture_client, mock_accounts, mock_contracts, mock_abacus_event, mock_ledger_account_contracts, ): """ Test POST request success. Endpoint: /worksheet-account-contract-closing-balance/by-payment-account-ids/dataloader. """ cb1 = 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=cb1.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 ) cb2 = 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=cb2.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 ) test_ids = [ detail1.payment_group_payment_account_id, detail2.payment_group_payment_account_id, ] res = fixture_client.post( '/worksheet-account-contract-closing-balance/by-payment-account-ids/dataloader', json=test_ids, ) assert res.status_code == 200, res.text assert res.json == { 'items': [ { 'data': { 'worksheet_account_contract_closing_balance_id': cb1.worksheet_account_contract_closing_balance_id, 'account_id': cb1.account_id, 'contract_id': cb1.contract_id, 'reference_payment_entity_id': cb1.reference_payment_entity_id, 'abacus_event_id': cb1.abacus_event_id, 'ledger_account_contract_id': cb1.ledger_account_contract_id, 'statement_period_id': cb1.statement_period_id, 'currency_code': cb1.currency_code, 'amount': str(cb1.amount), 'includes_tax_adjustments': cb1.includes_tax_adjustments, } }, { 'data': { 'worksheet_account_contract_closing_balance_id': cb2.worksheet_account_contract_closing_balance_id, 'account_id': cb2.account_id, 'contract_id': cb2.contract_id, 'reference_payment_entity_id': cb2.reference_payment_entity_id, 'abacus_event_id': cb2.abacus_event_id, 'ledger_account_contract_id': cb2.ledger_account_contract_id, 'statement_period_id': cb2.statement_period_id, 'currency_code': cb2.currency_code, 'amount': str(cb2.amount), 'includes_tax_adjustments': cb2.includes_tax_adjustments, } }, ] } def test_worksheets_by_payment_account_ids_dataloader_failure( fixture_client, ): """ Test POST request success. Endpoint: /worksheet-account-contract-closing-balance/by-payment-account-ids/dataloader. """ test_ids = ['test_123'] res = fixture_client.post( '/worksheet-account-contract-closing-balance/by-payment-account-ids/dataloader', json=test_ids, ) assert res.status_code == 400, res.text assert res.json == { 'code': 'error', 'message': { 'json': {'ids': {'0': ['Must be an integer greater or equal to ' '0.']}} }, } def test_get_bulk_by_worksheet_closing_balance_ids_success( fixture_client, mock_contracts, mock_accounts, mock_abacus_event, mock_statement_periods, mock_ledger_account_contracts, mock_worksheet_account_contract_closing_balance, ): """Test successful retrieval of closing balances by primary key IDs via POST /bulk.""" cb1 = WorksheetAccountContractClosingBalanceFactory.create( contract_id=1, account_id=1, abacus_event_id=10, statement_period_id=1 ) cb2 = WorksheetAccountContractClosingBalanceFactory.create( contract_id=2, account_id=2, abacus_event_id=11, statement_period_id=1 ) response = fixture_client.post( '/worksheet-account-contract-closing-balance/bulk', json={ 'filters': { 'worksheet_closing_balance_ids': [ cb1.worksheet_account_contract_closing_balance_id, cb2.worksheet_account_contract_closing_balance_id, ] } }, ) assert response.status_code == 200 assert response.json['total_count'] == 2 assert len(response.json['items']) == 2 returned_ids = { item['worksheet_account_contract_closing_balance_id'] for item in response.json['items'] } assert cb1.worksheet_account_contract_closing_balance_id in returned_ids assert cb2.worksheet_account_contract_closing_balance_id in returned_ids def test_get_bulk_by_worksheet_closing_balance_ids_partial_match( fixture_client, mock_contracts, mock_accounts, mock_abacus_event, mock_statement_periods, mock_ledger_account_contracts, mock_worksheet_account_contract_closing_balance, ): """Test that non-existent IDs are silently omitted.""" cb = WorksheetAccountContractClosingBalanceFactory.create( contract_id=1, account_id=1, abacus_event_id=10, statement_period_id=1 ) response = fixture_client.post( '/worksheet-account-contract-closing-balance/bulk', json={ 'filters': { 'worksheet_closing_balance_ids': [ cb.worksheet_account_contract_closing_balance_id, 99999, ] } }, ) assert response.status_code == 200 assert response.json['total_count'] == 1 assert len(response.json['items']) == 1 assert ( response.json['items'][0]['worksheet_account_contract_closing_balance_id'] == cb.worksheet_account_contract_closing_balance_id ) def test_get_bulk_by_worksheet_closing_balance_ids_excludes_deleted( fixture_client, mock_contracts, mock_accounts, mock_abacus_event, mock_statement_periods, mock_ledger_account_contracts, mock_worksheet_account_contract_closing_balance, ): """Test that soft-deleted records are excluded.""" cb_active = WorksheetAccountContractClosingBalanceFactory.create( contract_id=1, account_id=1, abacus_event_id=10, statement_period_id=1 ) cb_deleted = WorksheetAccountContractClosingBalanceFactory.create( contract_id=2, account_id=2, abacus_event_id=10, statement_period_id=1, deleted_at='2021-10-01', ) response = fixture_client.post( '/worksheet-account-contract-closing-balance/bulk', json={ 'filters': { 'worksheet_closing_balance_ids': [ cb_active.worksheet_account_contract_closing_balance_id, cb_deleted.worksheet_account_contract_closing_balance_id, ] } }, ) assert response.status_code == 200 assert response.json['total_count'] == 1 assert len(response.json['items']) == 1 assert ( response.json['items'][0]['worksheet_account_contract_closing_balance_id'] == cb_active.worksheet_account_contract_closing_balance_id ) def test_get_bulk_by_worksheet_closing_balance_ids_pagination( fixture_client, mock_contracts, mock_accounts, mock_abacus_event, mock_statement_periods, mock_ledger_account_contracts, mock_worksheet_account_contract_closing_balance, ): """Test pagination via limit and offset query params.""" cb1 = WorksheetAccountContractClosingBalanceFactory.create( contract_id=1, account_id=1, abacus_event_id=10, statement_period_id=1 ) cb2 = WorksheetAccountContractClosingBalanceFactory.create( contract_id=2, account_id=2, abacus_event_id=11, statement_period_id=1 ) filters = { 'filters': { 'worksheet_closing_balance_ids': [ cb1.worksheet_account_contract_closing_balance_id, cb2.worksheet_account_contract_closing_balance_id, ] } } response = fixture_client.post( '/worksheet-account-contract-closing-balance/bulk?limit=1&offset=0', json=filters, ) assert response.status_code == 200 assert response.json['total_count'] == 2 assert len(response.json['items']) == 1 response = fixture_client.post( '/worksheet-account-contract-closing-balance/bulk?limit=1&offset=1', json=filters, ) assert response.status_code == 200 assert response.json['total_count'] == 2 assert len(response.json['items']) == 1 response = fixture_client.post( '/worksheet-account-contract-closing-balance/bulk?limit=1&offset=2', json=filters, ) assert response.status_code == 200 assert response.json['total_count'] == 2 assert len(response.json['items']) == 0 def test_get_bulk_by_worksheet_closing_balance_ids_no_filters( fixture_client, mock_contracts, mock_accounts, mock_abacus_event, mock_statement_periods, mock_ledger_account_contracts, mock_worksheet_account_contract_closing_balance, ): """Test that omitting filters returns all active records (fields are optional).""" WorksheetAccountContractClosingBalanceFactory.create( contract_id=1, account_id=1, abacus_event_id=10, statement_period_id=1 ) WorksheetAccountContractClosingBalanceFactory.create( contract_id=2, account_id=2, abacus_event_id=11, statement_period_id=1 ) response = fixture_client.post( '/worksheet-account-contract-closing-balance/bulk', json={}, ) assert response.status_code == 200 assert response.json['total_count'] == 2 def test_get_bulk_by_worksheet_closing_balance_ids_invalid_ids(fixture_client): """Test that an empty worksheet_closing_balance_ids list returns 400.""" response = fixture_client.post( '/worksheet-account-contract-closing-balance/bulk', json={'filters': {'worksheet_closing_balance_ids': []}}, ) assert response.status_code == 400 def test_bulk_copy_close_balances_to_taxable_revenues( fixture_client, mock_contracts, mock_accounts, mock_abacus_event, mock_ledger_account_contracts, mock_statement_periods, ): """Test successful creation of worksheet_account_contract_closing_bal in bulk.""" abacus_event_id = 1 WorksheetAccountContractClosingBalance.create( contract_id=1, account_id=1, abacus_event_id=abacus_event_id, statement_period_id=1, ledger_account_contract_id=1, reference_payment_entity_id=1, currency_code='USD', amount=100, ) WorksheetAccountContractClosingBalance.create( contract_id=2, account_id=2, abacus_event_id=abacus_event_id, statement_period_id=3, ledger_account_contract_id=1, reference_payment_entity_id=1, currency_code='EUR', amount=200, ) assert ( len( WorksheetAccountContractClosingBalance.get_by_abacus_event_id( abacus_event_id ) ) == 2 ) # noqa: E501 assert WorksheetAccountContractTaxableRevenue.count() == 0 response = fixture_client.post( f'/worksheet-account-contract-closing-balance/event/{abacus_event_id}' '/taxable-revenue/copy/' ) assert response.status_code == 201 assert WorksheetAccountContractTaxableRevenue.count() == 2