feat: add the query parameter q to search for pokemon using a partial name

This commit is contained in:
JVMartyns 2024-04-08 10:27:14 -03:00
parent 0c039f3bbd
commit 0471f98941
2 changed files with 29 additions and 0 deletions

View file

@ -4,6 +4,7 @@ from rest_framework.response import Response
from rest_framework.views import APIView
from django.shortcuts import get_object_or_404
from django.http import Http404
from django.db.models import Q
from .models import *
from .serializers import *
@ -38,6 +39,15 @@ class NameOrIdRetrieval:
idPattern = re.compile(r"^-?[0-9]+$")
namePattern = re.compile(r"^[0-9A-Za-z\-\+]+$")
def get_queryset(self):
queryset = super().get_queryset()
filter = self.request.GET.get('q', '')
if filter:
queryset = queryset.filter(Q(name__icontains=filter))
return queryset
def get_object(self):
queryset = self.get_queryset()
queryset = self.filter_queryset(queryset)

View file

@ -5099,6 +5099,25 @@ class APITests(APIData, APITestCase):
"{}".format(cries_data["legacy"]),
)
# test search pokemon using search query param `q=partial_name`
response = self.client.get(
"{}/pokemon/?q={}".format(API_V2, pokemon.name[:2]),
HTTP_HOST="testserver",
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data["count"], 1)
self.assertEqual(response.data["results"][0]["name"], pokemon.name)
response = self.client.get(
"{}/pokemon/?q={}".format(API_V2, pokemon.name[-3:]),
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data["count"], 1)
self.assertEqual(response.data["results"][0]["name"], pokemon.name)
def test_pokemon_form_api(self):
pokemon_species = self.setup_pokemon_species_data()
pokemon = self.setup_pokemon_data(pokemon_species=pokemon_species)