diff --git a/backend/secfit/.coverage b/backend/secfit/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..c8e6278232f9a5fbd9914fffb587ee1587ae6212 Binary files /dev/null and b/backend/secfit/.coverage differ diff --git a/backend/secfit/workouts/tests.py b/backend/secfit/workouts/tests.py index 3d9f0f51c7810d79c2f476db5641b764d7086e29..eacc9d8ef3e645be287793953018aa1ad3a09ad8 100644 --- a/backend/secfit/workouts/tests.py +++ b/backend/secfit/workouts/tests.py @@ -31,14 +31,9 @@ class IsOwnerTestCase(TestCase): self.client_2 = APIClient() def test_has_object_permission(self): - - self.client_1.login(username="Bill", password="secret") - self.client_2.login(username="Alice", password="supersecret") - self.client_1.force_authenticate(user=self.user_1) self.client_2.force_authenticate(user=self.user_2) - #Disse må kanskje endres når vi setter de inn i CI. request_1 = self.client_1.get("http://testserver/api/workouts/1/") request_2 = self.client_2.get("http://testserver/api/workouts/1/") @@ -79,13 +74,9 @@ class IsOwnerOfWorkoutTestCase(TestCase): self.client_2 = APIClient() def test_has_permission(self): - self.client_1.login(username="Bill", password="secret") - self.client_2.login(username="Alice", password="supersecret") - self.client_1.force_authenticate(user=self.user_1) self.client_2.force_authenticate(user=self.user_2) - #Disse må kanskje endres når vi setter de inn i CI. get_request_1 = self.client_1.get("http://testserver/api/workouts/1/") get_request_2 = self.client_2.get("http://testserver/api/workouts/1/") post_request_1 = self.client_1.post("http://testserver/api/workouts/",{\ @@ -112,13 +103,9 @@ class IsOwnerOfWorkoutTestCase(TestCase): self.assertTrue(IsOwnerOfWorkout.has_permission(self,post_request_1,None)) def test_has_object_permission(self): - self.client_1.login(username="Bill", password="secret") - self.client_2.login(username="Alice", password="supersecret") - self.client_1.force_authenticate(user=self.user_1) self.client_2.force_authenticate(user=self.user_2) - #Disse må kanskje endres når vi setter de inn i CI. request_1 = self.client_1.get("http://testserver/api/workouts/1/") request_2 = self.client_2.get("http://testserver/api/workouts/1/") @@ -145,10 +132,222 @@ class IsOwnerOfWorkoutTestCase(TestCase): class IsCoachAndVisibleToCoachTestCase(TestCase): def setUp(self): - pass + User.objects.create(id="1",username="Bill",password="secret") + User.objects.create(id="2",username="Alice",password="supersecret") + + self.user_1 = User.objects.get(id="1") + self.user_2 = User.objects.get(id="2") + + #Sets up Bill to be Alice's coach but not Allice to be Bill's coach + self.user_2.coach = self.user_1 + + Workout.objects.create(id="1",name="Bill's workout",date=timezone.now(),owner=self.user_1,visibility="CO") + Workout.objects.create(id="2",name="Allice's workout",date=timezone.now(),owner=self.user_2,visibility="CO") + self.workout_1 = Workout.objects.get(name="Bill's workout") + self.workout_2 = Workout.objects.get(name="Allice's workout") + self.workout_2.owner.coach = self.user_1 + + Workout.objects.create(id="3",name="Bill's public workout",date=timezone.now(),owner=self.user_1,visibility="PU") + Workout.objects.create(id="4",name="Allice's public workout",date=timezone.now(),owner=self.user_2,visibility="PU") + self.workout_3 = Workout.objects.get(name="Bill's public workout") + self.workout_4 = Workout.objects.get(name="Allice's public workout") + + self.client_1 = APIClient() + self.client_2 = APIClient() + + def test_has_object_permission(self): + self.client_1.force_authenticate(user=self.user_1) + self.client_2.force_authenticate(user=self.user_2) + + request_1 = self.client_1.get("http://testserver/api/workouts/2/") + request_2 = self.client_2.get("http://testserver/api/workouts/1/") + + request_3 = self.client_1.get("http://testserver/api/workouts/4/") + request_4 = self.client_2.get("http://testserver/api/workouts/3/") + + request_1.user = self.user_1 + request_2.user = self.user_2 + request_3.user = self.user_1 + request_4.user = self.user_2 + + #Bill, who is Allice's coach and sends request 1 for workout 2 (Alice's workout) should receive access + self.assertTrue(IsCoachAndVisibleToCoach.has_object_permission(self,request_1,None,self.workout_2)) + #Allice should not be able to see Bill's workout since she is not Bill's coach + self.assertFalse(IsCoachAndVisibleToCoach.has_object_permission(self,request_2,None,self.workout_1)) + + #Both of the public workouts should be available + self.assertEqual(request_3.status_code,200) + self.assertEqual(request_4.status_code,200) + + def tearDown(self): + return super().tearDown() + +class IsCoachOfOwrkoutAndVisibleToCoachTestCase(TestCase): + def setUp(self): + User.objects.create(id="1",username="Bill",password="secret") + User.objects.create(id="2",username="Alice",password="supersecret") + + self.user_1 = User.objects.get(id="1") + self.user_2 = User.objects.get(id="2") + + #Sets up Bill to be Alice's coach but not Allice to be Bill's coach + self.user_2.coach = self.user_1 + + Workout.objects.create(id="1",name="Bill's workout",date=timezone.now(),owner=self.user_1,visibility="CO") + Workout.objects.create(id="2",name="Allice's workout",date=timezone.now(),owner=self.user_2,visibility="CO") + self.workout_1 = Workout.objects.get(name="Bill's workout") + self.workout_2 = Workout.objects.get(name="Allice's workout") + self.workout_2.owner.coach = self.user_1 + + self.client_1 = APIClient() + self.client_2 = APIClient() + + def test_has_object_permission(self): + self.client_1.force_authenticate(user=self.user_1) + self.client_2.force_authenticate(user=self.user_2) + + request_1 = self.client_1.get("http://testserver/api/workouts/2/") + request_2 = self.client_2.get("http://testserver/api/workouts/1/") + + request_3 = self.client_1.get("http://testserver/api/workouts/4/") + request_4 = self.client_2.get("http://testserver/api/workouts/3/") + + request_1.user = self.user_1 + request_2.user = self.user_2 + + class WorkOutClass: + def __init__(self,workout): + self.workout = workout + + workout_obj_1 = WorkOutClass(self.workout_1) + workout_obj_2 = WorkOutClass(self.workout_2) + + #Bill, who is Allice's coach and sends request 1 for workout 2 (Alice's workout) should receive access + self.assertTrue(IsCoachOfWorkoutAndVisibleToCoach.has_object_permission(self,request_1,None,workout_obj_2)) + #Allice should not be able to see Bill's workout since she is not Bill's coach + self.assertFalse(IsCoachOfWorkoutAndVisibleToCoach.has_object_permission(self,request_2,None,workout_obj_1)) + + def tearDown(self): + return super().tearDown() + +class IsPublicTestCase(TestCase): + def setUp(self): + User.objects.create(id="1",username="Bill",password="secret") + self.user_1 = User.objects.get(id="1") + + Workout.objects.create(id="1",name="Bill's public workout",date=timezone.now(),owner=self.user_1,visibility="PU") + Workout.objects.create(id="2",name="Bill's workout",date=timezone.now(),owner=self.user_1,visibility="CO") + Workout.objects.create(id="3",name="Bill's private workout",date=timezone.now(),owner=self.user_1,visibility="PR") + self.workout_1 = Workout.objects.get(name="Bill's public workout") + self.workout_2 = Workout.objects.get(name="Bill's workout") + self.workout_3 = Workout.objects.get(name="Bill's private workout") + + self.client_1 = APIClient() + + def test_has_object_permission(self): + self.client_1.force_authenticate(user=self.user_1) + + request_1 = self.client_1.get("http://testserver/api/workouts/1/") + request_2 = self.client_1.get("http://testserver/api/workouts/2/") + request_3 = self.client_1.get("http://testserver/api/workouts/2/") + + request_1.user = self.user_1 + request_2.user = self.user_1 + request_3.user = self.user_1 + + + #Bill, who is Allice's coach and sends request 1 for workout 2 (Alice's workout) should receive access + self.assertTrue(IsPublic.has_object_permission(self,request_1,None,self.workout_1)) + self.assertFalse(IsPublic.has_object_permission(self,request_2,None,self.workout_2)) + self.assertFalse(IsPublic.has_object_permission(self,request_3,None,self.workout_3)) + + def tearDown(self): + return super().tearDown() + +class IsWorkoutPublicTestCase(TestCase): + def setUp(self): + User.objects.create(id="1",username="Bill",password="secret") + self.user_1 = User.objects.get(id="1") + + Workout.objects.create(id="1",name="Bill's workout",date=timezone.now(),owner=self.user_1,visibility="PU") + Workout.objects.create(id="2",name="Bill's public workout",date=timezone.now(),owner=self.user_1,visibility="CO") + Workout.objects.create(id="3",name="Bill's private workout",date=timezone.now(),owner=self.user_1,visibility="PR") + + self.workout_1 = Workout.objects.get(name="Bill's workout") + self.workout_2 = Workout.objects.get(name="Bill's public workout") + self.workout_3 = Workout.objects.get(name="Bill's private workout") + + + self.client_1 = APIClient() + + def test_has_object_permission(self): + self.client_1.force_authenticate(user=self.user_1) + + request_1 = self.client_1.get("http://testserver/api/workouts/1/") + request_2 = self.client_1.get("http://testserver/api/workouts/2/") + request_3 = self.client_1.get("http://testserver/api/workouts/2/") + + + request_1.user = self.user_1 + request_2.user = self.user_1 + request_3.user = self.user_1 + + + class WorkOutClass: + def __init__(self,workout): + self.workout = workout + + workout_obj_1 = WorkOutClass(self.workout_1) + workout_obj_2 = WorkOutClass(self.workout_2) + workout_obj_3 = WorkOutClass(self.workout_3) + + + #The first + self.assertTrue(IsWorkoutPublic.has_object_permission(self,request_1,None,workout_obj_1)) + self.assertFalse(IsWorkoutPublic.has_object_permission(self,request_2,None,workout_obj_2)) + self.assertFalse(IsWorkoutPublic.has_object_permission(self,request_3,None,workout_obj_3)) + + def tearDown(self): + return super().tearDown() + +class IsReadOnlyTestCase(TestCase): + def setUp(self): + User.objects.create(id="1",username="Bill",password="secret") + self.user_1 = User.objects.get(id="1") + + Workout.objects.create(id="1",name="Bill's public workout",date=timezone.now(),owner=self.user_1,visibility="PU") + self.workout_1 = Workout.objects.get(name="Bill's public workout") + + self.client_1 = APIClient() def test_has_object_permission(self): - pass + self.client_1.force_authenticate(user=self.user_1) + + get_request = self.client_1.get("http://testserver/api/workouts/1/") + head_request = self.client_1.head("http://testserver/api/workouts/1/") + options_request = self.client_1.options("http://testserver/api/workouts/1/") + put_request = self.client_1.post("http://testserver/api/workouts/",{\ + 'name':'myeditedworkout', 'date':timezone.now(), 'notes':'QWERTY', 'exercise_instances':[], 'visbility':'PR'},format='json') + post_request = self.client_1.post("http://testserver/api/workouts/",{\ + 'name':'myworkout', 'date':timezone.now(), 'notes':'qwerty', 'exercise_instances':[], 'visbility':'PR'},format='json') + delete_request = self.client_1.delete("http://testserver/api/workouts/2/") + + get_request.method = get_request.request.get("REQUEST_METHOD") + head_request.method = head_request.request.get("REQUEST_METHOD") + options_request.method = options_request.request.get("REQUEST_METHOD") + put_request.method = put_request.request.get("REQUEST_METHOD") + post_request.method = post_request.request.get("REQUEST_METHOD") + delete_request.method = delete_request.request.get("REQUEST_METHOD") + + #Checks that GET, HEAD and OPTIONS requests return true. + self.assertTrue(IsReadOnly.has_object_permission(self,get_request,None,None)) + self.assertTrue(IsReadOnly.has_object_permission(self,head_request,None,None)) + self.assertTrue(IsReadOnly.has_object_permission(self,options_request,None,None)) + + #Checks that PUT, POST and DELETE requests fail this permission + self.assertFalse(IsReadOnly.has_object_permission(self,put_request,None,None)) + self.assertFalse(IsReadOnly.has_object_permission(self,post_request,None,None)) + self.assertFalse(IsReadOnly.has_object_permission(self,delete_request,None,None)) def tearDown(self): return super().tearDown() \ No newline at end of file