"""Unit tests for schedule_attachment logic.""" from unittest.mock import call, patch from abacus_schedule.constants import constants from abacus_schedule.logic import schedule_attachment as logic from tests.utils.factories import ScheduleAttachmentFactory, ScheduleFactory @patch('abacus_schedule.logic.schedule_attachment.models') def test_get_schedule_attachments_by_schedule_id(mock_models): """Test for get_schedule_attachments_by_schedule_id function.""" mock_schedule = ScheduleFactory.create() mock_schedule_attachment = ScheduleAttachmentFactory.create(schedule=mock_schedule) schedule_id = mock_schedule.schedule_id mock_models.Schedule.get_by_id_or_error.return_value = mock_schedule mock_models.ScheduleAttachment.get_schedule_attachments_by_schedule_id.return_value = ( [mock_schedule_attachment], 1, ) params = {'schedule_id': schedule_id, 'limit': 100, 'offset': 0} result = logic.get_schedule_attachments_by_schedule_id(**params) assert result.status == 200 mock_models.ScheduleAttachment.get_schedule_attachments_by_schedule_id.assert_called_once_with( schedule_id, 100, 0 ) @patch('abacus_schedule.logic.schedule_attachment.models') def test_soft_delete_schedule_attachment(mock_models): """Test for soft_delete_schedule_attachment function.""" mock_schedule = ScheduleFactory.create() mock_schedule_attachment = ScheduleAttachmentFactory.create(schedule=mock_schedule) mock_models.delete_by_id_or_error.return_value = None result = logic.soft_delete_schedule_attachment(mock_schedule_attachment) assert result.status == 204 mock_models.ScheduleAttachment.delete_by_id_or_error.assert_called_once_with( mock_schedule_attachment.schedule_attachment_id, soft_delete=True ) @patch('abacus_schedule.logic.schedule_attachment._bulk_create_schedule_attachments') @patch( 'abacus_schedule.logic.schedule_attachment._bulk_soft_delete_schedule_attachments' ) @patch('abacus_schedule.logic.schedule_attachment.models') def test_bulk_update_schedule_attachments( mock_models, mock_soft_delete_schedule_attachments, mock_create_schedule_attachments ): """Test to create/delete schedule attachments.""" mock_schedule = ScheduleFactory.create() mock_models.Schedule.get_by_id_or_error.return_value = mock_schedule mock_soft_delete_schedule_attachments.return_value = True mock_create_schedule_attachments.return_value = True target_type = constants.SCHEDULE_ATTACHMENT_TARGET_TYPE.CONTRIBUTION mock_put_body = { 'unassigned_target_ids': ['4bcab378-77b2-4747-9d72-2c4ec90e7753'], 'assigned_target_ids': ['1bcab370-77b2-4747-9d72-2c4ec90e7753'], } res = logic.bulk_update_schedule_attachments( mock_schedule.schedule_id, target_type, mock_put_body ) assert res.status == 200 mock_soft_delete_schedule_attachments.assert_called_once_with( mock_schedule.schedule_id, ['4bcab378-77b2-4747-9d72-2c4ec90e7753'], target_type ) mock_create_schedule_attachments.assert_called_once_with( mock_schedule.schedule_id, ['1bcab370-77b2-4747-9d72-2c4ec90e7753'], target_type ) @patch('abacus_schedule.logic.schedule_attachment.models') def test_bulk_soft_delete_schedule_attachments(mock_models): """Test to delete schedule attachments.""" mock_schedule = ScheduleFactory.create() schedule_id = mock_schedule.schedule_id target_type = constants.SCHEDULE_ATTACHMENT_TARGET_TYPE.CONTRIBUTION target_ids = [ '4bcab378-77b2-4747-9d72-2c4ec90e7753', '1bcab370-77b2-4747-9d72-2c4ec90e7753', ] mock_schedule_attachment_1 = ScheduleAttachmentFactory.create( schedule=mock_schedule, target_type=target_type, target_id='4bcab378-77b2-4747-9d72-2c4ec90e7753', ) mock_schedule_attachment_2 = ScheduleAttachmentFactory.create( schedule=mock_schedule, target_type=target_type, target_id='1bcab370-77b2-4747-9d72-2c4ec90e7753', ) mock_models.delete_by_id_or_error.return_value = None mock_models.ScheduleAttachment.get_schedule_attachments.return_value = [ mock_schedule_attachment_1, mock_schedule_attachment_2, ] result = logic._bulk_soft_delete_schedule_attachments( schedule_id, target_ids, target_type ) assert result is True mock_models.ScheduleAttachment.delete_by_id_or_error.assert_has_calls( [ call(mock_schedule_attachment_1.schedule_attachment_id, soft_delete=True), call(mock_schedule_attachment_2.schedule_attachment_id, soft_delete=True), ] ) @patch('abacus_schedule.logic.schedule_attachment.db') @patch('abacus_schedule.logic.schedule_attachment.models') def test_bulk_create_schedule_attachments(mock_models, mock_db): """Test to create schedule attachments.""" mock_schedule = ScheduleFactory.create() schedule_id = mock_schedule.schedule_id target_type = constants.SCHEDULE_ATTACHMENT_TARGET_TYPE.CONTRIBUTION mock_schedule_attachment = ScheduleAttachmentFactory.create( schedule=mock_schedule, target_type=target_type, target_id='1bcab370-77b2-4747-9d72-2c4ec90e7753', deleted_by='Test User', deleted_at='2023-02-28 21:23:13', ) target_ids = [ '4bcab378-77b2-4747-9d72-2c4ec90e7753', '1bcab370-77b2-4747-9d72-2c4ec90e7753', ] mock_models.ScheduleAttachment.get_schedule_attachments.return_value = [ mock_schedule_attachment ] mock_models.ScheduleAttachment.build.return_value = True mock_db.session.return_value.commit.return_value = True logic._bulk_create_schedule_attachments(schedule_id, target_ids, target_type) assert mock_models.ScheduleAttachment.build.call_count == 1 mock_db.session.commit.call_count == 2