def test__multiple_availabilities(): """All availabilities are correctly identified.""" event1 = Event( id=1, title='A', start_date='2019-01-01T12:00:00+00:00', end_date='2019-01-01T14:00:00+00:00', ) event2 = Event( id=2, title='B', start_date='2019-01-01T15:00:00+00:00', end_date='2019-01-01T16:00:00+00:00', ) event3 = Event( id=3, title='C', start_date='2019-01-01T17:00:00+00:00', end_date='2019-01-01T17:30:00+00:00', ) result = get_user_availability( user_events=[event1, event2, event3], start_date=START_DATE, end_date=END_DATE, ) assert result == [ Availability(START_DATE, event1.start_date), Availability(event1.end_date, event2.start_date), Availability(event2.end_date, event3.start_date), Availability(event3.end_date, END_DATE), ]
def test__different_number_of_availabilities(): """Ensure there are no issues if users have unbalanced availabilities.""" user1 = [ Availability( "2019-01-01T11:00:00+00:00", "2019-01-01T15:00:00+00:00", ), ] user2 = [ Availability( "2019-01-01T08:00:00+00:00", "2019-01-01T12:00:00+00:00", ), Availability( "2019-01-01T13:00:00+00:00", "2019-01-01T22:00:00+00:00", ), ] result = get_intersecting_availabilities([user1, user2]) assert result == [ Availability( "2019-01-01T11:00:00+00:00", "2019-01-01T12:00:00+00:00", ), Availability( "2019-01-01T13:00:00+00:00", "2019-01-01T15:00:00+00:00", ), ]
def test__overlapping_events(): """If events overlaps, their earliest start date and latest end date are used when computing availability. """ event1 = Event( id=1, title='A', start_date='2019-01-01T12:00:00+00:00', end_date='2019-01-01T14:00:00+00:00', ) event2 = Event( id=2, title='B', start_date='2019-01-01T13:00:00+00:00', end_date='2019-01-01T15:00:00+00:00', ) result = get_user_availability( user_events=[event1, event2], start_date=START_DATE, end_date=END_DATE, ) assert result == [ Availability(START_DATE, event1.start_date), Availability(event2.end_date, END_DATE), ]
def test__no_overlapping_availabilities(): """If availabilities are fully disparate, they are not returned.""" user1 = [ Availability( "2019-01-01T11:00:00+00:00", "2019-01-01T15:00:00+00:00", ), ] user2 = [ Availability( "2019-01-01T18:00:00+00:00", "2019-01-01T22:00:00+00:00", ), ] result = get_intersecting_availabilities([user1, user2]) assert result == []
def test__fully_intersecting_availabilities(): """If availabilities fully intersect, they are preserved.""" availability = Availability( "2019-01-01T11:00:00+00:00", "2019-01-01T15:00:00+00:00", ) user1 = [availability] user2 = [availability] result = get_intersecting_availabilities([user1, user2]) assert result == [availability]
def test__overlapping_availabilities(): """If availabilities overlap, only the intersection is preserved.""" user1 = [ Availability( "2019-01-01T11:00:00+00:00", "2019-01-01T15:00:00+00:00", ), ] user2 = [ Availability( "2019-01-01T13:00:00+00:00", "2019-01-01T22:00:00+00:00", ), ] result = get_intersecting_availabilities([user1, user2]) assert result == [ Availability( "2019-01-01T13:00:00+00:00", "2019-01-01T15:00:00+00:00", ), ]
def test__single_day_availability_during_work_hours(): """If a block of availability is fully contianed during work hours, it is preserved.""" availabilities = [] start_date = arrow.get("2019-01-01T11:00:00+00:00") end_date = arrow.get("2019-01-01T12:00:00+00:00") add_work_hour_availability(availabilities, start_date, end_date, WORKING_HOURS) assert availabilities == [ Availability(start_date.isoformat(), end_date.isoformat()), ]
def test__no_events(): """If there are no events, the full date range should be marked as available. """ result = get_user_availability( user_events=[], start_date=START_DATE, end_date=END_DATE, ) assert result == [ Availability(START_DATE, END_DATE), ]
def test__multiday_availability(): """If availability spans multiple work days, it is split appropriately.""" availabilities = [] start_date = arrow.get("2019-01-01T10:00:00+00:00") end_date = arrow.get("2019-01-03T12:00:00+00:00") add_work_hour_availability(availabilities, start_date, end_date, WORKING_HOURS) assert availabilities == [ Availability( start_date.isoformat(), arrow.get("2019-01-01T17:30:00+00:00").isoformat(), ), Availability( arrow.get("2019-01-02T09:00:00+00:00").isoformat(), arrow.get("2019-01-02T17:30:00+00:00").isoformat(), ), Availability( arrow.get("2019-01-03T09:00:00+00:00").isoformat(), end_date.isoformat(), ), ]
def test__single_day_availability_starts_before_work_hours(): """If a block of availability starts before work hours, it is truncated.""" availabilities = [] start_date = arrow.get("2019-01-01T05:00:00+00:00") end_date = arrow.get("2019-01-01T12:00:00+00:00") add_work_hour_availability(availabilities, start_date, end_date, WORKING_HOURS) assert availabilities == [ Availability( arrow.get("2019-01-01T09:00:00+00:00").isoformat(), end_date.isoformat(), ), ]
def test__single_day_availability_ends_after_work_hours(): """If a block of availability ends after work hours, it is truncated.""" availabilities = [] start_date = arrow.get("2019-01-01T11:00:00+00:00") end_date = arrow.get("2019-01-01T18:00:00+00:00") add_work_hour_availability(availabilities, start_date, end_date, WORKING_HOURS) assert availabilities == [ Availability( start_date.isoformat(), arrow.get("2019-01-01T17:30:00+00:00").isoformat(), ), ]
def test__event_overlapping_with_end_date(): """If event overlaps with start date, the last availability ends when that event starts. """ event = Event( id=1, title='A', start_date='2019-01-01T12:00:00+00:00', end_date='2019-01-01T20:00:00+00:00', ) result = get_user_availability( user_events=[event], start_date=START_DATE, end_date=END_DATE, ) assert result == [ Availability(START_DATE, event.start_date), ]
def test__event_overlapping_with_start_date(): """If event overlaps with start date, the earliest availability starts after that event ends. """ event = Event( id=1, title='A', start_date='2019-01-01T09:00:00+00:00', end_date='2019-01-01T12:00:00+00:00', ) result = get_user_availability( user_events=[event], start_date=START_DATE, end_date=END_DATE, ) assert result == [ Availability(event.end_date, END_DATE), ]