"""Unit tests for Contract Lifecycle Schedule Detail endpoints.""" from unittest.mock import MagicMock, patch from owsresponse import response import pytest from abacus_contract.schemas.contract_lifecycle_schedule_detail import\ ContractLifecycleScheduleDetailSchema from tests.utils.factories import ContractLifecycleScheduleDetailFactory @patch('abacus_contract.blueprints.contract_lifecycle_schedule_detail.logic') def test_get_contract_lifecycle_schedule_details_by_ids(mock_logic, fixture_client): """Test GET Contract Lifecycle Schedule Detail by IDs.""" mock_contract_lifecycle_schedule_details =\ ContractLifecycleScheduleDetailFactory.create_batch(2) ids = [ schedule_detail.contract_lifecycle_schedule_detail_id for schedule_detail in mock_contract_lifecycle_schedule_details ] mock_logic.get_contract_lifecycle_schedule_details_by_ids.return_value =\ response.Response( message=ContractLifecycleScheduleDetailSchema().dump( mock_contract_lifecycle_schedule_details, many=True ), status=200 ) res = fixture_client.post( '/contract-lifecycle-schedule-detail/dataloader', json=ids ) assert res.status_code == 200 assert res.json == ContractLifecycleScheduleDetailSchema().dump( mock_contract_lifecycle_schedule_details, many=True ) mock_logic.get_contract_lifecycle_schedule_details_by_ids.assert_called_once_with( ids ) @pytest.mark.parametrize( [ 'standalone_check_result', 'pdp_auth_result', 'expected_status', ], [ pytest.param(True, None, 200, id='Standalone check pass'), pytest.param(False, False, 403, id='PDP auth fail'), pytest.param(False, True, 200, id='PDP auth pass'), ], ) @patch('abacus_contract.blueprints.contract_lifecycle_schedule_detail.pdp_authorize_resource') # noqa: E501 @patch('abacus_contract.blueprints.contract_lifecycle_schedule_detail.flask_request') @patch('abacus_contract.blueprints.contract_lifecycle_schedule_detail.logic') def test_get_contract_lifecycle_schedule_details_authorization( mock_logic: MagicMock, mock_flask_request: MagicMock, mock_authorization: MagicMock, standalone_check_result: bool, pdp_auth_result: bool | None, expected_status: int, fixture_client ): """Test GET Contract Lifecycle Schedule Details authorization.""" mock_flask_request.verify_rules_access_standalone.return_value = \ standalone_check_result mock_authorization.return_value = pdp_auth_result mock_contract_lifecycle_schedule_details =\ ContractLifecycleScheduleDetailFactory.create_batch(2) ids = [ schedule_detail.contract_lifecycle_schedule_detail_id for schedule_detail in mock_contract_lifecycle_schedule_details ] mock_logic.get_contract_lifecycle_schedule_details_by_ids.return_value =\ response.Response( message=ContractLifecycleScheduleDetailSchema().dump( mock_contract_lifecycle_schedule_details, many=True ), status=200 ) res = fixture_client.post( '/contract-lifecycle-schedule-detail/dataloader', json=ids ) assert res.status_code == expected_status mock_flask_request.verify_rules_access_standalone.assert_called_once() if not standalone_check_result: mock_authorization.assert_called_once_with( resource_id=0, resource_type='contract_lifecycle_schedule_detail' ) else: mock_authorization.assert_not_called() mock_logic.get_contract_lifecycle_schedule_details_by_ids.assert_called_once_with(ids) # noqa: E501