"""Tests for reference_sap_profit_center handlers.""" from unittest.mock import MagicMock, patch import pytest from flask.testing import FlaskClient from owsresponse import response from owsresponse.adaptors.flask import flaskify from abacus_contract.schemas.reference_sap_profit_center import ( ReferenceSapProfitCenterSchema, ) from abacus_contract.tests.utils.factories import ( ReferenceSapProfitCenterFactory, ReferenceSigningEntityFactory, SigningEntitySapProfitCenterFactory, ) @pytest.mark.parametrize( ('profile_type', 'profile_role', 'authorize_return', 'expected_status'), [ pytest.param( 'AbacusProfile', 'administrator', None, 200, id='standalone check' ), pytest.param( 'Account360Profile', 'account360', True, 200, id='pdp check, authorized' ), pytest.param( 'Account360Profile', 'account360', False, 403, id='pdp check, unauthorized' ), ], ) @patch('abacus_contract.blueprints.reference_sap_profit_center.pdp_authorize_resource') @patch('abacus_contract.blueprints.reference_sap_profit_center.ItemView.get') def test_get_reference_sap_profit_center_by_id( mock_super_get: MagicMock, mock_pdp_authorize_resource: MagicMock, fixture_client: FlaskClient, profile_type: str, profile_role: str, authorize_return: bool, expected_status: int, ): """Test successfully retrieving reference sap profit center by id.""" mock_response = flaskify( response.Response( message={ 'reference_sap_profit_center_id': 1, 'business_group': 'ORC', 'company_code': '3', 'profit_center': 'UK4914', }, status=200, ) ) mock_super_get.return_value = mock_response mock_pdp_authorize_resource.return_value = authorize_return res = fixture_client.get( '/reference-sap-profit-center/1', headers={ 'Orchard-Requestor-Service': 'graphql-abacus', 'Orchard-Profile-Type': profile_type, 'Orchard-Profile-Id': '1234', 'Orchard-Roles': profile_role, 'Orchard-Identity-Id': '1234', }, ) if expected_status == 200: assert res.json == mock_response.json if authorize_return is not None: mock_pdp_authorize_resource.assert_called_once_with( 1, 'reference_sap_profit_center' ) else: mock_pdp_authorize_resource.assert_not_called() @patch('abacus_contract.blueprints.reference_sap_profit_center.logic') def test_get_reference_sap_profit_centers(mock_logic, fixture_client): """Test to get a list of profit centers.""" mock_profit_center = ReferenceSapProfitCenterFactory.create() mock_response = { 'items': ReferenceSapProfitCenterSchema(many=True).dump([mock_profit_center]), 'total_count': 1, } mock_logic.get_reference_sap_profit_centers.return_value = response.Response( message=mock_response, status=200 ) result = fixture_client.get('/reference-sap-profit-centers') assert result.status_code == 200 assert result.json == mock_response @patch('abacus_contract.blueprints.reference_sap_profit_center.logic') def test_get_signing_entities_by_profit_center_dataloader(mock_logic, fixture_client): """Test to get signing entities by profit centers.""" mock_signing_entities = [ { 'data': [ { 'signing_entity_sap_profit_center_id': 1, 'reference_sap_profit_center_id': 1, 'created_at': '2026-05-29T16:51:25.000000', 'signing_entity': { 'reference_signing_entity_id': 1, 'reference_sap_profit_center_id': 1, 'reference_payment_entity_id': 1, 'company_code': '4914', 'legal_name': 'AWAL Digital Limited', 'vat_number': 'GB 423 4787 86', 'company_registration_number': '04430703', 'address': '2 Canal Reach, London, N1C 4DB', }, } ] }, { 'data': None, }, ] mock_logic.get_signing_entities_by_profit_centers.return_value = response.Response( message=mock_signing_entities, status=200 ) result = fixture_client.post( '/reference-sap-profit-center/reference-signing-entities/dataloader', json=[1, 2], ) assert result.status_code == 200 assert result.json == mock_signing_entities mock_logic.get_signing_entities_by_profit_centers.assert_called_with([1, 2]) @patch('abacus_contract.blueprints.reference_sap_profit_center.logic') def test_get_sap_profit_centers_dataloader(mock_logic, fixture_client): """Test to get SAP profit centers by ids.""" mock_profit_centers = [ { 'data': { 'reference_sap_profit_center_id': 1, 'profit_center': 'PC001', 'company_code': '4914', 'business_group': 'ORC', 'display_name': 'Test', } }, { 'data': None, }, ] mock_logic.get_sap_profit_centers_by_ids.return_value = response.Response( message=mock_profit_centers, status=200 ) result = fixture_client.post( '/reference-sap-profit-centers/dataloader', json=[1, 2] ) assert result.status_code == 200 assert result.json == mock_profit_centers mock_logic.get_sap_profit_centers_by_ids.assert_called_with([1, 2]) @patch('abacus_contract.blueprints.reference_sap_profit_center.logic') def test_create_reference_sap_profit_center(mock_logic, fixture_client): """Test to create a reference_sap_profit_center.""" mock_response = { 'reference_sap_profit_center_id': 1, 'profit_center': 'PC001', 'company_code': '4914', 'business_group': 'ORC', 'display_name': 'Test', } mock_request_body = { 'profit_center': 'PC001', 'company_code': '4914', 'business_group': 'ORC', 'display_name': 'Test', } mock_logic.create_reference_sap_profit_center.return_value = response.Response( message=mock_response, status=201 ) result = fixture_client.post('/reference-sap-profit-center', json=mock_request_body) assert result.status_code == 201 assert result.json == mock_response mock_logic.create_reference_sap_profit_center.assert_called_with( **mock_request_body )