aboutsummaryrefslogtreecommitdiffstats
path: root/api
diff options
context:
space:
mode:
Diffstat (limited to 'api')
-rw-r--r--api/tests/test_snake_names.py27
-rw-r--r--api/viewsets.py49
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({})