diff options
| author | 2018-08-16 20:26:08 +0200 | |
|---|---|---|
| committer | 2018-08-16 20:26:08 +0200 | |
| commit | c711496c74def2c8c4460068aa58d2d0188a3a1d (patch) | |
| tree | 5d6ac83f4876b3af90373ef08e39398f4eed2656 | |
| parent | Add tests for the snake name listing API. (diff) | |
Support `get_all` query parameter.
Diffstat (limited to '')
| -rw-r--r-- | api/tests/test_snake_names.py | 27 | ||||
| -rw-r--r-- | api/viewsets.py | 49 | 
2 files changed, 66 insertions, 10 deletions
diff --git a/api/tests/test_snake_names.py b/api/tests/test_snake_names.py index fcb70abd..cc14abb1 100644 --- a/api/tests/test_snake_names.py +++ b/api/tests/test_snake_names.py @@ -10,19 +10,32 @@ class StatusTests(APISubdomainTestCase):          super().setUp()          self.client.force_authenticate(user=None) -    def test_cannot_read_snake_names(self): -        url = reverse('snakename-list', host='api') +    def test_cannot_read_snake_name_list(self): +        url = reverse('bot:snakename-list', host='api')          response = self.client.get(url)          self.assertEqual(response.status_code, 401) +    def test_cannot_read_snake_names_with_get_all_param(self): +        url = reverse('bot:snakename-list', host='api') +        response = self.client.get(f'{url}?get_all=True') + +        self.assertEqual(response.status_code, 401) +  class EmptyDatabaseSnakeNameTests(APISubdomainTestCase): -    def test_endpoint_unauthed_returns_empty_list(self): -        url = reverse('snakename-list', host='api') +    def test_endpoint_returns_empty_object(self): +        url = reverse('bot:snakename-list', host='api')          response = self.client.get(url)          self.assertEqual(response.status_code, 200) +        self.assertEqual(response.json(), {}) + +    def test_endpoint_returns_empty_list_with_get_all_param(self): +        url = reverse('bot:snakename-list', host='api') +        response = self.client.get(f'{url}?get_all=True') + +        self.assertEqual(response.status_code, 200)          self.assertEqual(response.json(), []) @@ -31,9 +44,9 @@ class SnakeNameListTests(APISubdomainTestCase):      def setUpTestData(cls):          cls.snake_python = SnakeName.objects.create(name='Python', scientific='Totally.') -    def test_endpoint_returns_all_snakes(self): -        url = reverse('snakename-list', host='api') -        response = self.client.get(url) +    def test_endpoint_returns_all_snakes_with_get_all_param(self): +        url = reverse('bot:snakename-list', host='api') +        response = self.client.get(f'{url}?get_all=True')          self.assertEqual(response.status_code, 200)          self.assertEqual( diff --git a/api/viewsets.py b/api/viewsets.py index 14e88029..97b0f552 100644 --- a/api/viewsets.py +++ b/api/viewsets.py @@ -1,9 +1,52 @@ -from rest_framework.viewsets import ReadOnlyModelViewSet +from rest_framework.response import Response +from rest_framework.viewsets import ViewSet  from .models import SnakeName  from .serializers import SnakeNameSerializer -class SnakeNameViewSet(ReadOnlyModelViewSet): -    queryset = SnakeName.objects.all() +class SnakeNameViewSet(ViewSet): +    """ +    View of snake names for the bot's snake cog from our first code jam's winners. + +    ## Routes +    ### GET /bot/snake-names +    By default, return a single random snake name in the following format: + +    >>> { +    ...     'name': "Python", +    ...     'scientific': "Langus greatus" +    ... } + +    If the `get_all` query parameter is given, for example using... +        $ curl api.pythondiscord.local:8000/bot/snake-names?get_all=yes +    ...then the API will return all snake names and scientific names in the database, +    for example: + +    >>> [ +    ...     {'name': "Python 3", 'scientific': "Langus greatus"}, +    ...     {'name': "Python 2", 'scientific': "Langus decentus"} +    ... ] +    """ +      serializer_class = SnakeNameSerializer + +    def get_queryset(self): +        return SnakeName.objects.all() + +    def list(self, request): +        if request.query_params.get('get_all'): +            queryset = self.get_queryset() +            serialized = self.serializer_class(queryset, many=True) +            return Response(serialized.data) + +        single_snake = SnakeName.objects.order_by('?').first() +        if single_snake is not None: +            body = { +                'name': single_snake.name, +                'scientific': single_snake.scientific +            } + +            return Response(body) + +        return Response({})  |