"""Functional tests for ReferencePaymentEntity.""" from unittest.mock import patch from abacus_contract.tests.utils.factories import ReferencePaymentEntityFactory from core.config import Config def test_get_reference_payment_entity_by_id(fixture_client): """Test to get ReferencePaymentEntity by ID.""" reference_payment_entity = ReferencePaymentEntityFactory.create() reference_payment_entity_id = reference_payment_entity.reference_payment_entity_id res = fixture_client.get(f'/reference-payment-entity/{reference_payment_entity_id}') assert res.status_code == 200 cache_control = res.headers.get('Cache-Control', '') assert 'max-age=300' in cache_control assert 'public' in cache_control assert res.json == { 'reference_payment_entity_id': reference_payment_entity.reference_payment_entity_id, 'payment_entity_name': reference_payment_entity.payment_entity_name, 'country_of_tax_reporting': reference_payment_entity.country_of_tax_reporting, } def test_get_reference_payment_entity_list(fixture_client): """Test to get a list of reference_payment_entity.""" payment_entity_names = ['AWAL-UK', 'AWAL-US'] [ ReferencePaymentEntityFactory.create(payment_entity_name=name) for name in payment_entity_names ] res = fixture_client.get('/reference-payment-entities/') assert res.status_code == 200 items = res.json.get('items') assert len(payment_entity_names) == res.json.get('total_count') assert items[0]['payment_entity_name'] == payment_entity_names[0] assert items[1]['payment_entity_name'] == payment_entity_names[1] def test_get_reference_payment_entity_list_with_country_tax_reporting(fixture_client): """Test to get a list of reference_payment_entity.""" countries_of_tax_reporting = ['UK', 'US'] [ ReferencePaymentEntityFactory.create(country_of_tax_reporting=country) for country in countries_of_tax_reporting ] res = fixture_client.get('/reference-payment-entities/') assert res.status_code == 200 items = res.json.get('items') assert len(countries_of_tax_reporting) == res.json.get('total_count') assert items[0]['country_of_tax_reporting'] == countries_of_tax_reporting[0] assert items[1]['country_of_tax_reporting'] == countries_of_tax_reporting[1] def test_get_payment_entities_dataloader(fixture_client): """Dataloader returns one ordered entry per requested id (dedup, null for misses).""" uk = ReferencePaymentEntityFactory.create( payment_entity_name='AWAL-UK', country_of_tax_reporting='UK' ) us = ReferencePaymentEntityFactory.create( payment_entity_name='AWAL-US', country_of_tax_reporting='US' ) missing_id = ( max(uk.reference_payment_entity_id, us.reference_payment_entity_id) + 1000 ) # Duplicate ids exercise dedup; the missing id shapes to null. res = fixture_client.post( '/reference-payment-entity/dataloader', json=[ uk.reference_payment_entity_id, us.reference_payment_entity_id, missing_id, uk.reference_payment_entity_id, ], ) assert res.status_code == 200 assert res.json == [ { 'data': { 'reference_payment_entity_id': uk.reference_payment_entity_id, 'payment_entity_name': 'AWAL-UK', 'country_of_tax_reporting': 'UK', } }, { 'data': { 'reference_payment_entity_id': us.reference_payment_entity_id, 'payment_entity_name': 'AWAL-US', 'country_of_tax_reporting': 'US', } }, {'data': None}, ] def test_get_payment_entities_dataloader_invalid_ids_returns_400(fixture_client): """Non-integer ids are rejected with a validation error.""" res = fixture_client.post( '/reference-payment-entity/dataloader', json=['not-an-int'] ) assert res.status_code == 400 def test_get_payment_entities_dataloader_null_id_returns_400(fixture_client): """A null id raises TypeError (not ValueError); must still be 400, not 500.""" res = fixture_client.post('/reference-payment-entity/dataloader', json=[None]) assert res.status_code == 400 def test_get_payment_entities_dataloader_over_limit_returns_400(fixture_client): """More than OWS_BATCH_LIMIT ids are rejected before touching the DB.""" res = fixture_client.post( '/reference-payment-entity/dataloader', json=list(range(Config.OWS_BATCH_LIMIT + 1)), ) assert res.status_code == 400 @patch( 'abacus_contract.blueprints.reference_payment_entity' '.authorization.pdp_authorize_resource' ) @patch( 'abacus_contract.blueprints.reference_payment_entity' '.flask_request.verify_rules_access_standalone' ) def test_get_payment_entities_dataloader_forbidden( mock_verify_rules, mock_pdp, fixture_client ): """403 when neither rules-access nor the PDP fallback authorizes the caller.""" mock_verify_rules.return_value = False mock_pdp.return_value = False res = fixture_client.post('/reference-payment-entity/dataloader', json=[1, 2]) assert res.status_code == 403