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",
        ),
    ]
예제 #7
0
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),
    ]
예제 #9
0
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(),
        ),
    ]
예제 #10
0
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(),
        ),
    ]
예제 #11
0
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),
    ]