"""Functional tests for historical contract advance endpoints.""" import pytest from abacus_contract.tests.utils.factories import ( AccountContractFactory, ContractFactory, HistoricalContractAdvanceFactory, ) def test_get_historical_contract_advances_dataloader_empty_list(fixture_client): """Test POST /historical-contract-advances/dataloader with empty list.""" res = fixture_client.post( '/historical-contract-advances/dataloader', json=[], content_type='application/json', ) assert res.status_code == 200 assert res.json == [] def test_get_historical_contract_advances_dataloader_single_contract( fixture_client, create_mock_account ): """Test POST /historical-contract-advances/dataloader with single contract.""" contract = ContractFactory.create() account_contract = AccountContractFactory.create(contract=contract, account_id=1) advances = HistoricalContractAdvanceFactory.create_batch(2, account_id=1) contract_ids = [contract.contract_id] res = fixture_client.post( '/historical-contract-advances/dataloader', json=contract_ids ) assert res.status_code == 200 assert len(res.json) == 1 assert res.json[0]['data'] is not None assert len(res.json[0]['data']) == 2 advance_data = res.json[0]['data'][0] assert 'id' in advance_data assert 'oa_advance_id' in advance_data assert 'oa_contract_id' in advance_data assert 'account_id' in advance_data assert 'amount' in advance_data assert 'currency' in advance_data assert 'due_type' in advance_data assert 'contract_id' in advance_data assert advance_data['contract_id'] == contract.contract_id def test_get_historical_contract_advances_dataloader_multiple_contracts( fixture_client, create_mock_account ): """Test POST /historical-contract-advances/dataloader with multiple contracts.""" contract1 = ContractFactory.create() account_contract1 = AccountContractFactory.create(contract=contract1, account_id=1) advances1 = HistoricalContractAdvanceFactory.create_batch(2, account_id=1) contract2 = ContractFactory.create() account_contract2 = AccountContractFactory.create(contract=contract2, account_id=2) advances2 = HistoricalContractAdvanceFactory.create_batch(1, account_id=2) contract3 = ContractFactory.create() account_contract3 = AccountContractFactory.create(contract=contract3, account_id=3) contract_ids = [contract1.contract_id, contract2.contract_id, contract3.contract_id] res = fixture_client.post( '/historical-contract-advances/dataloader', json=contract_ids ) assert res.status_code == 200 assert len(res.json) == 3 assert res.json[0]['data'] is not None assert len(res.json[0]['data']) == 2 assert res.json[1]['data'] is not None assert len(res.json[1]['data']) == 1 assert res.json[2]['data'] is None def test_get_historical_contract_advances_dataloader_no_advances( fixture_client, create_mock_account ): """Test POST /historical-contract-advances/dataloader when contract has no advances.""" contract = ContractFactory.create() account_contract = AccountContractFactory.create(contract=contract, account_id=1) contract_ids = [contract.contract_id] res = fixture_client.post( '/historical-contract-advances/dataloader', json=contract_ids ) assert res.status_code == 200 assert len(res.json) == 1 assert res.json[0]['data'] is None def test_get_historical_contract_advances_dataloader_nonexistent_contract( fixture_client, ): """Test POST /historical-contract-advances/dataloader with non-existent contract ID.""" contract_ids = [999999] res = fixture_client.post( '/historical-contract-advances/dataloader', json=contract_ids ) assert res.status_code == 200 assert len(res.json) == 1 assert res.json[0]['data'] is None def test_get_historical_contract_advances_dataloader_invalid_input(fixture_client): """Test POST /historical-contract-advances/dataloader with invalid input.""" res = fixture_client.post( '/historical-contract-advances/dataloader', json=['invalid'] ) assert res.status_code == 400 def test_get_historical_contract_advances_dataloader_same_account_multiple_contracts( fixture_client, create_mock_account ): """Test when multiple contracts share the same account.""" contract1 = ContractFactory.create() account_contract1 = AccountContractFactory.create(contract=contract1, account_id=1) contract2 = ContractFactory.create() account_contract2 = AccountContractFactory.create(contract=contract2, account_id=1) advances = HistoricalContractAdvanceFactory.create_batch(3, account_id=1) contract_ids = [contract1.contract_id, contract2.contract_id] res = fixture_client.post( '/historical-contract-advances/dataloader', json=contract_ids ) assert res.status_code == 200 assert len(res.json) == 2 assert res.json[0]['data'] is not None assert len(res.json[0]['data']) == 3 assert res.json[1]['data'] is not None assert len(res.json[1]['data']) == 3 def test_get_historical_contract_advances_dataloader_sorted_by_date_paid( fixture_client, create_mock_account ): """Test advances sorted by date_paid descending.""" contract = ContractFactory.create() AccountContractFactory.create(contract=contract, account_id=1) HistoricalContractAdvanceFactory.create(account_id=1, date_paid='2024-01-15') HistoricalContractAdvanceFactory.create(account_id=1, date_paid='2024-03-20') HistoricalContractAdvanceFactory.create(account_id=1, date_paid='2024-02-10') HistoricalContractAdvanceFactory.create(account_id=1, date_paid=None) contract_ids = [contract.contract_id] res = fixture_client.post( '/historical-contract-advances/dataloader', json=contract_ids ) assert res.status_code == 200 assert len(res.json) == 1 assert res.json[0]['data'] is not None assert len(res.json[0]['data']) == 4 advances = res.json[0]['data'] assert advances[0]['date_paid'] == '2024-03-20' assert advances[1]['date_paid'] == '2024-02-10' assert advances[2]['date_paid'] == '2024-01-15' assert advances[3]['date_paid'] is None