diff options
Diffstat (limited to 'pydis_site/apps')
| -rw-r--r-- | pydis_site/apps/api/tests/test_users.py | 43 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/bot/user.py | 5 | 
2 files changed, 48 insertions, 0 deletions
| diff --git a/pydis_site/apps/api/tests/test_users.py b/pydis_site/apps/api/tests/test_users.py index e21bb32b..5d10069d 100644 --- a/pydis_site/apps/api/tests/test_users.py +++ b/pydis_site/apps/api/tests/test_users.py @@ -1,3 +1,4 @@ +import random  from unittest.mock import Mock, patch  from django.urls import reverse @@ -520,3 +521,45 @@ class UserMetricityTests(AuthenticatedAPITestCase):          self.metricity.total_messages.side_effect = NotFoundError()          self.metricity.total_message_blocks.side_effect = NotFoundError()          self.metricity.top_channel_activity.side_effect = NotFoundError() + + +class UserViewSetTests(AuthenticatedAPITestCase): +    @classmethod +    def setUpTestData(cls): +        cls.searched_user = User.objects.create( +            id=12095219, +            name=f"Test user {random.randint(100, 1000)}", +            discriminator=random.randint(1, 9999), +            in_guild=True, +        ) +        cls.other_user = User.objects.create( +            id=18259125, +            name=f"Test user {random.randint(100, 1000)}", +            discriminator=random.randint(1, 9999), +            in_guild=True, +        ) + +    def test_search_lookup_of_wanted_user(self) -> None: +        """Searching a user by name and discriminator should return that user.""" +        url = reverse('api:bot:user-list') +        params = { +            'username': self.searched_user.name, +            'discriminator': self.searched_user.discriminator, +        } +        response = self.client.get(url, params) +        result = response.json() +        self.assertEqual(result['count'], 1) +        [user] = result['results'] +        self.assertEqual(user['id'], self.searched_user.id) + +    def test_search_lookup_of_unknown_user(self) -> None: +        """Searching an unknown user should return no results.""" +        url = reverse('api:bot:user-list') +        params = { +            'username': "f-string enjoyer", +            'discriminator': 1245, +        } +        response = self.client.get(url, params) +        result = response.json() +        self.assertEqual(result['count'], 0) +        self.assertEqual(result['results'], []) diff --git a/pydis_site/apps/api/viewsets/bot/user.py b/pydis_site/apps/api/viewsets/bot/user.py index a867a80f..3318b2b9 100644 --- a/pydis_site/apps/api/viewsets/bot/user.py +++ b/pydis_site/apps/api/viewsets/bot/user.py @@ -2,6 +2,7 @@ import typing  from collections import OrderedDict  from django.db.models import Q +from django_filters.rest_framework import DjangoFilterBackend  from rest_framework import status  from rest_framework.decorators import action  from rest_framework.pagination import PageNumberPagination @@ -77,6 +78,8 @@ class UserViewSet(ModelViewSet):      ... }      #### Optional Query Parameters +    - username: username to search for +    - discriminator: discriminator to search for      - page_size: number of Users in one page, defaults to 10,000      - page: page number @@ -233,6 +236,8 @@ class UserViewSet(ModelViewSet):      serializer_class = UserSerializer      queryset = User.objects.all().order_by("id")      pagination_class = UserListPagination +    filter_backends = (DjangoFilterBackend,) +    filter_fields = ('name', 'discriminator')      def get_serializer(self, *args, **kwargs) -> ModelSerializer:          """Set Serializer many attribute to True if request body contains a list.""" | 
