"""Unit tests for schedule_attachment handlers.""" from unittest.mock import MagicMock, patch import pytest from flask import testing from owsresponse import response from abacus_schedule.constants import constants from tests.utils.factories import ScheduleAttachmentFactory, ScheduleFactory @patch('abacus_schedule.blueprints.schedule_attachment.logic') def test_get_schedule_attachments_by_schedule_id(mock_logic, fixture_client): """Test to get a list schedule_attachment's by schedule id.""" schedule_id = 1 mock_response = response.Response(message='ok', status=200) mock_logic.get_schedule_attachments_by_schedule_id.return_value = mock_response result = fixture_client.get(f'/schedule/{schedule_id}/schedule-attachments') assert result.status_code == 200 mock_logic.get_schedule_attachments_by_schedule_id.assert_called_once_with( schedule_id, limit=100, offset=0 ) @pytest.mark.parametrize( ['standalone_check_result', 'pdp_check_result', 'expected_status'], [ pytest.param(True, None, 200, id='standalone check pass'), pytest.param(False, False, 403, id='pdp check fail'), pytest.param(False, True, 200, id='pdp check pass'), ], ) @patch('abacus_schedule.blueprints.schedule_attachment.authorization') @patch('abacus_schedule.blueprints.schedule_attachment.flask_request') def test_get_schedule_attachments_by_schedule_id_authorization( flask_request_mock: MagicMock, authorization_mock: MagicMock, standalone_check_result: bool, pdp_check_result: bool | None, expected_status: int, fixture_client: testing.FlaskClient, ) -> None: """Test authorization of GET /schedules// endpoint.""" flask_request_mock.verify_rules_access_standalone.return_value = ( standalone_check_result ) authorization_mock.pdp_authorize_resource.return_value = pdp_check_result schedule_id = 111 schedule = ScheduleFactory.create(schedule_id=111) ScheduleAttachmentFactory.create(schedule=schedule) res = fixture_client.get(f'/schedule/{schedule_id}/schedule-attachments/') assert res.status_code == expected_status flask_request_mock.verify_rules_access_standalone.assert_called_once() if standalone_check_result: authorization_mock.pdp_authorize_resource.assert_not_called() else: authorization_mock.pdp_authorize_resource.assert_called_once_with( resource_id=schedule_id, resource_type='abacus_schedule' ) @patch('abacus_schedule.blueprints.schedule_attachment.logic') def test_soft_delete_schedule_attachment(mock_logic, fixture_client): """Test to soft delete schedule_attachment.""" mock_schedule = ScheduleFactory.create() mock_schedule_attachment = ScheduleAttachmentFactory.create(schedule=mock_schedule) schedule_attachment_id = mock_schedule_attachment.schedule_attachment_id mock_response = response.Response(status=204) mock_logic.soft_delete_schedule_attachment.return_value = mock_response result = fixture_client.delete(f'/schedule-attachment/{schedule_attachment_id}/') assert result.status_code == 204 mock_logic.soft_delete_schedule_attachment.assert_called_once_with( mock_schedule_attachment ) @patch('abacus_schedule.blueprints.schedule_attachment.logic') def test_bulk_update_schedule_attachments(mock_logic, fixture_client): """Test to create/delete schedule attachments.""" schedule_id = 1 mock_put_body = { 'unassigned_target_ids': ['4bcab378-77b2-4747-9d72-2c4ec90e7753'], 'assigned_target_ids': ['1bcab370-77b2-4747-9d72-2c4ec90e7753'], } schedule_attachment_type = constants.SCHEDULE_ATTACHMENT_TARGET_TYPE.CONTRIBUTION mock_response = response.Response( message='Records created/deleted successfully.', status=200 ) mock_logic.bulk_update_schedule_attachments.return_value = mock_response result = fixture_client.put( f'/schedule/{schedule_id}/{schedule_attachment_type}/schedule-attachments', json=mock_put_body, ) assert result.status_code == 200 mock_logic.bulk_update_schedule_attachments.assert_called_once_with( schedule_id, schedule_attachment_type, mock_put_body )