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.
-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({}) |