"""Functional tests for schedule_attachment.""" from abacus_common_logic.constants.error import ERROR_ENTITY_DOES_NOT_EXIST from abacus_schedule import models from abacus_schedule.constants import constants from tests.utils.factories import ScheduleAttachmentFactory, ScheduleFactory def test_get_schedule_attachments(fixture_client): """Test GET endpoint /schedule//schedule-attachments/.""" mock_schedule_1 = ScheduleFactory.create() mock_schedule_attachment_1 = ScheduleAttachmentFactory.create( schedule=mock_schedule_1, target_type=constants.SCHEDULE_ATTACHMENT_TARGET_TYPE.CONTRIBUTION, target_id='4bcab378-77b2-4747-9d72-2c4ec90e7753', ) mock_schedule_attachment_2 = ScheduleAttachmentFactory.create( schedule=mock_schedule_1, target_type=constants.SCHEDULE_ATTACHMENT_TARGET_TYPE.CONTRIBUTION, target_id='1ccaj378-77b4-4748-9d72-2c4ec90e7753', ) query_string = '?limit=10&offset=0' result = fixture_client.get( f'/schedule/{mock_schedule_1.schedule_id}/schedule-attachments/{query_string}' ) assert result.status_code == 200 assert result.json['items'] == [ { 'target_type': 'contribution', 'target_id': '4bcab378-77b2-4747-9d72-2c4ec90e7753', 'schedule_attachment_id': mock_schedule_attachment_1.schedule_attachment_id, 'schedule_id': mock_schedule_1.schedule_id, }, { 'target_id': '1ccaj378-77b4-4748-9d72-2c4ec90e7753', 'schedule_id': mock_schedule_1.schedule_id, 'schedule_attachment_id': mock_schedule_attachment_2.schedule_attachment_id, 'target_type': 'contribution', }, ] assert result.json['total_count'] == 2 def test_soft_delete_schedule_attachment(fixture_client): """Test DELETE endpoint /schedule-attachment//.""" mock_schedule = ScheduleFactory.create() mock_schedule_attachment = ScheduleAttachmentFactory.create( schedule=mock_schedule, target_type=constants.SCHEDULE_ATTACHMENT_TARGET_TYPE.CONTRIBUTION, target_id='4bcab378-77b2-4747-9d72-2c4ec90e1153', ) assert mock_schedule_attachment.deleted_at is None assert mock_schedule_attachment.deleted_by is None result = fixture_client.delete( f'/schedule-attachment/{mock_schedule_attachment.schedule_attachment_id}/' ) assert result.status_code == 204 assert mock_schedule_attachment.deleted_at is not None assert mock_schedule_attachment.deleted_by is not None def test_get_schedule_attachment_by_id(fixture_client): """Test GET endpoint /schedule-attachment/.""" mock_schedule = ScheduleFactory.create() mock_schedule_attachment = ScheduleAttachmentFactory.create( schedule=mock_schedule, target_type=constants.SCHEDULE_ATTACHMENT_TARGET_TYPE.CONTRIBUTION, target_id='4bcab378-77b2-4747-9d72-2c4ec90e7753', ) schedule_id = mock_schedule.schedule_id schedule_attachment_id = mock_schedule_attachment.schedule_attachment_id result = fixture_client.get(f'/schedule-attachment/{schedule_attachment_id}/') assert result.status_code == 200 assert result.json == { 'schedule_attachment_id': schedule_attachment_id, 'schedule_id': schedule_id, 'target_id': mock_schedule_attachment.target_id, 'target_type': constants.SCHEDULE_ATTACHMENT_TARGET_TYPE.CONTRIBUTION, } def test_get_deleted_schedule_attachment_by_id(fixture_client): """Test GET endpoint /schedule-attachment// for deleted record.""" mock_schedule = ScheduleFactory.create() mock_schedule_attachment = ScheduleAttachmentFactory.create( schedule=mock_schedule, target_type=constants.SCHEDULE_ATTACHMENT_TARGET_TYPE.CONTRIBUTION, target_id='4bcab378-77b2-4747-9d72-2c4ec90e7753', deleted_by='Test User', deleted_at='2023-02-28 21:23:13', ) schedule_attachment_id = mock_schedule_attachment.schedule_attachment_id result = fixture_client.get(f'/schedule-attachment/{schedule_attachment_id}/') assert result.status_code == 404 assert result.json['message'] == ERROR_ENTITY_DOES_NOT_EXIST.format( object_type='ScheduleAttachment', object_id=schedule_attachment_id ) def test_bulk_update_schedule_attachments(fixture_client): """Test PUT endpoint to create/delete schedule attachments.""" mock_schedule = ScheduleFactory.create() schedule_id = mock_schedule.schedule_id schedule_attachment_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'], } mock_schedule_attachment = ScheduleAttachmentFactory.create( schedule=mock_schedule, target_type=schedule_attachment_type, target_id='4bcab378-77b2-4747-9d72-2c4ec90e7753', ) schedule_attachments = models.ScheduleAttachment.get_schedule_attachments( schedule_id, ['1bcab370-77b2-4747-9d72-2c4ec90e7753'], schedule_attachment_type ) assert len(schedule_attachments) == 0 assert mock_schedule_attachment.deleted_by is None assert mock_schedule_attachment.deleted_at is None result = fixture_client.put( f'/schedule/{schedule_id}/{schedule_attachment_type}/schedule-attachments', json=mock_put_body, ) assert result.status_code == 200 assert mock_schedule_attachment.deleted_by assert mock_schedule_attachment.deleted_at schedule_attachments = models.ScheduleAttachment.get_schedule_attachments( schedule_id, ['1bcab370-77b2-4747-9d72-2c4ec90e7753'], schedule_attachment_type ) assert len(schedule_attachments) == 1 assert schedule_attachments[0].target_id == '1bcab370-77b2-4747-9d72-2c4ec90e7753' def test_bulk_update_schedule_attachments_invalid_target_type(fixture_client): """Test schedule attachment PUT endpoint for invalid target_type.""" mock_schedule = ScheduleFactory.create() schedule_id = mock_schedule.schedule_id schedule_attachment_type = 'Test' mock_put_body = { 'unassigned_target_ids': ['4bcab378-77b2-4747-9d72-2c4ec90e7753'], 'assigned_target_ids': ['1bcab370-77b2-4747-9d72-2c4ec90e7753'], } result = fixture_client.put( f'/schedule/{schedule_id}/{schedule_attachment_type}/schedule-attachments', json=mock_put_body, ) assert result.status_code == 400 assert result.json['message'] == str( {'target_type': ['Must be one of contribution, contributor']} ) def test_bulk_update_schedule_attachments_invalid_schedule(fixture_client): """Test schedule attachment PUT endpoint for invalid schedule_id.""" schedule_id = 12345 schedule_attachment_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'], } result = fixture_client.put( f'/schedule/{schedule_id}/{schedule_attachment_type}/schedule-attachments', json=mock_put_body, ) assert result.status_code == 400 assert result.json['message'] == f'Schedule {schedule_id} does not exist.' def test_bulk_update_schedule_attachments_deleted_record(fixture_client): """Test schedule attachment PUT endpoint for existing deleted record. Adding a schedule_attachment that are already deleted. """ mock_schedule = ScheduleFactory.create() schedule_id = mock_schedule.schedule_id schedule_attachment_type = constants.SCHEDULE_ATTACHMENT_TARGET_TYPE.CONTRIBUTION mock_put_body = { 'assigned_target_ids': [ '1bcab370-77b2-4747-9d72-2c4ec90e7753', '4bcab378-77b2-4747-9d72-2c4ec90e7753', ] } mock_schedule_attachment = ScheduleAttachmentFactory.create( schedule=mock_schedule, target_type=schedule_attachment_type, target_id='4bcab378-77b2-4747-9d72-2c4ec90e7753', deleted_by='Test User', deleted_at='2023-02-28 21:23:13', ) schedule_attachments = models.ScheduleAttachment.get_schedule_attachments( schedule_id, mock_put_body['assigned_target_ids'], schedule_attachment_type ) assert len(schedule_attachments) == 1 assert schedule_attachments[0].deleted_by assert schedule_attachments[0].deleted_at assert schedule_attachments[0].target_id == '4bcab378-77b2-4747-9d72-2c4ec90e7753' result = fixture_client.put( f'/schedule/{schedule_id}/{schedule_attachment_type}/schedule-attachments', json=mock_put_body, ) assert result.status_code == 200 assert mock_schedule_attachment.deleted_by is None assert mock_schedule_attachment.deleted_at is None schedule_attachments = models.ScheduleAttachment.get_schedule_attachments( schedule_id, mock_put_body['assigned_target_ids'], schedule_attachment_type ) assert len(schedule_attachments) == 2