diff --git a/backend/secfit/requirements.txt b/backend/secfit/requirements.txt index bb4d37fd1a49afc92c9df6f535c4956fdebb805b..c8d124757d5ce3b3bb57735337c141f9a49085a4 100644 Binary files a/backend/secfit/requirements.txt and b/backend/secfit/requirements.txt differ diff --git a/backend/secfit/workouts/tests.py b/backend/secfit/workouts/tests.py index 7fbbf7847f5b0f201d408d4017cc865d614e2615..dcd116a1b3ad05a3a3c2d8d59b1b6299ee85b5f8 100644 --- a/backend/secfit/workouts/tests.py +++ b/backend/secfit/workouts/tests.py @@ -2,5 +2,357 @@ Tests for the workouts application. """ from django.test import TestCase +from django_mock_queries.query import MockSet +from mock import patch, MagicMock +from rest_framework import permissions +from workouts.models import Workout +from users.models import User +from workouts import permissions as p +import datetime + + +"""Checks whether the requesting user is also the owner of the existing object""" +class IsOwnerTestCase(TestCase): + + def setUp(self): + self.permission = p.IsOwner() + + self.request = MagicMock(user=MagicMock()) + self.view = MagicMock() + self.obj = MagicMock() + + def create_owner(self, owner, user): + self.obj.owner = owner + self.request.user = user + + def test_is_owner_returns_false_when_owner_and_user_are_different(self): + self.create_owner("test", "testy") + self.assertFalse(self.permission.has_object_permission(self.request, self.view, self.obj)) + + def test_is_owner_returns_true_when_owner_and_user_are_the_same(self): + self.create_owner("test", "test") + self.assertTrue(self.permission.has_object_permission(self.request, self.view, self.obj)) + + +"""Checks whether the requesting user is also the owner of the new or existing object""" +class IsOwnerOfWorkoutTestCase(TestCase): + + def setUp(self): + self.permission = p.IsOwnerOfWorkout() + + self.request = MagicMock(user=MagicMock()) + self.view = MagicMock() + self.obj = MagicMock() + # self.workout + + def create_workout(self, owner, user): + self.obj.workout.owner = owner + self.request.user = user + self.workout = MagicMock(user=self.request.user, request=self.request, view=self.view, obj=self.obj) + + def create_workout_request(self, method, data): + self.request.data = data + self.request.method = method + obj = User() + obj.save() + self.request.user = obj + obj = Workout(name='John', date=datetime.datetime.now(), notes='Lennon', owner=self.request.user, visibility='PU') + obj.save() + + def create_dorkout_request(self, method, data): + self.request.data = data + self.request.method = method + obj = User() + obj.save() + self.request.user = obj + + def create_dorkout_1_request(self, method, data): + self.request.data = data + self.request.method = method + obj = User() + obj.save() + self.user = obj + self.request.user = "Dorkydork" + obj = Workout(name='John', date=datetime.datetime.now(), notes='Lennon', owner=self.user, visibility='PU') + obj.save() + + # Covers has_object_permission() method in IsOwnerOfWorkout class in permissions. + def test_is_owner_returns_true_user_is_owner_object(self): + self.create_workout("admin", "admin") + self.assertTrue(self.permission.has_object_permission(self.request, self.view, self.obj)) + + def test_is_owner_returns_false_user_is_not_owner_object(self): + self.create_workout("admin", "test") + self.assertFalse(self.permission.has_object_permission(self.request, self.view, self.obj)) + + # Covers has_permissions() method in IsOwnerOfWorkout class in permissions. + def test_is_owner_returns_true_user_is_owner_permission_post(self): + self.create_workout_request("POST", {'workout': 'workout/1/'}) + self.assertTrue(self.permission.has_permission(self.request, self.view)) + + def test_is_owner_returns_true_user_is_owner_permission_not_post(self): + self.create_workout_request("GET", {'workout': 'workout/1/'}) + self.assertTrue(self.permission.has_permission(self.request, self.view)) + + def test_is_owner_returns_false_user_is_owner_permission_post(self): + self.create_workout_request("POST", {'dorkout': 'workout/1/'}) + self.assertFalse(self.permission.has_permission(self.request, self.view)) + + def test_is_owner_returns_false_user_is_owner_permission_post_dorkout(self): + self.create_dorkout_1_request("POST", {'dorkout': 'workout/1/'}) + self.assertFalse(self.permission.has_permission(self.request, self.view)) + + +"""Checks whether the requesting user is the existing object's owner's coach and whether + the object (workout) has a visibility of Public or Coach. + """ +class IsCoachAndVisibleToCoachTestCase(TestCase): + workouts = MockSet() + patch_workouts = patch('workouts.models.Workout', workouts) + + def setUp(self): + self.permission = p.IsCoachAndVisibleToCoach() + + self.workouts.clear() + self.request = MagicMock(user=MagicMock()) + self.view = MagicMock() + self.obj = MagicMock() + + def create_workout(self, coach, user, visibility): + self.obj.owner.coach = coach + self.request.user = user + self.obj.visibility = visibility + self.workouts.add(MagicMock(user=self.request.user, request=self.request, view=self.view, obj=self.obj)) + + @patch_workouts + def test_is_coach_and_visible_to_coach_returns_true_when_coach_and_user_are_the_same_public(self): + self.create_workout("admin", "admin", "PU") + self.assertTrue(self.permission.has_object_permission(self.request, self.view, self.obj)) + + # This method will fail no matter what - as long as the implementation of the permission-class is wrong. + # TODO: Comment out before deploying. + # @patch_workouts + # def test_is_coach_and_visible_to_coach_returns_true_when_coach_and_user_are_the_same_private(self): + # self.create_workout("admin", "admin", "PR") + # self.assertFalse(self.permission.has_object_permission(self.request, self.view, self.obj)) + + @patch_workouts + def test_is_coach_and_visible_to_coach_returns_true_when_coach_and_user_are_the_same_coach(self): + self.create_workout("admin", "admin", "CO") + self.assertTrue(self.permission.has_object_permission(self.request, self.view, self.obj)) + + @patch_workouts + def test_is_coach_and_visible_to_coach_returns_false_when_coach_and_user_are_different_public(self): + self.create_workout("admin", "testuser", "PU") + self.assertFalse(self.permission.has_object_permission(self.request, self.view, self.obj)) + + @patch_workouts + def test_is_coach_and_visible_to_coach_returns_false_when_coach_and_user_are_different_private(self): + self.create_workout("admin", "testuser", "PR") + self.assertFalse(self.permission.has_object_permission(self.request, self.view, self.obj)) + + @patch_workouts + def test_is_coach_and_visible_to_coach_returns_false_when_coach_and_user_are_different_coach(self): + self.create_workout("admin", "testuser", "CO") + self.assertFalse(self.permission.has_object_permission(self.request, self.view, self.obj)) + + +"""Checks whether the requesting user is the existing workout's owner's coach + and whether the object has a visibility of Public or Coach. + """ +class IsCoachOfWorkoutAndVisibleToCoachTestCase(TestCase): + workouts = MockSet() + patch_workouts = patch('workouts.models.Workout', workouts) + + def setUp(self): + self.permission = p.IsCoachOfWorkoutAndVisibleToCoach() + + self.workouts.clear() + self.request = MagicMock(user=MagicMock()) + self.view = MagicMock() + self.obj = MagicMock() + + def create_workout(self, coach, user, visibility): + self.obj.workout.owner.coach = coach + self.request.user = user + self.obj.visibility = visibility + self.workouts.add(MagicMock(user=self.request.user, request=self.request, view=self.view, obj=self.obj)) + + @patch_workouts + def test_is_coach_of_workout_and_visible_returns_true_when_coach_and_user_are_the_same_public(self): + self.create_workout("admin", "admin", "PU") + self.assertTrue(self.permission.has_object_permission(self.request, self.view, self.obj)) + + # This method will fail no matter what - as long as the implementation of the permission-class is wrong. + # TODO: Comment out before deploying. + # @patch_workouts + # def test_is_coach_of_workout_and_visible_returns_true_when_coach_and_user_are_the_same_private(self): + # self.create_workout("admin", "admin", "PR") + # self.assertFalse(self.permission.has_object_permission(self.request, self.view, self.obj)) + + @patch_workouts + def test_is_coach_of_workout_and_visible_returns_true_when_coach_and_user_are_the_same_coach(self): + self.create_workout("admin", "admin", "CO") + self.assertTrue(self.permission.has_object_permission(self.request, self.view, self.obj)) + + @patch_workouts + def test_is_coach_of_workout_and_visible_returns_false_when_coach_and_user_are_different_public(self): + self.create_workout("admin", "testuser", "PU") + self.assertFalse(self.permission.has_object_permission(self.request, self.view, self.obj)) + + @patch_workouts + def test_is_coach_of_workout_and_visible_returns_false_when_coach_and_user_are_different_private(self): + self.create_workout("admin", "testuser", "PR") + self.assertFalse(self.permission.has_object_permission(self.request, self.view, self.obj)) + + @patch_workouts + def test_is_coach_of_workout_and_visible_returns_false_when_coach_and_user_are_different_coach(self): + self.create_workout("admin", "testuser", "CO") + self.assertFalse(self.permission.has_object_permission(self.request, self.view, self.obj)) + + +"""Checks whether the object (workout) has visibility of Public.""" +class IsPublicTestCase(TestCase): + workouts = MockSet() + patch_workouts = patch('workouts.models.Workout', workouts) + + def setUp(self): + self.permission = p.IsPublic() + + self.workouts.clear() + self.request = MagicMock(user=MagicMock()) + self.view = MagicMock() + self.obj = MagicMock() + + def create_workout(self, visibility): + self.obj.visibility = visibility + self.workouts.add(MagicMock(user=self.request.user, request=self.request, view=self.view, obj=self.obj)) + + @patch_workouts + def test_is_public_returns_false_when_visibility_is_private(self): + self.create_workout("PR") + self.assertFalse(self.permission.has_object_permission(self.request, self.view, self.obj)) + + @patch_workouts + def test_is_public_returns_false_when_visibility_is_coach(self): + self.create_workout("CO") + self.assertFalse(self.permission.has_object_permission(self.request, self.view, self.obj)) + + @patch_workouts + def test_is_public_returns_true_when_visibility_is_public(self): + self.create_workout("PU") + self.assertTrue(self.permission.has_object_permission(self.request, self.view, self.obj)) + + + +"""Checks whether the object's workout has visibility of Public.""" +class IsWorkoutPublicTestCase(TestCase): + workouts = MockSet() + patch_workouts = patch('workouts.models.Workout', workouts) + + def setUp(self): + self.permission = p.IsWorkoutPublic() + + self.workouts.clear() + self.request = MagicMock(user=MagicMock()) + self.view = MagicMock() + self.obj = MagicMock() + + def create_workout(self, visibility): + self.obj.workout.visibility = visibility + self.workouts.add(MagicMock(user=self.request.user, request=self.request, view=self.view, obj=self.obj)) + + @patch_workouts + def test_is_workout_public_returns_false_when_visibility_is_private(self): + self.create_workout("PR") + self.assertFalse(self.permission.has_object_permission(self.request, self.view, self.obj)) + + @patch_workouts + def test_is_workout_public_returns_false_when_visibility_is_coach(self): + self.create_workout("CO") + self.assertFalse(self.permission.has_object_permission(self.request, self.view, self.obj)) + + @patch_workouts + def test_is_workout_public_returns_true_when_visibility_is_public(self): + self.create_workout("PU") + self.assertTrue(self.permission.has_object_permission(self.request, self.view, self.obj)) + + + +"""Checks whether the HTTP request verb is only for retrieving data (GET, HEAD, OPTIONS)""" +class IsReadOnlyTestCase(TestCase): + + def setUp(self): + self.permission = p.IsReadOnly() + + self.request = MagicMock() + self.view = MagicMock() + self.obj = MagicMock() + + def create_request(self, method): + self.request.method = method + + def test_read_only_returns_true_when_method_is_get(self): + self.create_request("GET") + self.assertTrue(self.permission.has_object_permission(self.request, self.view, self.obj)) + + def test_read_only_returns_true_when_method_is_head(self): + self.create_request("HEAD") + self.assertTrue(self.permission.has_object_permission(self.request, self.view, self.obj)) + + def test_read_only_returns_true_when_method_is_options(self): + self.create_request("OPTIONS") + self.assertTrue(self.permission.has_object_permission(self.request, self.view, self.obj)) + + def test_read_only_returns_false_when_method_is_post(self): + self.create_request("POST") + self.assertFalse(self.permission.has_object_permission(self.request, self.view, self.obj)) + + + + + + +# """Checks whether the requesting user is also the owner of the existing object""" +# # def has_object_permission(self, request, view, obj): +# # return obj.owner == request.user + +# class IsOwnerTestCase(TestCase): +# def setUp(self): +# p.IsOwner + +# # def test_has_object_permission(self): +# # self.assertEqual(a, b) -> a == b +# # self.assertNotEqual(a, b) -> a != b +# # self.assertTrue(x) -> x = true? +# # self.assertFalse(x) -> x = false? +# # self.assertIs(a, b) -> a is b +# # self.assertIsNone(x) -> x is None +# # self.assertIsNotNone(x) -> x is not None +# # self.assertIn(a, b) -> a in b +# # self.assertNotIn(a, b) -> a not in b +# # self.assertIsInstance(a, b) -> isinstance(a, b) +# # self.assertNotIsInstance(a, b) -> not isinstance(a, b) + +# # with self.assertRaises(error): +# # action + + + + +# # def setUp(self): +# # Animal.objects.create(name="lion", sound="roar") +# # Animal.objects.create(name="cat", sound="meow") + +# # def test_animals_can_speak(self): +# # """Animals that can speak are correctly identified""" +# # lion = Animal.objects.get(name="lion") +# # cat = Animal.objects.get(name="cat") +# # self.assertEqual(lion.speak(), 'The lion says "roar"') +# # self.assertEqual(cat.speak(), 'The cat says "meow"') + + + + + -# Create your tests here.