skillbox/server/assignments/tests/test_feedback.py

204 lines
7.5 KiB
Python

# -*- coding: utf-8 -*-
#
# ITerativ GmbH
# http://www.iterativ.ch/
#
# Copyright (c) 2019 ITerativ GmbH. All rights reserved.
#
# Created on 2019-11-13
# @author: chrigu <christian.cueni@iterativ.ch>
from graphql_relay import to_global_id
from api.test_utils import create_client, DefaultUserTestCase
from assignments.models import Assignment, StudentSubmission
from users.factories import SchoolClassFactory
from ..factories import AssignmentFactory, StudentSubmissionFactory, SubmissionFeedbackFactory
class SubmissionFeedbackTestCase(DefaultUserTestCase):
def setUp(self):
super(SubmissionFeedbackTestCase, self).setUp()
self.assignment = AssignmentFactory(
owner=self.teacher
)
self.assignment_id = to_global_id('AssignmentNode', self.assignment.pk)
self.student_submission = StudentSubmissionFactory(assignment=self.assignment, student=self.student1, final=False)
self.student_submission_id = to_global_id('StudentSubmissionNode', self.student_submission.pk)
school_class = SchoolClassFactory()
school_class.users.add(self.student1)
school_class.users.add(self.teacher)
school_class.users.add(self.teacher2)
def _create_submission_feedback(self, user, final, text, student_submission_id):
mutation = '''
mutation UpdateSubmissionFeedback($input: UpdateSubmissionFeedbackInput!) {
updateSubmissionFeedback(input: $input){
updatedSubmissionFeedback {
id
text
final
}
}
}
'''
client = create_client(user)
return client.execute(mutation, variables={
'input': {
"submissionFeedback": {
"studentSubmission": student_submission_id,
"text": text,
"final": final
}
}
})
def _fetch_assignment_student(self, user):
client = create_client(user)
query = '''
query AssignmentWithSubmissions($id: ID!) {
assignment(id: $id) {
title
submission {
id
text
document
submissionfeedback {
text
}
}
}
}
'''
return client.execute(query, variables={
'id': self.assignment_id
})
def _fetch_assignment_teacher(self, user):
client = create_client(user)
query = '''
query AssignmentWithSubmissions($id: ID!) {
assignment(id: $id) {
title
submissions {
id
text
document
submissionfeedback {
text
}
}
}
}
'''
return client.execute(query, variables={
'id': self.assignment_id
})
def _fetch_submission_feedback(self, user):
client = create_client(user)
query = '''
query AssignmentWithSubmissions($id: ID!) {
assignment(id: $id) {
title
submissions {
id
text
document
submissionfeedback {
text
}
}
}
}
'''
return client.execute(query, variables={
'id': self.assignment_id
})
def test_teacher_can_create_feedback(self):
result = self._create_submission_feedback(self.teacher, False, 'Balalal', self.student_submission_id)
self.assertIsNone(result.get('errors'))
self.assertIsNotNone(result.get('data').get('updateSubmissionFeedback').get('updatedSubmissionFeedback').get('id'))
def test_student_cannot_create_feedback(self):
result = self._create_submission_feedback(self.student1, False, 'Balalal', self.student_submission_id)
self.assertIsNotNone(result.get('errors'))
def test_teacher_can_update_feedback(self):
assignment = AssignmentFactory(
owner=self.teacher
)
student_submission = StudentSubmissionFactory(assignment=assignment, student=self.student1, final=False)
submission_feedback = SubmissionFeedbackFactory(teacher=self.teacher, final=False,
student_submission=student_submission)
submission_feedback_id = to_global_id('SubmissionFeedback', submission_feedback.pk)
result = self._create_submission_feedback(self.teacher, True, 'Some', submission_feedback_id)
self.assertIsNone(result.get('errors'))
submission_feedback_response = result.get('data').get('updateSubmissionFeedback').get('updatedSubmissionFeedback')
self.assertTrue(submission_feedback_response.get('final'))
self.assertEqual(submission_feedback_response.get('text'), 'Some')
def test_rogue_teacher_cannot_update_feedback(self):
assignment = AssignmentFactory(
owner=self.teacher
)
student_submission = StudentSubmissionFactory(assignment=assignment, student=self.student1, final=False)
submission_feedback = SubmissionFeedbackFactory(teacher=self.teacher, final=False,
student_submission=student_submission)
submission_feedback_id = to_global_id('SubmissionFeedback', submission_feedback.pk)
result = self._create_submission_feedback(self.teacher2, True, 'Some', submission_feedback_id)
self.assertIsNotNone(result.get('errors'))
def test_student_does_not_see_non_final_feedback(self):
SubmissionFeedbackFactory(teacher=self.teacher, final=False, student_submission=self.student_submission)
result = self._fetch_assignment_student(self.student1)
self.assertIsNone(result.get('data').get('submissionfeedback'))
def test_student_does_see_final_feedback(self):
submission_feedback = SubmissionFeedbackFactory(teacher=self.teacher, final=True,
student_submission=self.student_submission)
result = self._fetch_assignment_student(self.student1)
self.assertEqual(result.get('data').get('assignment').get('submission').get('submissionfeedback')
.get('text'), submission_feedback.text)
def test_teacher_can_see_feedback_for_submission(self):
submission_feedback = SubmissionFeedbackFactory(teacher=self.teacher, final=False,
student_submission=self.student_submission)
self.student_submission.final = True
self.student_submission.save()
result = self._fetch_assignment_teacher(self.teacher)
self.assertEqual(result.get('data').get('assignment').get('submissions')[0].get('submissionfeedback')
.get('text'), submission_feedback.text)
def test_rogue_teacher_cannot_see_feedback(self):
SubmissionFeedbackFactory(teacher=self.teacher, final=False,
student_submission=self.student_submission)
self.student_submission.final = True
self.student_submission.save()
result = self._fetch_assignment_teacher(self.teacher2)
self.assertIsNone(result.get('data').get('assignment').get('submissions')[0].get('submissionfeedback'))