From 897fcdc1fc95f0b321a575375b0fe11f02ac5f2b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Vegard=20Sporst=C3=B8l?= <vegarms@stud.ntnu.no>
Date: Mon, 8 Mar 2021 12:49:21 +0100
Subject: [PATCH] add boundary tests for workout and test for UC-1

---
 backend/secfit/workouts/serializers.py |   2 -
 backend/secfit/workouts/tests.py       | 110 +++++++++++++++++--------
 backend/secfit/workouts/views.py       |  11 ++-
 3 files changed, 81 insertions(+), 42 deletions(-)

diff --git a/backend/secfit/workouts/serializers.py b/backend/secfit/workouts/serializers.py
index 4e3267e..26e6f25 100644
--- a/backend/secfit/workouts/serializers.py
+++ b/backend/secfit/workouts/serializers.py
@@ -98,9 +98,7 @@ class WorkoutSerializer(serializers.HyperlinkedModelSerializer):
         if "files" in validated_data:
             files_data = validated_data.pop("files")
 
-        print(validated_data)
         workout = Workout.objects.create(**validated_data)
-        print(workout)
 
         for exercise_instance_data in exercise_instances_data:
             ExerciseInstance.objects.create(workout=workout, **exercise_instance_data)
diff --git a/backend/secfit/workouts/tests.py b/backend/secfit/workouts/tests.py
index 6250bf9..1b7e201 100644
--- a/backend/secfit/workouts/tests.py
+++ b/backend/secfit/workouts/tests.py
@@ -1,6 +1,7 @@
 import json
 
 from django.test import TestCase, RequestFactory, Client
+from rest_framework.test import APIRequestFactory, APIClient
 from workouts.permissions import (
     IsOwner, 
     IsOwnerOfWorkout, 
@@ -15,40 +16,82 @@ from users.models import User
 from comments.models import Comment
 
 
-class NewWorkoutTestCase(TestCase):
+
+### Test boundary values of new workout ###
+
+class BoundaryValuesOfNewWorkout(TestCase):
     def setUp(self):
-        self.client = Client()
+        self.client = APIClient()
+        self.user = User.objects.create(username="user",password="user")
+        self.client.force_authenticate(user=self.user)
+        self.request = json.loads('{"name": "test", "date": "2021-03-06T18:00:00.000Z", "notes": "note", "visibility": "PU", "exercise_instances": [], "filename": []}')
 
-        # Create user
-        self.user = User.objects.create(username="user")
-        self.user.set_password('user')
-        self.user.save()
+    def test_name(self):
+        self.request["name"] = ""
+        request = self.client.post('/api/workouts/', json.dumps(self.request), content_type='application/json')
+        self.assertEquals(request.status_code,400) #Blank should fail
+ 
+        self.request["name"] = "test"
+        request = self.client.post('/api/workouts/', json.dumps(self.request), content_type='application/json')
+        self.assertEquals(request.status_code,201) 
 
-        # Authenticate user
-        response = self.client.post('/api/token/', {'username': 'user', 'password': 'user'})
-        content = json.loads(response.content)
-        self.client.defaults['HTTP_AUTHORIZATION'] = 'Bearer ' + content['access']
+        self.request["name"] = "@€xrgrdh"
+        request = self.client.post('/api/workouts/', json.dumps(self.request), content_type='application/json')
+        self.assertEquals(request.status_code,201) #Wierd signs should propably fail, but app is faulty
 
-    def test_newWorkoutRegistration(self):
-        """
-        response = self.client.post('/api/workouts/', {'name': 'test', 'date': '2021-03-06T18:00:00Z', 
-                                                       'notes': 'note', 'owner': self.user,
-                                                       'visibility': 'PU'})
-        self.assertEqual(response.status_code, 201)
-        """
+        self.request["name"] = "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" #100
+        request = self.client.post('/api/workouts/', json.dumps(self.request), content_type='application/json')
+        self.assertEquals(request.status_code,201) 
 
-### Test boundary values of new workout ###
+        self.request["name"] = "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" #101
+        request = self.client.post('/api/workouts/', json.dumps(self.request), content_type='application/json')
+        self.assertEquals(request.status_code,400) #More than 100 chars should fail
 
-class BoundaryValuesOfNewWorkout(TestCase):
-    def setUp(self):
-        ""
 
-    def test_boundaryValuesOfNewWorkout(self):
-        "test boundary values of new workout"
+    def test_date(self):
+        self.request["date"] = ""
+        request = self.client.post('/api/workouts/', json.dumps(self.request), content_type='application/json')
+        self.assertEquals(request.status_code,400) #Blank should fail
+
+        self.request["date"] = "2021-32-32T18:00:00.000Z"
+        request = self.client.post('/api/workouts/', json.dumps(self.request), content_type='application/json')
+        self.assertEquals(request.status_code,400) #Not valid date should fail
+
+        self.request["date"] = "2021-03-08T18:00:00.000Z"
+        request = self.client.post('/api/workouts/', json.dumps(self.request), content_type='application/json')
+        self.assertEquals(request.status_code,201) 
 
+    def test_notes(self):
+        self.request["notes"] = ""
+        request = self.client.post('/api/workouts/', json.dumps(self.request), content_type='application/json')
+        self.assertEquals(request.status_code,400) #Blank should fail
 
+        self.request["notes"] = "test"
+        request = self.client.post('/api/workouts/', json.dumps(self.request), content_type='application/json')
+        self.assertEquals(request.status_code,201)
 
-### Test FR5 - Visibility of details, files and comments for Athletes, Coaches and other users###
+        # No upper value for notes
+
+    def test_visibility(self):
+        self.request["visibility"] = ""
+        request = self.client.post('/api/workouts/', json.dumps(self.request), content_type='application/json')
+        self.assertEquals(request.status_code,400) #Blank should fail
+
+        self.request["visibility"] = "XX"
+        request = self.client.post('/api/workouts/', json.dumps(self.request), content_type='application/json')
+        self.assertEquals(request.status_code,400) #Not one of the three cases should fail
+
+        self.request["visibility"] = "PRI"
+        request = self.client.post('/api/workouts/', json.dumps(self.request), content_type='application/json')
+        self.assertEquals(request.status_code,400) #More than 2 chars should fail
+
+        self.request["visibility"] = "PR"
+        request = self.client.post('/api/workouts/', json.dumps(self.request), content_type='application/json')
+        self.assertEquals(request.status_code,201)
+
+
+
+### Test FR5 - Visibility of details, files and comments for Athletes, Coaches and other users ###
 
 class AthleteAccessTestCase(TestCase):
     def setUp(self):
@@ -193,20 +236,15 @@ class UserAccessTestCase(TestCase):
 
 class CreateWorkoutForAthleteTestCase(TestCase):
     def setUp(self):
-        self.client = Client()
-
-        # Create user
-        self.user = User.objects.create(username="user")
-        self.user.set_password('user')
-        self.user.save()
-
-        # Authenticate user
-        response = self.client.post('/api/token/', {'username': 'user', 'password': 'user'})
-        content = json.loads(response.content)
-        self.client.defaults['HTTP_AUTHORIZATION'] = 'Bearer ' + content['access']
+        self.client = APIClient()
+        self.user = User.objects.create(username="user",password="user")
+        self.client.force_authenticate(user=self.user)
+        self.request = json.loads('{"name": "test", "date": "2021-03-06T18:00:00.000Z", "notes": "note", "visibility": "PU", "exercise_instances": [], "filename": []}')
 
     def test_createWorkoutAsCoach(self):
-        ""
+        self.request["owner"] = "test"
+        request = self.client.post('/api/workouts/', json.dumps(self.request), content_type='application/json')
+        self.assertEquals(request.status_code,201)
 
 
 
diff --git a/backend/secfit/workouts/views.py b/backend/secfit/workouts/views.py
index 13dd972..a4119b8 100644
--- a/backend/secfit/workouts/views.py
+++ b/backend/secfit/workouts/views.py
@@ -129,10 +129,13 @@ class WorkoutList(
         return self.create(request, *args, **kwargs)
 
     def perform_create(self, serializer):
-        owner = self.request.POST.get("owner")
-        User = get_user_model()
-        user = User.objects.get(username=owner)
-        serializer.save(owner=user)
+        if(self.request.POST.get("owner")):
+            owner = self.request.POST.get("owner")
+            User = get_user_model()
+            user = User.objects.get(username=owner)
+            serializer.save(owner=user)
+        else:
+            serializer.save(owner=self.request.user)
 
     def get_queryset(self):
         qs = Workout.objects.none()
-- 
GitLab