From 36e2dc2378662255262eb39027a4174ae50dd91c Mon Sep 17 00:00:00 2001 From: Anthony LC Date: Wed, 31 Jan 2024 17:03:25 +0100 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F(backend)=20api=20teams=20lis?= =?UTF-8?q?t=20ordering?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Give the possibility to order the teams list by creation date. By default the list is ordered by creation date descending. --- src/backend/core/api/viewsets.py | 4 ++ .../tests/teams/test_core_api_teams_list.py | 59 ++++++++++++++++++- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index dd2881a..a3f1a44 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -5,6 +5,7 @@ from django.db.models import Func, Max, OuterRef, Q, Subquery, Value from rest_framework import ( decorators, exceptions, + filters, mixins, pagination, response, @@ -244,6 +245,9 @@ class TeamViewSet( permission_classes = [permissions.AccessPermission] serializer_class = serializers.TeamSerializer + filter_backends = [filters.OrderingFilter] + ordering_fields = ["created_at"] + ordering = ["-created_at"] queryset = models.Team.objects.all() def get_queryset(self): diff --git a/src/backend/core/tests/teams/test_core_api_teams_list.py b/src/backend/core/tests/teams/test_core_api_teams_list.py index 44dad04..5640bc4 100644 --- a/src/backend/core/tests/teams/test_core_api_teams_list.py +++ b/src/backend/core/tests/teams/test_core_api_teams_list.py @@ -8,8 +8,7 @@ from rest_framework.pagination import PageNumberPagination from rest_framework.status import HTTP_200_OK, HTTP_401_UNAUTHORIZED from rest_framework.test import APIClient -from core import factories, models -from core.api import serializers +from core import factories from ..utils import OIDCToken @@ -116,3 +115,59 @@ def test_api_teams_list_authenticated_distinct(): content = response.json() assert len(content["results"]) == 1 assert content["results"][0]["id"] == str(team.id) + + +def test_api_teams_order(): + """ + Test that the endpoint GET teams is sorted in 'created_at' descending order by default. + """ + identity = factories.IdentityFactory() + user = identity.user + jwt_token = OIDCToken.for_user(user) + + team_ids = [ + str(team.id) for team in factories.TeamFactory.create_batch(5, users=[user]) + ] + + response = APIClient().get( + "/api/v1.0/teams/", + HTTP_AUTHORIZATION=f"Bearer {jwt_token}", + ) + + assert response.status_code == 200 + + response_data = response.json() + response_team_ids = [team["id"] for team in response_data["results"]] + + team_ids.reverse() + assert ( + response_team_ids == team_ids + ), "created_at values are not sorted from newest to oldest" + + +def test_api_teams_order_param(): + """ + Test that the 'created_at' field is sorted in ascending order + when the 'ordering' query parameter is set. + """ + identity = factories.IdentityFactory() + user = identity.user + jwt_token = OIDCToken.for_user(user) + + team_ids = [ + str(team.id) for team in factories.TeamFactory.create_batch(5, users=[user]) + ] + + response = APIClient().get( + "/api/v1.0/teams/?ordering=created_at", + HTTP_AUTHORIZATION=f"Bearer {jwt_token}", + ) + assert response.status_code == 200 + + response_data = response.json() + + response_team_ids = [team["id"] for team in response_data["results"]] + + assert ( + response_team_ids == team_ids + ), "created_at values are not sorted from oldest to newest"