From 831991518f0e147b17e6f9ba760570388122740d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20G=C3=B6tz?= Date: Sat, 3 Feb 2018 00:47:55 +0100 Subject: [PATCH 1/4] Add food api tests --- ofu_app/__init__.py | 0 ofu_app/apps/food/api/serializers.py | 10 +- ofu_app/apps/food/api/urls.py | 14 +-- ofu_app/apps/food/tests/__init__.py | 0 ofu_app/apps/food/tests/tests_api.py | 113 ++++++++++++++++++ .../food/{tests.py => tests/tests_model.py} | 2 +- ofu_app/requirements.txt | 1 + 7 files changed, 130 insertions(+), 10 deletions(-) create mode 100644 ofu_app/__init__.py create mode 100644 ofu_app/apps/food/tests/__init__.py create mode 100644 ofu_app/apps/food/tests/tests_api.py rename ofu_app/apps/food/{tests.py => tests/tests_model.py} (93%) diff --git a/ofu_app/__init__.py b/ofu_app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ofu_app/apps/food/api/serializers.py b/ofu_app/apps/food/api/serializers.py index b48d4e2..98f2cfc 100644 --- a/ofu_app/apps/food/api/serializers.py +++ b/ofu_app/apps/food/api/serializers.py @@ -1,6 +1,6 @@ from rest_framework import serializers -from apps.food.models import Menu, SingleFood, HappyHour, Allergene, UserFoodImage +from apps.food.models import Menu, SingleFood, HappyHour, Allergene, UserFoodImage, FoodImage class UserFoodImageSerializer(serializers.HyperlinkedModelSerializer): @@ -9,6 +9,12 @@ class UserFoodImageSerializer(serializers.HyperlinkedModelSerializer): fields = ('id', 'image_image', 'image_thumb') +class FoodImageSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = FoodImage + fields = ('id', 'image', 'thumb') + + class AllergensSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Allergene @@ -17,7 +23,7 @@ class AllergensSerializer(serializers.HyperlinkedModelSerializer): class SingleFoodSerializer(serializers.HyperlinkedModelSerializer): allergens = AllergensSerializer(many=True, read_only=True) - image = UserFoodImageSerializer(many=True, read_only=True) + image = FoodImageSerializer(many=False, read_only=True) class Meta: model = SingleFood diff --git a/ofu_app/apps/food/api/urls.py b/ofu_app/apps/food/api/urls.py index 5cd1457..66bcd5b 100644 --- a/ofu_app/apps/food/api/urls.py +++ b/ofu_app/apps/food/api/urls.py @@ -19,15 +19,15 @@ from apps.food.models import Menu urlpatterns = [ # API Version 1.1 - url(r'^food/$', api_views.FoodViewSetV1_1.as_view({'get': 'list'})), + url(r'^food/$', api_views.FoodViewSetV1_1.as_view({'get': 'list'}), name='api-v1_1-food-all'), url(r'^food/(?P' + Menu.FEKI + '|' + Menu.MARKUSPLATZ + '|' + Menu.ERBA + '|' + Menu.AUSTRASSE + ')/$', - api_views.FoodViewSetV1_1.as_view({'get': 'list'})), + api_views.FoodViewSetV1_1.as_view({'get': 'list'}), name='api-v1_1-food-location'), url(r'food/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/$', - api_views.FoodViewSetV1_1.as_view({'get': 'list'})), + api_views.FoodViewSetV1_1.as_view({'get': 'list'}), name='api-v1_1-food-date'), url( r'food/(?P' + Menu.FEKI + '|' + Menu.MARKUSPLATZ + '|' + Menu.ERBA + '|' + Menu.AUSTRASSE + ')/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/$', - api_views.FoodViewSetV1_1.as_view({'get': 'list'})), - url(r'food/today/$', api_views.FoodViewSetV1_1.as_view({'get': 'list'})), - url(r'food/week/$', api_views.FoodViewSetV1_1.as_view({'get': 'list'})), - url(r'happy-hour', api_views.HappyHourViewSet.as_view({'get': 'list'})), + api_views.FoodViewSetV1_1.as_view({'get': 'list'}), name='api-v1_1-food-location-date'), + url(r'food/today/$', api_views.FoodViewSetV1_1.as_view({'get': 'list'}), name='api-v1_1-food-today'), + url(r'food/week/$', api_views.FoodViewSetV1_1.as_view({'get': 'list'}), name='api-v1_1-food-week'), + url(r'happy-hour', api_views.HappyHourViewSet.as_view({'get': 'list'}), name='api-v1_1-happy-hour-all'), ] diff --git a/ofu_app/apps/food/tests/__init__.py b/ofu_app/apps/food/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ofu_app/apps/food/tests/tests_api.py b/ofu_app/apps/food/tests/tests_api.py new file mode 100644 index 0000000..ce2bdbc --- /dev/null +++ b/ofu_app/apps/food/tests/tests_api.py @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.test import TestCase +from django.urls import reverse +from apps.food.models import SingleFood, Menu +from apps.food.api.serializers import MenuSerializer +from rest_framework import status +from rest_framework.test import APIRequestFactory + +from datetime import datetime + + +# Create your tests here. + +class SingleFood_Scope(TestCase): + def setUp(self): + self.singlefood_1 = SingleFood.objects.create(name="testfood1") + self.singlefood_2 = SingleFood.objects.create(name="testfood2") + self.singlefood_3 = SingleFood.objects.create(name="testfood3") + self.singlefood_4 = SingleFood.objects.create(name="testfood4") + self.singlefood_5 = SingleFood.objects.create(name="testfood5") + self.singlefood_6 = SingleFood.objects.create(name="testfood6") + self.menu_1 = Menu.objects.create(date='2017-01-15', location=Menu.ERBA) + self.menu_1.menu.add(self.singlefood_1) + self.menu_1.menu.add(self.singlefood_2) + self.menu_1.menu.add(self.singlefood_3) + self.menu_2 = Menu.objects.create(date='2017-01-10', location=Menu.FEKI) + self.menu_2.menu.add(self.singlefood_4) + self.menu_2.menu.add(self.singlefood_5) + self.menu_2.menu.add(self.singlefood_6) + + def test_get_food_root(self): + """ + Right response on /food/api/v1.1/food + """ + menus = Menu.objects.all() + serializer = MenuSerializer(menus, many=True) + response = self.client.get(reverse('api-v1_1-food-all')) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, serializer.data) + + def test_get_food_date_param(self): + """ + Right response on /food/api/v1.1/food/2017/02/15/ + """ + serializer = MenuSerializer(self.menu_2, many=False) + response_1 = self.client.get(reverse('api-v1_1-food-date', kwargs={'year': '2017', 'month': '01', 'day': '10'})) + self.assertEqual(response_1.status_code, 200) + self.assertEqual(response_1.data, [serializer.data]) + + serializer_2 = MenuSerializer(self.menu_1, many=False) + response_2 = self.client.get(reverse('api-v1_1-food-date', kwargs={'year': '2017', 'month': '01', 'day': '15'})) + self.assertEqual(response_2.status_code, 200) + self.assertEqual(response_2.data, [serializer_2.data]) + + def test_get_food_date_param_not_in_set(self): + """ + Right response on /food/api/v1.1/food/2017/02/15/ + """ + response_1 = self.client.get(reverse('api-v1_1-food-date', kwargs={'year': '2017', 'month': '01', 'day': '11'})) + self.assertEqual(response_1.status_code, 200) + self.assertEqual(response_1.data, []) + + def test_get_food_location_param(self): + """ + Right response on /food/api/v1.1/food/2017/02/15/ + """ + serializer_1 = MenuSerializer(self.menu_1, many=False) + response_1 = self.client.get(reverse('api-v1_1-food-location', kwargs={'location': Menu.ERBA})) + self.assertEqual(response_1.status_code, 200) + self.assertEqual(response_1.data, [serializer_1.data]) + + serializer_2 = MenuSerializer(self.menu_2, many=False) + response_2 = self.client.get(reverse('api-v1_1-food-location', kwargs={'location': Menu.FEKI})) + self.assertEqual(response_2.status_code, 200) + self.assertEqual(response_2.data, [serializer_2.data]) + + def test_get_food_location_param_not_in_set(self): + """ + Right response on /food/api/v1.1/food/2017/02/15/ + """ + response_1 = self.client.get(reverse('api-v1_1-food-location', kwargs={'location': Menu.AUSTRASSE})) + self.assertEqual(response_1.status_code, 200) + self.assertEqual(response_1.data, []) + + def test_get_food_location_date_param(self): + """ + Right response on /food/api/v1.1/food/2017/02/15/ + """ + + serializer = MenuSerializer(self.menu_2, many=False) + response = self.client.get(reverse('api-v1_1-food-location-date', + kwargs={'year': '2017', 'month': '01', 'day': '10', + 'location': Menu.FEKI})) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.data, [serializer.data]) + + def test_get_food_location_date_param_not_in_set(self): + """ + Right response on /food/api/v1.1/food/2017/02/15/ + """ + response_1 = self.client.get(reverse('api-v1_1-food-location-date', + kwargs={'year': '2017', 'month': '01', 'day': '11', + 'location': Menu.FEKI})) + self.assertEqual(response_1.status_code, 200) + self.assertEqual(response_1.data, []) + + response_1 = self.client.get(reverse('api-v1_1-food-location-date', + kwargs={'year': '2017', 'month': '01', 'day': '10', + 'location': Menu.AUSTRASSE})) + self.assertEqual(response_1.status_code, 200) + self.assertEqual(response_1.data, []) diff --git a/ofu_app/apps/food/tests.py b/ofu_app/apps/food/tests/tests_model.py similarity index 93% rename from ofu_app/apps/food/tests.py rename to ofu_app/apps/food/tests/tests_model.py index 7c5a500..7c2aa3b 100644 --- a/ofu_app/apps/food/tests.py +++ b/ofu_app/apps/food/tests/tests_model.py @@ -8,7 +8,7 @@ from apps.food.models import SingleFood # Create your tests here. -class SingleFood_Created_Just_with_name(TestCase): +class SingleFood_Scope(TestCase): def setUp(self): SingleFood.objects.create(name="testfood") diff --git a/ofu_app/requirements.txt b/ofu_app/requirements.txt index 0f2cf6f..3953827 100644 --- a/ofu_app/requirements.txt +++ b/ofu_app/requirements.txt @@ -6,4 +6,5 @@ requests==2.18.4 beautifulsoup4==4.6.0 #psycopg2==2.7.3.2 xmltodict==0.11.0 +coverage==3.6 From d300ead7233a535411677872d503bb5e376c7120 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20G=C3=B6tz?= Date: Sat, 3 Feb 2018 11:52:44 +0100 Subject: [PATCH 2/4] Add food api test --- ofu_app/apps/food/api/views.py | 57 ++++++++++++++++++++++++++++ ofu_app/apps/food/tests/tests_api.py | 47 ++++++++++++++++------- 2 files changed, 91 insertions(+), 13 deletions(-) diff --git a/ofu_app/apps/food/api/views.py b/ofu_app/apps/food/api/views.py index 5ec88f1..1a5e566 100644 --- a/ofu_app/apps/food/api/views.py +++ b/ofu_app/apps/food/api/views.py @@ -112,6 +112,63 @@ class FoodViewSetV1_1(viewsets.ModelViewSet, ): return queryset +# @api_view(['GET']) +@permission_classes((AllowAny,)) +class FoodViewSetV1_1_Defaults(viewsets.ModelViewSet, ): + """ + API endpoint that allows users to be viewed or edited. + """ + # queryset = Menu.objects.all() + serializer_class = MenuSerializer + + def get_queryset(self): + queryset = Menu.objects.all() + location = None + if 'location' in self.kwargs: + location = self.kwargs['location'] + + year = None + if 'year' in self.kwargs: + year = self.kwargs['year'] + month = None + if 'month' in self.kwargs: + month = self.kwargs['month'] + day = None + if 'day' in self.kwargs: + day = self.kwargs['day'] + + if location: + if str(location).upper() == Menu.ERBA.upper(): + queryset = queryset.filter(location__contains=Menu.ERBA) + elif str(location).upper() == Menu.FEKI.upper(): + queryset = queryset.filter(location__contains=Menu.FEKI) + elif str(location).upper() == Menu.AUSTRASSE.upper(): + print("Before: " + str(queryset)) + queryset = queryset.filter(location__contains=Menu.AUSTRASSE) + elif str(location).upper() == Menu.MARKUSPLATZ.upper(): + queryset = queryset.filter(location__contains=Menu.MARKUSPLATZ) + print(queryset) + if year and month and day: + date = '%s-%s-%s' % (year, month, day) + queryset = queryset.filter(date=datetime.strptime(date, '%Y-%m-%d')) + + # if date == "week": + # today = datetime.now() + # weekday = today.weekday() + # monday = today - timedelta(weekday) + # sunday = today + (timedelta(6 - weekday)) + # print("Monday: " + str(monday)) + # print("Sunday: " + str(sunday)) + # queryset = queryset.filter(date__gte=monday, date__lte=sunday) + # else: + # queryset = queryset.filter(date=datetime.strptime(date, "%Y-%m-%d")) + + print("LOCATION: %s" % str(location)) + print(str(queryset)) + + return queryset + + # @api_view(['GET']) @permission_classes((AllowAny,)) class HappyHourViewSet(viewsets.ModelViewSet): diff --git a/ofu_app/apps/food/tests/tests_api.py b/ofu_app/apps/food/tests/tests_api.py index ce2bdbc..18d16a4 100644 --- a/ofu_app/apps/food/tests/tests_api.py +++ b/ofu_app/apps/food/tests/tests_api.py @@ -21,10 +21,10 @@ class SingleFood_Scope(TestCase): self.singlefood_4 = SingleFood.objects.create(name="testfood4") self.singlefood_5 = SingleFood.objects.create(name="testfood5") self.singlefood_6 = SingleFood.objects.create(name="testfood6") - self.menu_1 = Menu.objects.create(date='2017-01-15', location=Menu.ERBA) - self.menu_1.menu.add(self.singlefood_1) - self.menu_1.menu.add(self.singlefood_2) - self.menu_1.menu.add(self.singlefood_3) + self.today_menu = Menu.objects.create(date='2017-01-15', location=Menu.ERBA) + self.today_menu.menu.add(self.singlefood_1) + self.today_menu.menu.add(self.singlefood_2) + self.today_menu.menu.add(self.singlefood_3) self.menu_2 = Menu.objects.create(date='2017-01-10', location=Menu.FEKI) self.menu_2.menu.add(self.singlefood_4) self.menu_2.menu.add(self.singlefood_5) @@ -32,7 +32,7 @@ class SingleFood_Scope(TestCase): def test_get_food_root(self): """ - Right response on /food/api/v1.1/food + All menus in response """ menus = Menu.objects.all() serializer = MenuSerializer(menus, many=True) @@ -42,21 +42,21 @@ class SingleFood_Scope(TestCase): def test_get_food_date_param(self): """ - Right response on /food/api/v1.1/food/2017/02/15/ + Menu for a given date is in the response """ serializer = MenuSerializer(self.menu_2, many=False) response_1 = self.client.get(reverse('api-v1_1-food-date', kwargs={'year': '2017', 'month': '01', 'day': '10'})) self.assertEqual(response_1.status_code, 200) self.assertEqual(response_1.data, [serializer.data]) - serializer_2 = MenuSerializer(self.menu_1, many=False) + serializer_2 = MenuSerializer(self.today_menu, many=False) response_2 = self.client.get(reverse('api-v1_1-food-date', kwargs={'year': '2017', 'month': '01', 'day': '15'})) self.assertEqual(response_2.status_code, 200) self.assertEqual(response_2.data, [serializer_2.data]) def test_get_food_date_param_not_in_set(self): """ - Right response on /food/api/v1.1/food/2017/02/15/ + Empty response if no object with request date in set """ response_1 = self.client.get(reverse('api-v1_1-food-date', kwargs={'year': '2017', 'month': '01', 'day': '11'})) self.assertEqual(response_1.status_code, 200) @@ -64,9 +64,9 @@ class SingleFood_Scope(TestCase): def test_get_food_location_param(self): """ - Right response on /food/api/v1.1/food/2017/02/15/ + Menu for a given location is in the response """ - serializer_1 = MenuSerializer(self.menu_1, many=False) + serializer_1 = MenuSerializer(self.today_menu, many=False) response_1 = self.client.get(reverse('api-v1_1-food-location', kwargs={'location': Menu.ERBA})) self.assertEqual(response_1.status_code, 200) self.assertEqual(response_1.data, [serializer_1.data]) @@ -78,7 +78,7 @@ class SingleFood_Scope(TestCase): def test_get_food_location_param_not_in_set(self): """ - Right response on /food/api/v1.1/food/2017/02/15/ + Empty response if no object with request location in set """ response_1 = self.client.get(reverse('api-v1_1-food-location', kwargs={'location': Menu.AUSTRASSE})) self.assertEqual(response_1.status_code, 200) @@ -86,7 +86,7 @@ class SingleFood_Scope(TestCase): def test_get_food_location_date_param(self): """ - Right response on /food/api/v1.1/food/2017/02/15/ + Menu for request location and date is in the response """ serializer = MenuSerializer(self.menu_2, many=False) @@ -98,7 +98,7 @@ class SingleFood_Scope(TestCase): def test_get_food_location_date_param_not_in_set(self): """ - Right response on /food/api/v1.1/food/2017/02/15/ + Empty response if no object with request date and location in set """ response_1 = self.client.get(reverse('api-v1_1-food-location-date', kwargs={'year': '2017', 'month': '01', 'day': '11', @@ -111,3 +111,24 @@ class SingleFood_Scope(TestCase): 'location': Menu.AUSTRASSE})) self.assertEqual(response_1.status_code, 200) self.assertEqual(response_1.data, []) + + def test_get_food_today_param(self): + """ + Menu for request today is in the response + """ + self.singlefood = SingleFood.objects.create(name="testfood") + self.today_menu = Menu.objects.create(date=datetime.today().strftime('%Y-%m-%d'), location=Menu.ERBA) + self.today_menu.menu.add(self.singlefood) + + serializer = MenuSerializer(self.today_menu, many=False) + response = self.client.get(reverse('api-v1_1-food-today')) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.data, [serializer.data]) + + def test_get_food_today_param_not_in_set(self): + """ + Empty response if no object with date 'today' is in set + """ + response = self.client.get(reverse('api-v1_1-food-today')) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.data, []) From 2150bf5b741fb0edf0dd77722ad794ab40070058 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20G=C3=B6tz?= Date: Mon, 5 Feb 2018 00:13:52 +0100 Subject: [PATCH 3/4] Add food api today test --- ofu_app/apps/food/api/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ofu_app/apps/food/api/views.py b/ofu_app/apps/food/api/views.py index 1a5e566..5e73da7 100644 --- a/ofu_app/apps/food/api/views.py +++ b/ofu_app/apps/food/api/views.py @@ -114,7 +114,7 @@ class FoodViewSetV1_1(viewsets.ModelViewSet, ): # @api_view(['GET']) @permission_classes((AllowAny,)) -class FoodViewSetV1_1_Defaults(viewsets.ModelViewSet, ): +class FoodViewSetV1_1(viewsets.ModelViewSet, ): """ API endpoint that allows users to be viewed or edited. """ From a39dac8363d1f12e6d33584cc3eea00bc19ebcba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20G=C3=B6tz?= Date: Mon, 5 Feb 2018 00:16:25 +0100 Subject: [PATCH 4/4] Update gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 0bd3a85..2921fbe 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ docker.env static_files/ +coverage_html/ # Created by https://www.gitignore.io/api/pycharm,python,django .idea/