"""Unit Tests for contract_party handlers.""" from unittest import mock import pytest from flask import testing as flask_testing from owsresponse import response from abacus_contract.constants.constants import CONTRACT_PARTY_TARGET_TYPES from abacus_contract.tests.utils.factories import ContractFactory, ContractPartyFactory @mock.patch('abacus_contract.blueprints.contract_party.logic') def test_create_contract_party(mock_logic, fixture_client): """Test to create a contract_party.""" mock_contract = ContractFactory.create() contract_id = mock_contract.contract_id target_type = CONTRACT_PARTY_TARGET_TYPES.CONTRIBUTOR mock_post_body = { 'contract_id': contract_id, 'target_id': '1ec7c1bf-2318-4052-9406-a3e35a620bd3', 'target_type': target_type, } mock_logic.create_contract_party.return_value = response.Response( message='ok', status=201 ) res = fixture_client.post('/contract-party/', json=mock_post_body) assert res.status_code == 201 mock_logic.create_contract_party.assert_called_once() @mock.patch('abacus_contract.blueprints.contract_party.logic') def test_get_contract_parties(mock_logic, fixture_client): """Test to get a list of contract parties.""" mock_contract = ContractFactory.create() contract_id = mock_contract.contract_id target_type = CONTRACT_PARTY_TARGET_TYPES.CONTRIBUTOR mock_logic.get_contract_parties.return_value = response.Response( message='ok', status=200 ) res = fixture_client.get( f'/contract/{contract_id}/{target_type}/parties/?limit=2&offset=0' ) assert res.status_code == 200 mock_logic.get_contract_parties.assert_called_once() @pytest.mark.parametrize( [ 'standalone_check_result', 'get_account_id_result', 'pdp_auth_result', 'expected_status', ], [ pytest.param(True, None, None, 200, id='Standalone check pass'), pytest.param(False, None, None, 403, id='Account not found'), pytest.param(False, 9, False, 403, id='PDP auth fail'), pytest.param(False, 9, True, 200, id='PDP auth pass'), ], ) @mock.patch('abacus_contract.blueprints.contract_party.authorization') @mock.patch('abacus_contract.blueprints.contract_party.contract_logic') @mock.patch('abacus_contract.blueprints.contract_party.flask_request') def test_get_contract_parties_authorization( mock_flask_request: mock.MagicMock, mock_contract_logic: mock.MagicMock, mock_authorization: mock.MagicMock, standalone_check_result: bool, get_account_id_result: int | None, pdp_auth_result: bool | None, expected_status: int, fixture_client: flask_testing.FlaskClient, ) -> None: """Test authorization for GET /contract///parties/.""" mock_flask_request.verify_rules_access_standalone.return_value = ( standalone_check_result ) mock_contract_logic.get_account_id_by_contract_id.return_value = ( get_account_id_result ) mock_authorization.pdp_authorize_many_accounts.return_value = pdp_auth_result contract_id = 1 target_type = CONTRACT_PARTY_TARGET_TYPES.CONTRIBUTOR res = fixture_client.get( f'/contract/{contract_id}/{target_type}/parties/?limit=2&offset=0' ) assert res.status_code == expected_status mock_flask_request.verify_rules_access_standalone.assert_called_once() if not standalone_check_result: mock_contract_logic.get_account_id_by_contract_id.assert_called_once_with(1) if get_account_id_result: mock_authorization.pdp_authorize_many_accounts.assert_called_once_with([9]) @mock.patch('abacus_contract.blueprints.contract_party.logic') def test_delete_contract_party(mock_logic, fixture_client): """Test to delete contract party.""" mock_contract = ContractFactory.create() mock_contract_party = ContractPartyFactory.create(contract=mock_contract) contract_party_id = mock_contract_party.contract_party_id mock_logic.delete_contract_party.return_value = response.Response(status=204) res = fixture_client.delete(f'/contract-party/{contract_party_id}/') assert res.status_code == 204 mock_logic.delete_contract_party.assert_called_once()