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

228 lines
8.8 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.consts import COURSE_TEST_ID
from vbv_lernwelt.course.creators.test_course import create_test_course
from vbv_lernwelt.course.models import CourseSession, CourseSessionUser
from vbv_lernwelt.feedback.factories import FeedbackFactory
from vbv_lernwelt.learnpath.models import Circle
class FeedbackApiBaseTestCase(APITestCase):
def setUp(self) -> None:
create_default_users()
create_test_course()
self.user = User.objects.get(username="student")
self.expert = User.objects.get(
username="patrizia.huggel@eiger-versicherungen.ch"
)
self.course_session = CourseSession.objects.create(
course_id=COURSE_TEST_ID,
title="Test Lehrgang Session",
)
csu = CourseSessionUser.objects.create(
course_session=self.course_session,
user=User.objects.get(username="patrizia.huggel@eiger-versicherungen.ch"),
role=CourseSessionUser.Role.EXPERT,
)
csu.expert.add(Circle.objects.get(slug="test-lehrgang-lp-circle-analyse"))
_csu = CourseSessionUser.objects.create(
course_session=self.course_session,
user=self.user,
role=CourseSessionUser.Role.MEMBER,
)
self.test_data = {
"file_name": "test.pdf",
"file_type": "application/pdf",
"name": "Test",
"course_session": self.course_session.id,
}
self.client.login(
username="patrizia.huggel@eiger-versicherungen.ch", password="myvbv1234"
)
class FeedbackSummaryApiTestCase(FeedbackApiBaseTestCase):
def test_can_get_feedback_summary_for_circles(self):
number_basis_feedback = 5
number_analyse_feedback = 10
csu = CourseSessionUser.objects.get(
course_session=self.course_session,
user=User.objects.get(username="patrizia.huggel@eiger-versicherungen.ch"),
role=CourseSessionUser.Role.EXPERT,
)
analyse_circle = Circle.objects.get(slug="test-lehrgang-lp-circle-analyse")
basis_circle = Circle.objects.get(slug="test-lehrgang-lp-circle-basis")
csu.expert.add(basis_circle)
for i in range(number_basis_feedback):
FeedbackFactory(
circle=basis_circle, course_session=csu.course_session
).save()
for i in range(number_analyse_feedback):
FeedbackFactory(
circle=analyse_circle, course_session=csu.course_session
).save()
response = self.client.get(
f"/api/core/feedback/{csu.course_session.course.id}/summary/"
)
self.assertEqual(response.status_code, 200)
expected = [
{"circle_id": basis_circle.id, "count": number_basis_feedback},
{"circle_id": analyse_circle.id, "count": number_analyse_feedback},
]
self.assertEqual(response.data, expected)
def test_can_only_see_feedback_from_own_circle(self):
number_basis_feedback = 5
number_analyse_feedback = 10
csu = CourseSessionUser.objects.get(
course_session=self.course_session,
user=User.objects.get(username="patrizia.huggel@eiger-versicherungen.ch"),
role=CourseSessionUser.Role.EXPERT,
)
analyse_circle = Circle.objects.get(slug="test-lehrgang-lp-circle-analyse")
basis_circle = Circle.objects.get(slug="test-lehrgang-lp-circle-basis")
for i in range(number_basis_feedback):
FeedbackFactory(
circle=basis_circle, course_session=csu.course_session
).save()
for i in range(number_analyse_feedback):
FeedbackFactory(
circle=analyse_circle, course_session=csu.course_session
).save()
response = self.client.get(
f"/api/core/feedback/{csu.course_session.course.id}/summary/"
)
self.assertEqual(response.status_code, 200)
expected = [
{"circle_id": analyse_circle.id, "count": number_analyse_feedback},
]
self.assertEqual(response.data, expected)
def test_student_does_not_see_feedback(self):
self.client.login(username="student", password="test")
csu = CourseSessionUser.objects.get(
course_session=self.course_session,
user=self.user,
)
analyse_circle = Circle.objects.get(slug="test-lehrgang-lp-circle-analyse")
FeedbackFactory(circle=analyse_circle, course_session=csu.course_session).save()
response = self.client.get(
f"/api/core/feedback/{csu.course_session.course.id}/summary/"
)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data, [])
class FeedbackDetailApiTestCase(FeedbackApiBaseTestCase):
def test_can_receive_feedback(self):
feedback_data = {
"satisfaction": [1, 4, 2],
"goal_attainment": [2, 4, 3],
"proficiency": [20, 60, 80],
"received_materials": [True, False, True],
"materials_rating": [3, 2, 1],
"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"],
}
csu = CourseSessionUser.objects.get(
course_session=self.course_session,
user=User.objects.get(username="patrizia.huggel@eiger-versicherungen.ch"),
role=CourseSessionUser.Role.EXPERT,
)
circle = Circle.objects.get(slug="test-lehrgang-lp-circle-analyse")
for i in range(3):
FeedbackFactory(
circle=circle,
course_session=csu.course_session,
data={
"satisfaction": feedback_data["satisfaction"][i],
"goal_attainment": feedback_data["goal_attainment"][i],
"proficiency": feedback_data["proficiency"][i],
"received_materials": feedback_data["received_materials"][i],
"materials_rating": feedback_data["materials_rating"][i],
"instructor_competence": feedback_data["instructor_competence"][i],
"instructor_open_feedback": feedback_data[
"instructor_open_feedback"
][i],
"instructor_respect": feedback_data["instructor_respect"][i],
"would_recommend": feedback_data["would_recommend"][i],
"course_positive_feedback": feedback_data[
"course_positive_feedback"
][i],
"course_negative_feedback": feedback_data[
"course_negative_feedback"
][i],
},
).save()
response = self.client.get(
f"/api/core/feedback/{csu.course_session.course.id}/{circle.id}/"
)
self.maxDiff = None
expected = {
"amount": 3,
"questions": feedback_data,
}
self.assertEqual(response.status_code, 200)
self.assertDictEqual(response.data, expected)
def test_cannot_receive_feedback_from_other_circle(self):
csu = CourseSessionUser.objects.get(
course_session=self.course_session,
user=User.objects.get(username="patrizia.huggel@eiger-versicherungen.ch"),
role=CourseSessionUser.Role.EXPERT,
)
circle = Circle.objects.get(slug="test-lehrgang-lp-circle-basis")
FeedbackFactory(circle=circle, course_session=csu.course_session).save()
response = self.client.get(
f"/api/core/feedback/{csu.course_session.course.id}/{circle.id}/"
)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data, {"amount": 0, "questions": {}})
def test_student_cannot_receive_feedback(self):
self.client.login(username="student", password="test")
csu = CourseSessionUser.objects.get(
course_session=self.course_session,
user=self.user,
)
circle = Circle.objects.get(slug="test-lehrgang-lp-circle-analyse")
FeedbackFactory(circle=circle, course_session=csu.course_session).save()
response = self.client.get(
f"/api/core/feedback/{csu.course_session.course.id}/{circle.id}/"
)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data, {"amount": 0, "questions": {}})