Skip to content
Snippets Groups Projects
Commit 4c6cd644 authored by robinwilliam.hundt's avatar robinwilliam.hundt
Browse files

Fixed bugs in make_test_data / deleted tests.data_factories

All the methods in core.tests.data_factories have been deleted and the tests using those are now using the improved make_test_data method from util.factories.
Curiously the tests are running considerably faster on my machine now
parent ca48aff3
No related branches found
No related tags found
1 merge request!24Added convenience method to create test data
Pipeline #
""" 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
......@@ -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'})
......
......@@ -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'})
......
......@@ -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',
},
},
],}
]}
)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment