diff --git a/backend/secfit/.gitlab-ci.yml b/backend/secfit/.gitlab-ci.yml index 9227d79ac7ae7221927c3335b825bdfa5894a03d..0b90145c6b6e5ccf462cdb422a70837669ed4dfa 100644 --- a/backend/secfit/.gitlab-ci.yml +++ b/backend/secfit/.gitlab-ci.yml @@ -22,6 +22,7 @@ test backend: - coverage run --omit 'venv/*' manage.py test - coverage report - coverage xml -o coverage.xml + - coverage run --omit 'venv/*' manage.py test integrationtests/ artifacts: reports: cobertura: backend/secfit/coverage.xml diff --git a/backend/secfit/integrationtests/testfilter.py b/backend/secfit/integrationtests/testfilter.py new file mode 100644 index 0000000000000000000000000000000000000000..11a46f441bcaeddcd031f25fb42c5749c148f278 --- /dev/null +++ b/backend/secfit/integrationtests/testfilter.py @@ -0,0 +1,49 @@ +from django.test import TestCase +from rest_framework.test import APIClient, force_authenticate +from users.models import User + +import util + + +class TestFiltering(TestCase): + def setUp(self): + self.client = APIClient() + + self.exercise_count = 15 + util.create_exercises(self.exercise_count) + + util.create_user('tyrion') + self.user = User.objects.get(username='tyrion') + util.create_workout(self.user) + + def test_get_exercise_types(self): + self.client.force_authenticate(user=self.user) + response = self.client.get('/api/exercises/') + + self.assertEqual(response.status_code, 200) + data = response.json() + + self.assertEqual(data['count'], self.exercise_count) + self.assertGreater(len(data['results']), 0) + + def test_exercise_types_pagination(self): + self.client.force_authenticate(user=self.user) + response = self.client.get('/api/exercises/') + + self.assertEqual(response.status_code, 200) + + data = response.json() + results_count = len(data['results']) + response = self.client.get(data['next']) + + self.assertEqual(response.status_code, 200) + + data = response.json() + results_count += len(data['results']) + + self.assertEqual(results_count, self.exercise_count) + + def test_get_workouts(self): + self.client.force_authenticate(user=self.user) + response = self.client.get('/api/workouts/') + self.assertEqual(response.status_code, 200) diff --git a/backend/secfit/integrationtests/testhighscore.py b/backend/secfit/integrationtests/testhighscore.py new file mode 100644 index 0000000000000000000000000000000000000000..9c897ab439fac052f618c25417d352c941d12ed8 --- /dev/null +++ b/backend/secfit/integrationtests/testhighscore.py @@ -0,0 +1,85 @@ +from django.test import TestCase +from rest_framework.test import APIClient, force_authenticate +from users.models import User + +import util + + +class TestHighScore(TestCase): + def setUp(self): + self.client = APIClient() + + self.exercise_count = 15 + util.create_exercises(self.exercise_count) + + util.create_user('tyrion') + self.user1 = User.objects.get(username='tyrion') + self.user1_workout_instances = 5 + for _ in range(self.user1_workout_instances): + util.create_workout(self.user1) + + util.create_user('jamie') + self.user2 = User.objects.get(username='jamie') + self.user2_workout_instances = 2 + for _ in range(self.user2_workout_instances): + util.create_workout(self.user2) + + util.create_user('arya') + self.user3 = User.objects.get(username='arya') + self.user3_workout_instances = 3 + for _ in range(self.user3_workout_instances): + util.create_workout(self.user3) + + def test_get_highscores(self): + self.client.force_authenticate(user=self.user1) + response = self.client.get('/api/highscores/') + self.assertEqual(response.status_code, 200) + + data = response.json() + highscores = len(data['results']) + self.assertEqual(highscores, 3) + + def test_get_highscore_for_non_existing_exercise(self): + self.client.force_authenticate(user=self.user1) + response = self.client.get('/api/highscores/?exercise=2') + self.assertEqual(response.status_code, 200) + + data = response.json() + results = len(data['results']) + self.assertEqual(results, 0) + + def test_get_highscore_for_exercise(self): + self.client.force_authenticate(user=self.user1) + response = self.client.get('/api/highscores/?exercise=1') + self.assertEqual(response.status_code, 200) + + data = response.json() + results = data['results'] + + for res in results: + if res['username'] == 'tyrion': + self.assertEqual(res['score'], self.user1_workout_instances) + elif res['username'] == 'jamie': + self.assertEqual(res['score'], self.user2_workout_instances) + elif res['username'] == 'arya': + self.assertEqual(res['score'], self.user3_workout_instances) + else: + self.assertFalse( + True, + "User requested does not exist. Add users to test dataset" + ) + + def test_highscore_ranking(self): + self.client.force_authenticate(user=self.user1) + response = self.client.get('/api/highscores/?exercise=1') + self.assertEqual(response.status_code, 200) + + data = response.json() + results = data['results'] + firstplace = results[0]['username'] + secondplace = results[1]['username'] + thirdplace = results[2]['username'] + + self.assertEqual(firstplace, 'tyrion') + self.assertEqual(secondplace, 'arya') + self.assertEqual(thirdplace, 'jamie') diff --git a/backend/secfit/integrationtests/testprofile.py b/backend/secfit/integrationtests/testprofile.py new file mode 100644 index 0000000000000000000000000000000000000000..96345814295a9d2504d6738aa2a3d4a2fcd33861 --- /dev/null +++ b/backend/secfit/integrationtests/testprofile.py @@ -0,0 +1,34 @@ +from django.test import TestCase +from rest_framework.test import APIClient, force_authenticate +from users.models import User + +import util + + +class TestProfile(TestCase): + def setUp(self): + self.client = APIClient() + + util.create_user('tyrion') + util.create_user('arya') + self.user = User.objects.get(username='arya') + + def test_get_user_data_not_authenticated(self): + response = self.client.get('/api/users/?user=current') + self.assertEqual(response.status_code, 200) + + data = response.json() + self.assertEqual(data['count'], 0) + + def test_get_user_data(self): + self.client.force_authenticate(user=self.user) + response = self.client.get('/api/users/?user=current') + self.assertEqual(response.status_code, 200) + + data = response.json() + results = data['results'] + self.assertEqual(len(results), 1) + + user_data = results[0] + self.assertEqual(user_data['username'], 'arya') + self.assertEqual(user_data['email'], 'arya@lannister.com') diff --git a/backend/secfit/integrationtests/util.py b/backend/secfit/integrationtests/util.py new file mode 100644 index 0000000000000000000000000000000000000000..b689e016f4fe3f3a28b2e93246f3e6caef27fb03 --- /dev/null +++ b/backend/secfit/integrationtests/util.py @@ -0,0 +1,91 @@ +from django.utils import timezone +from users.serializers import UserSerializer +from workouts.serializers import ExerciseSerializer, WorkoutSerializer +from workouts.models import Exercise + +from django.test import TestCase +from rest_framework.test import APIClient, force_authenticate +from users.models import User + +def create_user_data(**kwargs): + data = { + "username": "", + "email": "", + "password": "", + "password1": "", + "phone_number": "", + "country": "", + "city": "", + "street_address": "", + } + for key, val in kwargs.items(): + if key in data: + data[key] = val + return data + + +def create_exercise_data(**kwargs): + data = { + "name": "", + "description": "", + "unit": "", + } + for key, val in kwargs.items(): + if key in data: + data[key] = val + return data + + +def create_workout_data(**kwargs): + data = { + "owner": "", + "name": "", + "date": timezone.now(), + "notes": "", + "visibility": "", + "exercise_instances": "" + } + for key, val in kwargs.items(): + if key in data: + data[key] = val + return data + + +def create_user(username): + user_serializer = UserSerializer() + valid_data = create_user_data( + username=username, + email=f"{username}@lannister.com", + password="iDrInKaNdIkNoWtHiNgS", + password1="iDrInKaNdIkNoWtHiNgS", + ) + user_serializer.create(valid_data) + + +def create_exercises(amount): + # create >10 exercise types for pagination testing + exerciseSerializer = ExerciseSerializer() + for i in range(amount): + valid_data = create_exercise_data( + name="Squats" + str(i), + description="Bend knees" + str(i), + unit="kg" + ) + exerciseSerializer.create(valid_data) + + +def create_workout(user): + workoutSerializer = WorkoutSerializer() + test = Exercise.objects.get(id="1") + valid_data = create_workout_data( + owner=user, + name="Super big hard workout", + notes="It was easy", + visibility="PU", + exercise_instances=[{ + "exercise": test, + "sets": 123, + "number": 123 + }] + ) + workoutSerializer.create(valid_data)