Fix unit tests

This commit is contained in:
Daniel Egger 2023-09-22 13:18:02 +02:00
parent 733063399f
commit 0444658ce3
5 changed files with 91 additions and 210 deletions

View File

@ -81,7 +81,11 @@ const feedbackSubmitted = ref(false);
const { executeMutation } = useMutation(sendFeedbackMutation);
const feedbackData = reactive({
interface FeedbackData {
[key: string]: number | string | null;
}
const feedbackData: FeedbackData = reactive({
satisfaction: null,
goal_attainment: null,
proficiency: null,
@ -166,7 +170,7 @@ function hasStepValidInput(stepNumber: number) {
return true;
}
function mutateFeedback(data, submit = false) {
function mutateFeedback(data: FeedbackData, submit = false) {
log.debug("mutate feedback", feedbackData);
return executeMutation({
courseSessionId: courseSession.value.id.toString(),
@ -236,12 +240,15 @@ onMounted(async () => {
{{ stepLabels[stepNo] }}
</p>
<div v-for="(question, index) in questionData" :key="index">
<!-- eslint-disable -->
<!-- eslint does not like the dynamic v-model... -->
<component
:is="question.component"
v-if="index + 1 === stepNo"
v-model="feedbackData[question.modelKey]"
v-model="feedbackData[question.modelKey] as any"
:items="question['items']"
/>
<!-- eslint-enable -->
</div>
<FeedbackCompletition
v-if="stepNo === 11"

View File

@ -16,7 +16,7 @@ interface Props {
showStartButton: boolean;
showPreviousButton: boolean;
showNextButton: boolean;
disableNextButton: boolean;
disableNextButton?: boolean;
showExitButton: boolean;
currentStep: number;
stepsCount: number;

View File

@ -21,6 +21,7 @@ ADMIN_USER_ID = "872efd96-3bd7-4a1e-a239-2d72cad9f604"
TEST_TRAINER1_USER_ID = "b9e71f59-c44f-4290-b93a-9b3151e9a2fc"
TEST_STUDENT1_USER_ID = "65c73ad0-6d53-43a9-a4a4-64143f27b03a"
TEST_STUDENT2_USER_ID = "19c40d94-15cc-4198-aaad-ef707c4b0900"
TEST_STUDENT3_USER_ID = "bcf94dba-53bc-474b-a22d-e4af39aa042b"
TEST_COURSE_SESSION_BERN_ID = -1
TEST_COURSE_SESSION_ZURICH_ID = -2

View File

@ -9,6 +9,7 @@ from vbv_lernwelt.core.constants import (
ADMIN_USER_ID,
TEST_STUDENT1_USER_ID,
TEST_STUDENT2_USER_ID,
TEST_STUDENT3_USER_ID,
TEST_TRAINER1_USER_ID,
)
from vbv_lernwelt.core.models import User
@ -284,6 +285,13 @@ def create_default_users(user_model=User, group_model=Group, default_password=No
last_name="Student2",
avatar_url="/static/avatars/uk1.lina.egger.jpg",
)
_create_student_user(
id=TEST_STUDENT3_USER_ID,
email="test-student3@example.com",
first_name="Test",
last_name="Student3",
avatar_url="/static/avatars/uk1.christian.koller.jpg",
)
_create_staff_user(
email="matthias.wirth@vbv-afa.ch",
first_name="Matthias",

View File

@ -1,10 +1,7 @@
from unittest import skip
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 FeedbackResponseFactory
@ -17,70 +14,35 @@ from vbv_lernwelt.notify.models import (
)
class FeedbackApiBaseTestCase(APITestCase):
class FeedbackBaseTestCase(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-fahrzeug"))
_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"
)
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 FeedbackSummaryApiTestCase(FeedbackApiBaseTestCase):
def test_triggers_notification(self):
expert = User.objects.get(username="patrizia.huggel@eiger-versicherungen.ch")
csu = CourseSessionUser.objects.get(
course_session=self.course_session,
user=expert,
role=CourseSessionUser.Role.EXPERT,
)
basis_circle = Circle.objects.get(slug="test-lehrgang-lp-circle-reisen")
csu.expert.add(basis_circle)
class FeedbackNotificationTestCase(FeedbackBaseTestCase):
def test_creating_submitted_feedback_triggers_notification(self):
feedback = FeedbackResponse.objects.create(
circle=basis_circle, course_session=csu.course_session
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, expert)
self.assertEqual(notification.recipient, self.trainer)
self.assertEqual(
notification.verb, f"Feedback abgeschickt für Circle «{basis_circle.title}»"
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/{basis_circle.id}/",
f"/course/{self.course_session.course.slug}/cockpit/feedback/{self.circle_basis.id}/",
)
self.assertEqual(
notification.notification_category, NotificationCategory.INFORMATION
@ -89,121 +51,22 @@ class FeedbackSummaryApiTestCase(FeedbackApiBaseTestCase):
notification.notification_trigger, NotificationTrigger.NEW_FEEDBACK
)
self.assertEqual(notification.action_object, feedback)
self.assertEqual(notification.course_session, csu.course_session)
self.assertEqual(notification.course_session, self.course_session)
def test_triggers_notification_only_on_create(self):
expert = User.objects.get(username="patrizia.huggel@eiger-versicherungen.ch")
csu = CourseSessionUser.objects.get(
def test_only_submitted_feedback_triggers_notification(self):
feedback = FeedbackResponse.objects.create(
circle=self.circle_basis,
course_session=self.course_session,
user=expert,
role=CourseSessionUser.Role.EXPERT,
)
basis_circle = Circle.objects.get(slug="test-lehrgang-lp-circle-reisen")
csu.expert.add(basis_circle)
feedback = FeedbackResponseFactory(
circle=basis_circle, course_session=csu.course_session
)
feedback.save()
# Check that the initial notification was created and then deleted
self.assertEqual(len(Notification.objects.all()), 1)
Notification.objects.all().delete()
self.assertEqual(len(Notification.objects.all()), 0)
# Check that an update of the feedback does not trigger a notification
feedback.name = "Test2"
feedback.save()
self.assertEqual(len(Notification.objects.all()), 0)
def test_can_get_feedback_summary_for_circles(self):
number_reisen_feedback = 5
number_fahrzeug_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,
)
fahrzeug_circle = Circle.objects.get(slug="test-lehrgang-lp-circle-fahrzeug")
reisen_circle = Circle.objects.get(slug="test-lehrgang-lp-circle-reisen")
csu.expert.add(reisen_circle)
for i in range(number_reisen_feedback):
FeedbackResponseFactory(
circle=reisen_circle, course_session=csu.course_session
).save()
for i in range(number_fahrzeug_feedback):
FeedbackResponseFactory(
circle=fahrzeug_circle, course_session=csu.course_session
).save()
response = self.client.get(
f"/api/core/feedback/{csu.course_session.id}/summary/"
feedback_user=self.student,
)
self.assertEqual(response.status_code, 200)
expected = [
{"circle_id": fahrzeug_circle.id, "count": number_fahrzeug_feedback},
{"circle_id": reisen_circle.id, "count": number_reisen_feedback},
]
self.assertEqual(response.data, expected)
@skip("For now every trainer can see all feedback from the same course session")
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,
)
fahrzeug_circle = Circle.objects.get(slug="test-lehrgang-lp-circle-fahrzeug")
reisen_circle = Circle.objects.get(slug="test-lehrgang-lp-circle-reisen")
for i in range(number_basis_feedback):
FeedbackResponseFactory(
circle=reisen_circle, course_session=csu.course_session
).save()
for i in range(number_analyse_feedback):
FeedbackResponseFactory(
circle=fahrzeug_circle, course_session=csu.course_session
).save()
response = self.client.get(
f"/api/core/feedback/{csu.course_session.id}/summary/"
)
self.assertEqual(response.status_code, 200)
expected = [
{"circle_id": fahrzeug_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,
)
fahrzeug_circle = Circle.objects.get(slug="test-lehrgang-lp-circle-fahrzeug")
FeedbackResponseFactory(
circle=fahrzeug_circle, course_session=csu.course_session
).save()
response = self.client.get(
f"/api/core/feedback/{csu.course_session.id}/summary/"
)
self.assertEqual(response.status_code, 403)
self.assertEqual(Notification.objects.count(), 0)
class FeedbackDetailApiTestCase(FeedbackApiBaseTestCase):
def test_can_receive_feedback(self):
feedback_data = {
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],
@ -215,81 +78,83 @@ class FeedbackDetailApiTestCase(FeedbackApiBaseTestCase):
"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-fahrzeug")
self.students = [
self.student,
User.objects.get(username="test-student2@example.com"),
User.objects.get(username="test-student3@example.com"),
]
for i in range(3):
FeedbackResponseFactory(
circle=circle,
course_session=csu.course_session,
circle=self.circle_basis,
course_session=self.course_session,
data={
"satisfaction": feedback_data["satisfaction"][i],
"goal_attainment": feedback_data["goal_attainment"][i],
"proficiency": feedback_data["proficiency"][i],
"preparation_task_clarity": feedback_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": feedback_data["instructor_competence"][i],
"instructor_open_feedback": feedback_data[
"instructor_competence": self.feedback_data[
"instructor_competence"
][i],
"instructor_open_feedback": self.feedback_data[
"instructor_open_feedback"
][i],
"would_recommend": feedback_data["would_recommend"][i],
"instructor_respect": feedback_data["instructor_respect"][i],
"course_positive_feedback": feedback_data[
"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": feedback_data[
"course_negative_feedback": self.feedback_data[
"course_negative_feedback"
][i],
},
).save()
feedback_user=self.students[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/{csu.course_session.id}/{circle.id}/"
f"/api/core/feedback/{self.course_session.id}/{self.circle_basis.id}/"
)
self.maxDiff = None
expected = {
"amount": 3,
"questions": feedback_data,
"questions": self.feedback_data,
}
print(response.data)
self.assertEqual(response.status_code, 200)
self.assertDictEqual(response.data, expected)
@skip("For now every trainer can see all feedback from the same course session")
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-reisen")
FeedbackResponseFactory(circle=circle, course_session=csu.course_session).save()
def test_summary_trainer_can_fetch_feedback(self):
self.client.force_login(self.trainer)
response = self.client.get(
f"/api/core/feedback/{csu.course_session.id}/{circle.id}/"
f"/api/core/feedback/{self.course_session.id}/summary/"
)
self.maxDiff = None
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,
self.assertDictEqual(
response.data[0], {"circle_id": self.circle_basis.id, "count": 3}
)
circle = Circle.objects.get(slug="test-lehrgang-lp-circle-fahrzeug")
FeedbackResponseFactory(circle=circle, course_session=csu.course_session).save()
def test_detail_student_cannot_fetch_feedback(self):
self.client.force_login(self.student)
response = self.client.get(
f"/api/core/feedback/{csu.course_session.id}/{circle.id}/"
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)