261 lines
8.5 KiB
Python
261 lines
8.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
|
|
from core.tests.base_test import SkillboxTestCase
|
|
from users.factories import SchoolClassFactory
|
|
from users.models import SchoolClassMember
|
|
from .queries.mutations import UPDATE_SUBMISSION_FEEDBACK_MUTATION
|
|
from ..factories import (
|
|
AssignmentFactory,
|
|
StudentSubmissionFactory,
|
|
SubmissionFeedbackFactory,
|
|
)
|
|
|
|
|
|
class SubmissionFeedbackTestCase(SkillboxTestCase):
|
|
def setUp(self):
|
|
self.createDefault()
|
|
|
|
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()
|
|
for user in [self.student1, self.teacher]:
|
|
SchoolClassMember.objects.create(user=user, school_class=school_class)
|
|
user.set_selected_class(school_class)
|
|
|
|
def _create_submission_feedback(self, user, final, text, student_submission_id):
|
|
return self.get_client(user).execute(
|
|
UPDATE_SUBMISSION_FEEDBACK_MUTATION,
|
|
variables={
|
|
"input": {
|
|
"submissionFeedback": {
|
|
"studentSubmission": student_submission_id,
|
|
"text": text,
|
|
"final": final,
|
|
}
|
|
}
|
|
},
|
|
)
|
|
|
|
def _fetch_assignment_student(self, user):
|
|
client = self.get_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 = self.get_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_teacher(self, user):
|
|
client = self.get_client(user)
|
|
query = """
|
|
query StudentSubmission($id: ID!) {
|
|
studentSubmission(id: $id) {
|
|
id
|
|
text
|
|
document
|
|
submissionFeedback {
|
|
text
|
|
}
|
|
}
|
|
}
|
|
"""
|
|
return client.execute(query, variables={"id": self.student_submission_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.errors)
|
|
self.assertIsNotNone(
|
|
result.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.errors)
|
|
self.assertEqual(len(result.errors), 1)
|
|
self.assertEqual(result.errors[0].get("message"), "Missing permissions")
|
|
|
|
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.errors)
|
|
|
|
submission_feedback_response = result.data.get("updateSubmissionFeedback").get(
|
|
"updatedSubmissionFeedback"
|
|
)
|
|
|
|
self.assertTrue(submission_feedback_response.get("final"))
|
|
self.assertEqual(submission_feedback_response.get("text"), "Some")
|
|
|
|
def test_external_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.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.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.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.data.get("assignment")
|
|
.get("submissions")[0]
|
|
.get("submissionFeedback")
|
|
.get("text"),
|
|
submission_feedback.text,
|
|
)
|
|
|
|
def test_external_teacher_cannot_see_assignment_with_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.assertEqual(result.data.get("assignment").get("submissions"), [])
|
|
|
|
def test_external_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_submission_teacher(self.teacher2)
|
|
self.assertIsNone(result.errors)
|
|
self.assertIsNone(result.data.get("studentSubmission"))
|