vbv/server/vbv_lernwelt/feedback/tests/test_feedback_api.py

165 lines
6.4 KiB
Python

from rest_framework.test import APITestCase
from vbv_lernwelt.core.create_default_users import create_default_users
from vbv_lernwelt.core.models import User
from vbv_lernwelt.course.creators.test_course import create_test_course
from vbv_lernwelt.course.models import CourseSession
from vbv_lernwelt.feedback.factories import FeedbackResponseFactory
from vbv_lernwelt.feedback.models import FeedbackResponse
from vbv_lernwelt.learnpath.models import Circle
from vbv_lernwelt.notify.models import (
Notification,
NotificationCategory,
NotificationTrigger,
)
class FeedbackBaseTestCase(APITestCase):
def setUp(self) -> None:
create_default_users()
create_test_course(include_vv=False, with_sessions=True)
self.course_session = CourseSession.objects.get(title="Test Bern 2022 a")
self.trainer = User.objects.get(username="test-trainer1@example.com")
self.student = User.objects.get(username="test-student1@example.com")
self.circle_basis = Circle.objects.get(slug="test-lehrgang-lp-circle-fahrzeug")
class FeedbackNotificationTestCase(FeedbackBaseTestCase):
def test_creating_submitted_feedback_triggers_notification(self):
feedback = FeedbackResponse.objects.create(
circle=self.circle_basis,
course_session=self.course_session,
feedback_user=self.student,
submitted=True,
)
self.assertEqual(Notification.objects.count(), 1)
notification = Notification.objects.first()
self.assertEqual(notification.recipient, self.trainer)
self.assertEqual(
notification.verb,
f"Feedback abgeschickt für Circle «{self.circle_basis.title}»",
)
self.assertEqual(
notification.target_url,
f"/course/{self.course_session.course.slug}/cockpit/feedback/{self.circle_basis.id}/",
)
self.assertEqual(
notification.notification_category, NotificationCategory.INFORMATION
)
self.assertEqual(
notification.notification_trigger, NotificationTrigger.NEW_FEEDBACK
)
self.assertEqual(notification.action_object, feedback)
self.assertEqual(notification.course_session, self.course_session)
def test_only_submitted_feedback_triggers_notification(self):
FeedbackResponse.objects.create(
circle=self.circle_basis,
course_session=self.course_session,
feedback_user=self.student,
)
self.assertEqual(Notification.objects.count(), 0)
class FeedbackRestApiTestCase(FeedbackBaseTestCase):
def setUp(self) -> None:
super().setUp()
self.feedback_data = {
"satisfaction": [1, 4, 2],
"goal_attainment": [2, 4, 3],
"proficiency": [20, 60, 80],
"preparation_task_clarity": [True, False, True],
"instructor_competence": [1, 2, 3],
"instructor_respect": [40, 80, 100],
"instructor_open_feedback": ["super", "ok", "naja"],
"would_recommend": [False, True, False],
"course_positive_feedback": ["Bla", "Katze", "Hund"],
"course_negative_feedback": ["Maus", "Hase", "Fuchs"],
}
self.feedback_users = [
# MEMBERS of the course session
self.student,
User.objects.get(username="test-student2@example.com"),
User.objects.get(username="test-student3@example.com"),
# EXPERT has submitted feedback for "testing purposes"
# -> should be filtered out!
User.objects.get(username="test-trainer1@example.com"),
]
for i in range(3):
FeedbackResponseFactory(
circle=self.circle_basis,
course_session=self.course_session,
data={
"satisfaction": self.feedback_data["satisfaction"][i],
"goal_attainment": self.feedback_data["goal_attainment"][i],
"proficiency": self.feedback_data["proficiency"][i],
"preparation_task_clarity": self.feedback_data[
"preparation_task_clarity"
][i],
"instructor_competence": self.feedback_data[
"instructor_competence"
][i],
"instructor_open_feedback": self.feedback_data[
"instructor_open_feedback"
][i],
"would_recommend": self.feedback_data["would_recommend"][i],
"instructor_respect": self.feedback_data["instructor_respect"][i],
"course_positive_feedback": self.feedback_data[
"course_positive_feedback"
][i],
"course_negative_feedback": self.feedback_data[
"course_negative_feedback"
][i],
},
feedback_user=self.feedback_users[i],
submitted=True,
)
def test_detail_trainer_can_fetch_feedback(self):
self.client.force_login(self.trainer)
response = self.client.get(
f"/api/core/feedback/{self.course_session.id}/{self.circle_basis.id}/"
)
self.maxDiff = None
expected = {
"amount": 3,
"questions": self.feedback_data,
}
print(response.data)
self.assertEqual(response.status_code, 200)
self.assertDictEqual(response.data, expected)
def test_summary_trainer_can_fetch_feedback(self):
self.client.force_login(self.trainer)
response = self.client.get(
f"/api/core/feedback/{self.course_session.id}/summary/"
)
self.maxDiff = None
self.assertEqual(response.status_code, 200)
self.assertDictEqual(
response.data[0], {"circle_id": self.circle_basis.id, "count": 3}
)
def test_detail_student_cannot_fetch_feedback(self):
self.client.force_login(self.student)
response = self.client.get(
f"/api/core/feedback/{self.course_session.id}/{self.circle_basis.id}/"
)
self.assertEqual(response.status_code, 403)
def test_summary_student_cannot_fetch_feedback(self):
self.client.force_login(self.student)
response = self.client.get(
f"/api/core/feedback/{self.course_session.id}/summary/"
)
self.assertEqual(response.status_code, 403)