diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 91ffa35a2871b4772851059ad5e164eb2217cfca..cb7ba2b243dbdac8d2b59b900ac0af564c13fc2b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -17,6 +17,7 @@ test: - cd backend/secfit - apt-get update -qy - pip install -r requirements.txt + - python manage.py test staging: type: deploy diff --git a/Pipfile.lock b/Pipfile.lock index ce1a8dbf317bdd828273972a1e853b61330561d9..7471815da26fc8fff17660fb56692db39e5e2ce0 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -306,11 +306,11 @@ }, "setuptools": { "hashes": [ - "sha256:2347b2b432c891a863acadca2da9ac101eae6169b1d3dfee2ec605ecd50dbfe5", - "sha256:e4f30b9f84e5ab3decf945113119649fec09c1fc3507c6ebffec75646c56e62b" + "sha256:6599055eeb23bfef457d5605d33a4d68804266e6cb430b0fb12417c5efeae36c", + "sha256:782ef48d58982ddb49920c11a0c5c9c0b02e7d7d1c2ad0aa44e1a1e133051c96" ], "markers": "python_version >= '3.7'", - "version": "==60.9.3" + "version": "==60.10.0" }, "six": { "hashes": [ diff --git a/backend/secfit/.coverage b/backend/secfit/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..98e28c0321ea312213e1793edf9926ae72e527d4 Binary files /dev/null and b/backend/secfit/.coverage differ diff --git a/backend/secfit/users/tests.py b/backend/secfit/users/tests.py index 7ce503c2dd97ba78597f6ff6e4393132753573f6..dfc780c8caca6f7b78d3d6a4fd349e5f7f2faf65 100644 --- a/backend/secfit/users/tests.py +++ b/backend/secfit/users/tests.py @@ -1,3 +1,40 @@ from django.test import TestCase +from rest_framework.test import APIRequestFactory +from rest_framework.request import Request + +from users.models import User +from users.serializers import UserSerializer # Create your tests here. + +class UserSerializerTests(TestCase): + + def setUp(self): + + # Mock the user url field + request_factory = APIRequestFactory() + request = request_factory.post("/") + serializer_context = { + "request": Request(request) + } + + # Data to mock a user + self.user_attributes = { + "username": "random", + "email": "admin@admin.com", + "password": "123", + "phone_number": "12345678", + "country": "norway", + "city": "trondheim", + "street_address": "road 1A" + } + + # Making the user object and serializer available for the test class + self.user = User.objects.create(**self.user_attributes) + self.serializer = UserSerializer(context=serializer_context) + + def test_user_serialization(self): + attr = self.user_attributes + attr["username"] = "mock" + user_object = self.serializer.create(self.user_attributes) + self.assertEqual(user_object.username, "mock") diff --git a/backend/secfit/workouts/tests.py b/backend/secfit/workouts/tests.py index 7fbbf7847f5b0f201d408d4017cc865d614e2615..54550b0217ff4b0afb8667563aa84c52d32ad6ae 100644 --- a/backend/secfit/workouts/tests.py +++ b/backend/secfit/workouts/tests.py @@ -1,6 +1,116 @@ """ Tests for the workouts application. """ -from django.test import TestCase +from django.test import TestCase, RequestFactory +from workouts.permissions import IsOwner, IsOwnerOfWorkout, IsCoachAndVisibleToCoach, IsCoachOfWorkoutAndVisibleToCoach, IsPublic, IsWorkoutPublic, IsReadOnly +from users.models import User +from workouts.models import Workout, Exercise, ExerciseInstance -# Create your tests here. +class TestIsOwner(TestCase): + + def setUp(self): + self.user = User.objects.create(username="mock") + self.request_factory = RequestFactory() + + def test_has_object_permission(self): + req = self.request_factory.get("/") + req.user = self.user + workout = Workout.objects.create(name="mocked_workout", date="2022-03-15T16:59:00Z", notes="", owner=self.user, visibility="PU") + self.assertTrue(IsOwner().has_object_permission(req, None, workout)) + +class TestIsOwnerOfWorkout(TestCase): + + def setUp(self): + self.request_factory = RequestFactory() + self.user = User.objects.create(username="mock") + + def test_has_permission(self): + request = self.request_factory.post("/") + request.user = self.user + request.data = {"workout": "/api/workouts/1/"} + Workout.objects.create(name="mocked_workout", date="2022-03-15T16:59:00Z", notes="", owner=self.user, visibility="PU") + self.assertTrue(IsOwnerOfWorkout().has_permission(request, None)) + + def test_no_workout_has_permissions(self): + request = self.request_factory.post("/") + request.user = self.user + request.data = {} + self.assertFalse(IsOwnerOfWorkout().has_permission(request, None)) + + def test_not_post_has_permissions(self): + request = self.request_factory.get("/") + self.assertTrue(IsOwnerOfWorkout().has_permission(request, None)) + + def test_has_object_permissions(self): + request = self.request_factory.get("/") + request.user = self.user + workout = Workout.objects.create(name="mocked_workout", date="2022-03-15T16:59:00Z", notes="", owner=self.user, visibility="PU") + exercise = Exercise.objects.create(name="mocked_exercise", description="", unit="Times", owner=self.user) + exercise_instance = ExerciseInstance.objects.create(workout=workout, exercise=exercise, sets=3, number=12) + + self.assertTrue(IsOwnerOfWorkout().has_object_permission(request, None, exercise_instance)) + +class TestIsCoachAndVisibleToCoach(TestCase): + + def test_has_object_permissions(self): + coach = User.objects.create(username="mocked_coach") + object_owner = User.objects.create(username="mocked_user") + object_owner.coach = coach + + request = RequestFactory().get("/") + request.user = coach + + workout = Workout.objects.create(name="mocked_workout", date="2022-03-15T16:59:00Z", notes="", owner=object_owner, visibility="CO") + self.assertTrue(IsCoachAndVisibleToCoach().has_object_permission(request, None, workout)) + +class TestIsCoachOfWorkoutAndVisibleToCoach(TestCase): + + def test_has_object_permissions(self): + coach = User.objects.create(username="mocked_coach") + object_owner = User.objects.create(username="mocked_user") + object_owner.coach = coach + + request = RequestFactory().get("/") + request.user = coach + + workout = Workout.objects.create(name="mocked_workout", date="2022-03-15T16:59:00Z", notes="", owner=object_owner, visibility="CO") + exercise = Exercise.objects.create(name="mocked_exercise", description="", unit="Times", owner=object_owner) + exercise_instance = ExerciseInstance.objects.create(workout=workout, exercise=exercise, sets=3, number=12) + self.assertTrue(IsCoachOfWorkoutAndVisibleToCoach().has_object_permission(request, None, exercise_instance)) + +class TestIsPublic(TestCase): + + def test_has_object_permissions(self): + owner = User.objects.create(username="mocked_user") + request = RequestFactory().get("/") + request.user = owner + + workout = Workout.objects.create(name="mocked_workout", date="2022-03-15T16:59:00Z", notes="", owner=owner, visibility="PU") + self.assertTrue(IsPublic().has_object_permission(request, None, workout)) + +class TestIsWorkoutPublic(TestCase): + + def test_has_object_permissions(self): + owner = User.objects.create(username="mocked_user") + request = RequestFactory().get("/") + request.user = owner + + workout = Workout.objects.create(name="mocked_workout", date="2022-03-15T16:59:00Z", notes="", owner=owner, visibility="PU") + exercise = Exercise.objects.create(name="mocked_exercise", description="", unit="Times", owner=owner) + exercise_instance = ExerciseInstance.objects.create(workout=workout, exercise=exercise, sets=3, number=12) + self.assertTrue(IsWorkoutPublic().has_object_permission(request, None, exercise_instance)) + +class TestIsReadOnly(TestCase): + + def test_has_object_permissions(self): + user = User.objects.create(username="mocked_user") + get_request = RequestFactory().get("/") + get_request.user = user + head_request = RequestFactory().head("/") + head_request.user = user + options_request = RequestFactory().options("/") + options_request.user = user + + self.assertTrue(IsReadOnly().has_object_permission(get_request, None, None)) + self.assertTrue(IsReadOnly().has_object_permission(head_request, None, None)) + self.assertTrue(IsReadOnly().has_object_permission(options_request, None, None)) \ No newline at end of file