Fix unit tests
This commit is contained in:
parent
733063399f
commit
0444658ce3
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ interface Props {
|
|||
showStartButton: boolean;
|
||||
showPreviousButton: boolean;
|
||||
showNextButton: boolean;
|
||||
disableNextButton: boolean;
|
||||
disableNextButton?: boolean;
|
||||
showExitButton: boolean;
|
||||
currentStep: number;
|
||||
stepsCount: number;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue