diff --git a/core/tests/data_factories.py b/core/tests/data_factories.py deleted file mode 100644 index 438b9955bbac5bf243ae7bf5c4715084f084cb7a..0000000000000000000000000000000000000000 --- a/core/tests/data_factories.py +++ /dev/null @@ -1,252 +0,0 @@ -""" A set of factory methods that make testing easier. Each method creates all -reuired subfields if not provided by via kwargs. """ - -from core.models import (ExamType, Feedback, Reviewer, Student, Submission, - SubmissionType, Tutor, UserAccount) - -# These methods are meant to be used to provide data to insert into the test -# database - - -def make_test_data(**kwargs): - if 'exam'in kwargs: - ExamType.objects.get_or_create(module_reference=kwargs['exam']['module_reference'], - defaults={ - 'total_score': kwargs['exam'].get('total_score', 100), - 'pass_score': kwargs['exam'].get('pass_score', 50), - }) - if 'submission_types' in kwargs: - for submission_type in kwargs['submission_types']: - SubmissionType.objects.get_or_create(name=submission_type['name'], defaults=submission_type) - if 'users' in kwargs: - for user in kwargs['users']: - (user_object, _) = UserAccount.objects.get_or_create(username=user['username'], defaults=user) - user_object.set_password(user.get('password', 'p')) - user_object.save() - if 'students' in kwargs: - for student in kwargs['students']: - Student.objects.get_or_create( - user=UserAccount.objects.get_or_create(username=student['user'])[0], - defaults={ - 'exam': ExamType.objects.get(module_reference=student['exam']) - } - ) - if 'tutors' in kwargs: - for tutor in kwargs['tutors']: - Tutor.objects.get_or_create(user=UserAccount.objects.get_or_create(username=tutor['user'])[0]) - if 'reviewers' in kwargs: - for reviewer in kwargs['reviewers']: - Reviewer.objects.get_or_create( - user=UserAccount.objects.get_or_create(username=reviewer['user'])[0]) - if 'submissions' in kwargs: - for submission in kwargs['submissions']: - submission_type, _ = SubmissionType.objects.get_or_create( - name=submission.get('type', 'Auto generated type')) - student, _ = Student.objects.get_or_create(user=UserAccount.objects.get( - username=submission.get('user', 'default_user') - )) - submission_object, _ = Submission.objects.get_or_create( - type=submission_type, student=student, defaults={ - 'seen_by_student': submission.get('seen_by_student', False), - 'text': submission.get('text', ''), - }) - if 'feedback' in submission: - feedback = submission['feedback'] - text = feedback.get('text', 'Verrrryyy bad!') - score = feedback.get('score', 0) - tutor = UserAccount.objects.get(username=feedback['of_tutor']).get_associated_user() - Feedback.objects.get_or_create(of_submission=submission_object, defaults={ - 'text': text, - 'score': score, - 'of_tutor': tutor, - }) - if 'feedback' in kwargs: - for feedback in kwargs['feedback']: - text = feedback.get('text', 'Verrrryyy bad!') - score = feedback.get('score', 0) - submission = UserAccount.objects.get(username=feedback['student']).submissions.get( - type=SubmissionType.objects.get(feedback['submission_type']) - ) - tutor = UserAccount.objects.get(username=feedback['of_tutor']).get_associated_user() - Feedback.objects.get_or_create(of_submission=submission, defaults={ - 'text': text, - 'score': score, - 'of_tutor': tutor, - }) - - -def init_test_instance(): - make_test_data( - exam={ - 'module_reference': 'Test Exam 01', - 'total_score': 100, - 'pass_score': 60, - }, - submission_types=[ - { - 'name': '01. Sort this or that', - 'full_score': 35, - 'description': 'Very complicated', - 'solution': 'Trivial!' - }, - { - 'name': '02. Merge this or that or maybe even this', - 'full_score': 35, - 'description': 'Very complicated', - 'solution': 'Trivial!' - }, - { - 'name': '03. This one exists for the sole purpose to test', - 'full_score': 30, - 'description': 'Very complicated', - 'solution': 'Trivial!' - } - ], - users=[ - { - 'username': 'student01', - 'password': 'p', - 'fullname': 'Normal Student' - }, - { - 'username': 'tutor01' - }, - { - 'username': 'reviewer01' - } - ], - students=[{ - 'user': 'student01', - 'exam': 'Test Exam 01', - }], - tutors=[{ - 'user': 'tutor01' - }], - reviewers=[{ - 'user': 'reviewer01' - }], - submissions=[ - { - 'text': 'function blabl\n' - ' on multi lines\n' - ' for blabla in bla:\n' - ' arrrgh\n' - ' asasxasx\n' - ' lorem ipsum und so\n', - 'type': '01. Sort this or that', - 'user': 'student01', - 'feedback': { - 'text': 'Not good!', - 'score': 5, - 'of_tutor': 'tutor01', - } - }, - { - 'text': 'function blabl\n' - ' on multi lines\n' - ' for blabla in bla:\n' - ' arrrgh\n' - ' asasxasx\n' - ' lorem ipsum und so\n', - 'type': '02. Merge this or that or maybe even this', - 'user': 'student01', - 'feedback': { - 'text': 'A little bit better!', - 'score': 10, - 'of_tutor': 'tutor01', - }, - }, - { - 'text': 'function blabl\n' - ' on multi lines\n' - ' for blabla in bla:\n' - ' arrrgh\n' - ' asasxasx\n' - ' lorem ipsum und so\n', - 'type': '03. This one exists for the sole purpose to test', - 'user': 'student01', - 'feedback': { - 'text': 'Awesome!', - 'score': 30, - 'of_tutor': 'tutor01', - }, - }, - ], - ) - - -def make_user(username='user01', - password='p', - fullname='us er01', - is_admin=False): - user = UserAccount.objects.create(username=username, - fullname=fullname, - is_admin=is_admin) - user.set_password(password) - user.save() - return user - - -def make_exam(module_reference='TestExam B.Inf.0042', - total_score=42, - pass_score=21, - **kwargs): - return ExamType.objects.create(module_reference=module_reference, - total_score=total_score, - pass_score=pass_score, **kwargs) - - -def make_submission_type(name='problem01', - full_score=10, - description='Very hard', - solution='Impossible!'): - return SubmissionType.objects.create(name=name, - full_score=full_score, - description=description, - solution=solution) - - -def make_student(user=None, exam=None): - if user is None: - user = make_user() - if exam is None: - exam = make_exam() - return Student.objects.create(user=user, exam=exam) - - -def make_tutor(user=None): - if user is None: - user = make_user() - return Tutor.objects.create(user=user) - - -def make_reviewer(user=None): - if user is None: - user = make_user() - return Reviewer.objects.create(user=user) - - -def make_submission(type=None, student=None, text='Too hard for me ;-('): - if type is None: - type = make_submission_type() - if student is None: - student = make_student() - return Submission.objects.create(text=text, type=type, student=student) - - -def make_feedback(of_tutor, of_submission=None, text='Very bad!', score=3): - if of_submission is None: - of_submission = make_submission() - return Feedback.objects.create(of_tutor=of_tutor, - of_submission=of_submission, - text=text, - score=score) - - -def make_minimal_exam(): - # also creates default examType, submissionType and student - submission = make_submission() - - tutor = make_tutor(user=make_user(username='tutor01')) - feedback = make_feedback(of_tutor=tutor, of_submission=submission) - return submission, tutor, feedback diff --git a/core/tests/test_student_page.py b/core/tests/test_student_page.py index 930163ad8c94ebb906210976e06f6de8253c3b14..698bd3b5c8a516d545dfa7570c9967cf9c408ff8 100644 --- a/core/tests/test_student_page.py +++ b/core/tests/test_student_page.py @@ -2,9 +2,9 @@ from django.urls import reverse from rest_framework.test import (APIRequestFactory, APITestCase, force_authenticate) -from core.models import Reviewer, SubmissionType -from core.tests import data_factories +from core.models import SubmissionType from core.views import StudentSelfApiViewSet +from util.factories import make_test_data class StudentPageTests(APITestCase): @@ -14,11 +14,47 @@ class StudentPageTests(APITestCase): cls.factory = APIRequestFactory() def setUp(self): - self.submission, self.tutor, self.feedback = \ - data_factories.make_minimal_exam() - self.student = self.submission.student - self.reviewer = Reviewer.objects.create( - user=data_factories.make_user(username='reviewer')) + self.test_data = make_test_data(data_dict={ + 'exams': [{ + 'module_reference': 'TestExam B.Inf.0042', + 'total_score': 42, + 'pass_score': 21 + }], + 'submission_types': [{ + 'name': 'problem01', + 'full_score': 10, + 'description': 'Very hard', + 'solution': 'Impossible!' + }], + 'students': [{ + 'username': 'user01', + 'fullname': 'us er01', + 'exam': 'TestExam B.Inf.0042' + }], + 'tutors': [{ + 'username': 'tutor01' + }], + 'reviewers': [{ + 'username': 'reviewer' + }], + 'submissions': [{ + 'user': 'user01', + 'type': 'problem01', + 'text': 'Too hard for me ;-(', + 'feedback': { + 'of_tutor': 'tutor01', + 'text': 'Very bad!', + 'score': 3 + } + }] + }) + + self.student = self.test_data['students'][0] + self.tutor = self.test_data['tutors'][0] + self.reviewer = self.test_data['reviewers'][0] + self.submission = self.test_data['submissions'][0] + self.feedback = self.submission.feedback + self.request = self.factory.get(reverse('student_page-list')) self.view = StudentSelfApiViewSet.as_view({'get': 'retrieve'}) diff --git a/core/tests/test_student_reviewer_viewset.py b/core/tests/test_student_reviewer_viewset.py index cf30b662f022b649f6b33b302e737c9b5ea9cab3..d486641ce9bcb6a9e936988ca2b4a5bd5d10e4fd 100644 --- a/core/tests/test_student_reviewer_viewset.py +++ b/core/tests/test_student_reviewer_viewset.py @@ -3,9 +3,8 @@ from rest_framework import status from rest_framework.test import (APIRequestFactory, APITestCase, force_authenticate) -from core.tests import data_factories from core.views import StudentReviewerApiViewSet -from util.factories import GradyUserFactory +from util.factories import make_test_data class StudentPageTests(APITestCase): @@ -13,12 +12,46 @@ class StudentPageTests(APITestCase): @classmethod def setUpTestData(cls): cls.factory = APIRequestFactory() - cls.user_factory = GradyUserFactory() def setUp(self): - self.submission, _, _ = data_factories.make_minimal_exam() - self.student = self.submission.student - self.reviewer = self.user_factory.make_reviewer(username='reviewer') + self.test_data = make_test_data(data_dict={ + 'exams': [{ + 'module_reference': 'TestExam B.Inf.0042', + 'total_score': 42, + 'pass_score': 21 + }], + 'submission_types': [{ + 'name': 'problem01', + 'full_score': 10, + 'description': 'Very hard', + 'solution': 'Impossible!' + }], + 'students': [{ + 'username': 'user01', + 'fullname': 'us er01', + 'exam': 'TestExam B.Inf.0042' + }], + 'tutors': [{ + 'username': 'tutor' + }], + 'reviewers': [{ + 'username': 'reviewer' + }], + 'submissions': [{ + 'user': 'user01', + 'type': 'problem01', + 'text': 'Too hard for me ;-(', + 'feedback': { + 'score': 3, + 'of_tutor': 'tutor' + } + }] + }) + + self.student = self.test_data['students'][0] + self.reviewer = self.test_data['reviewers'][0] + self.submission = self.test_data['submissions'][0] + self.request = self.factory.get(reverse('student-list')) self.view = StudentReviewerApiViewSet.as_view({'get': 'list'}) diff --git a/util/factories.py b/util/factories.py index 969f60f97053e6614c7e72a42fd4fbf810953783..5b6f71575d7b426e5b8dc95048ffccb84034b3bb 100644 --- a/util/factories.py +++ b/util/factories.py @@ -139,7 +139,7 @@ def make_tutors(tutors=[], **kwargs): def make_reviewers(reviewers=[], **kwargs): - return [GradyUserFactory().make_tutor(**reviewer) + return [GradyUserFactory().make_reviewer(**reviewer) for reviewer in reviewers] @@ -150,7 +150,7 @@ def make_feedback(feedback, submission_object): of_submission=submission_object, of_tutor=tutor, defaults={ - 'text': feedback['text'], + 'text': feedback.get('text', ''), 'score': feedback['score'] })[0] @@ -269,5 +269,5 @@ def init_test_instance(): 'of_tutor': 'tutor01', }, }, - ],} + ]} )