From 6cff9729d8c03aa40c9726ac4831468eca6f147e Mon Sep 17 00:00:00 2001 From: Matias Bordese Date: Tue, 18 Apr 2023 13:42:04 -0300 Subject: [PATCH] Update upcoming shift endpoint to return a list (#1784) --- engine/apps/api/tests/test_user.py | 45 ++++++++++--------- engine/apps/api/views/user.py | 24 +++++++--- .../schedules/tests/test_on_call_schedule.py | 4 +- 3 files changed, 42 insertions(+), 31 deletions(-) diff --git a/engine/apps/api/tests/test_user.py b/engine/apps/api/tests/test_user.py index fea94f1a..8e93be2f 100644 --- a/engine/apps/api/tests/test_user.py +++ b/engine/apps/api/tests/test_user.py @@ -1716,19 +1716,20 @@ def test_upcoming_shifts_oncall( response = client.get(url, format="json", **make_user_auth_headers(admin, token)) assert response.status_code == status.HTTP_200_OK - returned_data = response.data - assert returned_data[schedule.public_primary_key]["schedule"] == schedule.name - assert returned_data[schedule.public_primary_key]["is_oncall"] - assert returned_data[schedule.public_primary_key]["current_shift"]["start"] == on_call_shift.start + returned_data = response.data[0] + assert returned_data["schedule_id"] == schedule.public_primary_key + assert returned_data["schedule_name"] == schedule.name + assert returned_data["is_oncall"] + assert returned_data["current_shift"]["start"] == on_call_shift.start next_shift_start = on_call_shift.start + timezone.timedelta(days=1) - assert returned_data[schedule.public_primary_key]["next_shift"]["start"] == next_shift_start + assert returned_data["next_shift"]["start"] == next_shift_start # empty response for other user url = reverse("api-internal:user-upcoming-shifts", kwargs={"pk": other_user.public_primary_key}) response = client.get(url, format="json", **make_user_auth_headers(admin, token)) assert response.status_code == status.HTTP_200_OK - assert response.data == {} + assert response.data == [] @pytest.mark.django_db @@ -1768,11 +1769,12 @@ def test_upcoming_shifts_override( response = client.get(url, format="json", **make_user_auth_headers(admin, token)) assert response.status_code == status.HTTP_200_OK - returned_data = response.data - assert returned_data[schedule.public_primary_key]["schedule"] == schedule.name - assert returned_data[schedule.public_primary_key]["is_oncall"] is False - assert returned_data[schedule.public_primary_key]["current_shift"] is None - assert returned_data[schedule.public_primary_key]["next_shift"]["start"] == override.start + returned_data = response.data[0] + assert returned_data["schedule_id"] == schedule.public_primary_key + assert returned_data["schedule_name"] == schedule.name + assert returned_data["is_oncall"] is False + assert returned_data["current_shift"] is None + assert returned_data["next_shift"]["start"] == override.start @pytest.mark.django_db @@ -1789,7 +1791,8 @@ def test_upcoming_shifts_multiple_schedules( _, token = make_token_for_organization(organization) schedules = [] - for i in range(3): + # create schedules in a reversed order to check the output is sorted later + for i in range(2, -1, -1): schedule = make_schedule( organization, schedule_class=OnCallScheduleWeb, @@ -1822,16 +1825,14 @@ def test_upcoming_shifts_multiple_schedules( assert response.status_code == status.HTTP_200_OK returned_data = response.data - for i, schedule in enumerate(schedules): - assert returned_data[schedule.public_primary_key]["schedule"] == schedule.name + for i, schedule in enumerate(reversed(schedules)): + assert returned_data[i]["schedule_name"] == schedule.name expected_start = today + timezone.timedelta(hours=start_h) + timezone.timedelta(days=i) if i == 0: - assert returned_data[schedule.public_primary_key]["is_oncall"] - assert returned_data[schedule.public_primary_key]["current_shift"]["start"] == expected_start - assert returned_data[schedule.public_primary_key]["next_shift"][ - "start" - ] == expected_start + timezone.timedelta(days=1) + assert returned_data[i]["is_oncall"] + assert returned_data[i]["current_shift"]["start"] == expected_start + assert returned_data[i]["next_shift"]["start"] == expected_start + timezone.timedelta(days=1) else: - assert returned_data[schedule.public_primary_key]["is_oncall"] is False - assert returned_data[schedule.public_primary_key]["current_shift"] is None - assert returned_data[schedule.public_primary_key]["next_shift"]["start"] == expected_start + assert returned_data[i]["is_oncall"] is False + assert returned_data[i]["current_shift"] is None + assert returned_data[i]["next_shift"]["start"] == expected_start diff --git a/engine/apps/api/views/user.py b/engine/apps/api/views/user.py index ab9d05c0..835eb76a 100644 --- a/engine/apps/api/views/user.py +++ b/engine/apps/api/views/user.py @@ -475,16 +475,26 @@ class UserView( schedules = OnCallSchedule.objects.related_to_user(user) # check upcoming shifts - upcoming = {} + upcoming = [] for schedule in schedules: current_shift, upcoming_shift = schedule.upcoming_shift_for_user(user, days=days) if current_shift or upcoming_shift: - upcoming[schedule.public_primary_key] = { - "schedule": schedule.name, - "is_oncall": current_shift is not None, - "current_shift": current_shift, - "next_shift": upcoming_shift, - } + upcoming.append( + { + "schedule_id": schedule.public_primary_key, + "schedule_name": schedule.name, + "is_oncall": current_shift is not None, + "current_shift": current_shift, + "next_shift": upcoming_shift, + } + ) + + # sort entries by start timestamp + def sorting_key(entry): + shift = entry["current_shift"] if entry["current_shift"] else entry["next_shift"] + return shift["start"] + + upcoming.sort(key=sorting_key) return Response(upcoming, status=status.HTTP_200_OK) diff --git a/engine/apps/schedules/tests/test_on_call_schedule.py b/engine/apps/schedules/tests/test_on_call_schedule.py index 00a9b817..c45a10bc 100644 --- a/engine/apps/schedules/tests/test_on_call_schedule.py +++ b/engine/apps/schedules/tests/test_on_call_schedule.py @@ -1203,7 +1203,7 @@ def test_user_related_schedules( make_schedule(organization, schedule_class=OnCallScheduleWeb) schedules = OnCallSchedule.objects.related_to_user(admin) - assert list(schedules) == [schedule1, schedule2] + assert set(schedules) == {schedule1, schedule2} @pytest.mark.django_db @@ -1268,7 +1268,7 @@ def test_user_related_schedules_only_username( schedule3.refresh_ical_file() schedules = OnCallSchedule.objects.related_to_user(user) - assert list(schedules) == [schedule1, schedule2] + assert set(schedules) == {schedule1, schedule2} @pytest.mark.django_db