From d1907182a33a3174202429eef8f1462a7c36ae62 Mon Sep 17 00:00:00 2001
From: Daniel Egger
Date: Tue, 9 May 2023 13:43:31 +0200
Subject: [PATCH] Fix cypress tests
---
.../EvaluationIntro.vue | 2 +-
client/src/services/assignmentService.ts | 3 +
...mentCompletion.cy.js => assignments.cy.js} | 21 +-
.../assignment/creators/create_assignments.py | 366 +++++++++---------
.../vbv_lernwelt/core/create_default_users.py | 17 +
.../course/creators/test_course.py | 39 +-
6 files changed, 248 insertions(+), 200 deletions(-)
rename cypress/e2e/{assignmentCompletion.cy.js => assignments.cy.js} (78%)
diff --git a/client/src/pages/cockpit/assignmentEvaluationPage/EvaluationIntro.vue b/client/src/pages/cockpit/assignmentEvaluationPage/EvaluationIntro.vue
index 58c038c6..d6e723c3 100644
--- a/client/src/pages/cockpit/assignmentEvaluationPage/EvaluationIntro.vue
+++ b/client/src/pages/cockpit/assignmentEvaluationPage/EvaluationIntro.vue
@@ -54,7 +54,7 @@ async function startEvaluation() {
- Die Gesamtpunktzahl und die daruas resultierende Note wird auf Grund des
+ Die Gesamtpunktzahl und die daraus resultierende Note wird auf Grund des
hinterlegeten Beurteilungsinstrument berechnet.
diff --git a/client/src/services/assignmentService.ts b/client/src/services/assignmentService.ts
index c9687df3..e2ff5985 100644
--- a/client/src/services/assignmentService.ts
+++ b/client/src/services/assignmentService.ts
@@ -96,6 +96,9 @@ export function userAssignmentPoints(
});
return sum(
+ // transform the object of { [expert_id]: { expert_data: { points } } } to an array
+ // of [ [expert_id, { expert_data: { points } }], ... ] so that we can easily sum
+ // the points of the user
Object.entries(pick(assignmentCompletion.completion_data, evaluationTaskIds)).map(
(entry) => {
return entry[1]?.expert_data?.points ?? 0;
diff --git a/cypress/e2e/assignmentCompletion.cy.js b/cypress/e2e/assignments.cy.js
similarity index 78%
rename from cypress/e2e/assignmentCompletion.cy.js
rename to cypress/e2e/assignments.cy.js
index 8cf8127a..a669224e 100644
--- a/cypress/e2e/assignmentCompletion.cy.js
+++ b/cypress/e2e/assignments.cy.js
@@ -1,16 +1,12 @@
import { login } from "./helpers";
-const navigateToAssignment = () => {
- cy.visit(
- "/course/überbetriebliche-kurse/learn/fahrzeug/überprüfen-einer-motorfahrzeug-versicherungspolice"
- );
-};
-
-describe("assignment completion", () => {
+describe("student test", () => {
beforeEach(() => {
cy.manageCommand("cypress_reset");
- login("admin", "test");
- navigateToAssignment();
+ login("test-student1@example.com", "test");
+ cy.visit(
+ "/course/test-lehrgang/learn/fahrzeug/überprüfen-einer-motorfahrzeug-versicherungspolice"
+ );
});
it("can open assignment", () => {
@@ -46,10 +42,7 @@ describe("assignment completion", () => {
);
// Click confirmation
cy.get('[data-cy="it-checkbox-confirmation-1"]').click({ force: true });
- cy.wait(250);
cy.reload();
- // 1 Step forward
- cy.learningContentMultiLayoutNextStep();
cy.get('[data-cy="it-checkbox-confirmation-1"]').should("be.checked");
});
@@ -64,12 +57,10 @@ describe("assignment completion", () => {
cy.get('[data-cy="it-textarea-user-text-input-1"]')
.clear()
.type("Hallovelo");
+ // wait because of input debounce
cy.wait(550);
cy.reload();
- // 2 Step forward
- cy.learningContentMultiLayoutNextStep();
- cy.learningContentMultiLayoutNextStep();
cy.get('[data-cy="it-textarea-user-text-input-1"]').should(
"have.value",
"Hallovelo"
diff --git a/server/vbv_lernwelt/assignment/creators/create_assignments.py b/server/vbv_lernwelt/assignment/creators/create_assignments.py
index 7e32fa2a..9471bbe9 100644
--- a/server/vbv_lernwelt/assignment/creators/create_assignments.py
+++ b/server/vbv_lernwelt/assignment/creators/create_assignments.py
@@ -456,6 +456,8 @@ def create_uk_assignments(course_id=COURSE_UK):
assignment.save()
+ return assignment
+
def create_test_assignment(course_id=COURSE_TEST_ID):
course_page = CoursePage.objects.get(course_id=course_id)
@@ -494,6 +496,185 @@ def create_test_assignment(course_id=COURSE_TEST_ID):
evaluation_description="Diese geleitete Fallarbeit wird auf Grund des folgenden Beurteilungsintrument bewertet.",
)
+ assignment.evaluation_tasks = []
+ assignment.evaluation_tasks.append(
+ (
+ "task",
+ EvaluationTaskBlockFactory(
+ title="Ausgangslage des Auftrags",
+ description=RichText(
+ "Beschreibt der/die Lernende die Ausgangslage des Auftrags vollständig?"
+ ),
+ max_points=6,
+ sub_tasks=ListValue(
+ ListBlock(EvaluationSubTaskBlock()),
+ values=[
+ EvaluationSubTaskBlockFactory(
+ title="Die Ausgangslage des Auftrag ist vollständig beschrieben.",
+ description=RichText(
+ replace_whitespace(
+ """
+
+ - Worum geht es? Was ist die Aufgabe?
+ - Sind das Kundenprofil und die Kundenbeziehung vollständig und nachvollziehbar dargestellt?
+ - Ist das Alter des Fahrzeugs dokumentiert?
+ - Welche Ressourcen stehen zur Verfügung?
+
+ """
+ )
+ ),
+ points=6,
+ ),
+ EvaluationSubTaskBlockFactory(
+ title="Die Ausgangslage ist grösstenteils vollständig beschrieben.",
+ points=4,
+ ),
+ EvaluationSubTaskBlockFactory(
+ title="Die Ausgangslage ist unvollständig - nur 2 Punkte wurden beschrieben.",
+ points=2,
+ ),
+ EvaluationSubTaskBlockFactory(
+ title="Die Ausgangslage des Auftrag ist unvollständig - es fehlen mehr als 2 Punkte in der Beschreibung.",
+ points=0,
+ ),
+ ],
+ ),
+ ),
+ ),
+ )
+ assignment.evaluation_tasks.append(
+ (
+ "task",
+ EvaluationTaskBlockFactory(
+ title="Inhaltsanalyse und Struktur",
+ max_points=6,
+ description=RichText(
+ "Sind die Deckungen der Police vollständig und nachvollziehbar dokumentiert?"
+ ),
+ sub_tasks=ListValue(
+ ListBlock(EvaluationSubTaskBlock()),
+ values=[
+ EvaluationSubTaskBlockFactory(
+ title="Die Analyse beinhaltet alle in der Police vorhandenen Deckungen und ist logisch aufgebaut.",
+ points=6,
+ ),
+ EvaluationSubTaskBlockFactory(
+ title="Die Analyse beinhaltet die meisten vorhandenen Deckungen in der Police und ist grösstenteils logisch aufgebaut.",
+ points=4,
+ ),
+ EvaluationSubTaskBlockFactory(
+ title="Die Analyse ist unvollständig (es fehlen mehr als 3 Deckungen) und der rote Faden ist nicht erkennbar.",
+ points=2,
+ ),
+ EvaluationSubTaskBlockFactory(
+ title="Die Analyse ist insgesamt nicht nachvollziehbar und es fehlen einige Deckungen.",
+ points=0,
+ ),
+ ],
+ ),
+ ),
+ ),
+ )
+ assignment.evaluation_tasks.append(
+ (
+ "task",
+ EvaluationTaskBlockFactory(
+ title="Sinnvolle Empfehlungen",
+ max_points=6,
+ description=RichText(
+ "Leitet die lernende Person sinnvolle und geeignete Empfehlungen ab?"
+ ),
+ sub_tasks=ListValue(
+ ListBlock(EvaluationSubTaskBlock()),
+ values=[
+ EvaluationSubTaskBlockFactory(
+ title="Die Empfehlungen sind durchgängig sinnvoll und nachvollziehbar begründet.",
+ points=6,
+ ),
+ EvaluationSubTaskBlockFactory(
+ title="Die Empfehlungen sind grösstenteils sinnvoll und nachvollziehbar begründet.",
+ points=4,
+ ),
+ EvaluationSubTaskBlockFactory(
+ title="Die Empfehlungen sind wenig sinnvoll und unvollständig begründet.",
+ points=2,
+ ),
+ EvaluationSubTaskBlockFactory(
+ title="Die Empfehlungen sind weder sinnvoll nch nachvollziehbar begründet.",
+ points=0,
+ ),
+ ],
+ ),
+ ),
+ ),
+ )
+ assignment.evaluation_tasks.append(
+ (
+ "task",
+ EvaluationTaskBlockFactory(
+ title="Qualität der Reflexion",
+ max_points=3,
+ description=RichText(
+ "Reflektiert die lernende Person die Durchführung der geleiteten Fallarbeit?"
+ ),
+ sub_tasks=ListValue(
+ ListBlock(EvaluationSubTaskBlock()),
+ values=[
+ EvaluationSubTaskBlockFactory(
+ title="Die Reflexion bezieht sich auf die geleitete Fallarbeit und umfasst nachvollziehbare positive wie negative Aspekte.",
+ points=3,
+ ),
+ EvaluationSubTaskBlockFactory(
+ title="Die Reflexion bezieht sich auf die geleitete Fallarbeit und umfasst grösstenteils nachvollziehbare positive wie negative Aspekte.",
+ points=2,
+ ),
+ EvaluationSubTaskBlockFactory(
+ title="Die Reflexion ist unvollständig.",
+ points=1,
+ ),
+ EvaluationSubTaskBlockFactory(
+ title="Die Reflexion bezieht sich nicht auf die geleitete Fallarbeit.",
+ points=0,
+ ),
+ ],
+ ),
+ ),
+ ),
+ )
+ assignment.evaluation_tasks.append(
+ (
+ "task",
+ EvaluationTaskBlockFactory(
+ title="Eignung der Learnings",
+ max_points=3,
+ description=RichText(
+ "Leitet die lernende Person geeignete Learnings aus der Reflexion ab?"
+ ),
+ sub_tasks=ListValue(
+ ListBlock(EvaluationSubTaskBlock()),
+ values=[
+ EvaluationSubTaskBlockFactory(
+ title="Die Learnings beziehen sich auf die geleitete Fallarbeit und sind inhaltlich sinnvoll.",
+ points=3,
+ ),
+ EvaluationSubTaskBlockFactory(
+ title="Die Learnings beziehen sich grösstenteils auf die geleitete Fallarbeit und sind inhaltlich sinnvoll.",
+ points=2,
+ ),
+ EvaluationSubTaskBlockFactory(
+ title="Die Learnings beziehen sich teilweise auf die geleitete Fallarbeit und sind inhaltlich wenig sinnvoll.",
+ points=1,
+ ),
+ EvaluationSubTaskBlockFactory(
+ title="Die Learnings beziehen sich nicht auf die geleitete Fallarbeit.",
+ points=0,
+ ),
+ ],
+ ),
+ ),
+ ),
+ )
+
assignment.tasks = []
assignment.tasks.append(
(
@@ -501,14 +682,16 @@ def create_test_assignment(course_id=COURSE_TEST_ID):
TaskBlockFactory(
title="Teilaufgabe 1: Beispiel einer Versicherungspolice finden",
# it is hard to create a StreamValue programmatically, we have to
- # create a `StreamValue` manually. Ask the Daniel and/or Ramon
+ # create a `StreamValue` manually. Ask Daniel and/or Ramon
content=StreamValue(
TaskContentStreamBlock(),
stream_data=[
(
"explanation",
ExplanationBlockFactory(
- text=RichText("Dies ist ein Beispieltext.")
+ text=RichText(
+ "Bitte jemand aus deiner Familie oder deinem Freundeskreis darum, dir seine/ihre Motorfahrzeugversicherungspolice zur Verfügung zu stellen."
+ )
),
),
(
@@ -710,185 +893,6 @@ def create_test_assignment(course_id=COURSE_TEST_ID):
)
)
- assignment.evaluation_tasks = []
- assignment.evaluation_tasks.append(
- (
- "task",
- EvaluationTaskBlockFactory(
- title="Ausgangslage des Auftrags",
- description=RichText(
- "Beschreibt der/die Lernende die Ausgangslage des Auftrags vollständig?"
- ),
- max_points=6,
- sub_tasks=ListValue(
- ListBlock(EvaluationSubTaskBlock()),
- values=[
- EvaluationSubTaskBlockFactory(
- title="Die Ausgangslage des Auftrag ist vollständig beschrieben.",
- description=RichText(
- replace_whitespace(
- """
-
- - Worum geht es? Was ist die Aufgabe?
- - Sind das Kundenprofil und die Kundenbeziehung vollständig und nachvollziehbar dargestellt?
- - Ist das Alter des Fahrzeugs dokumentiert?
- - Welche Ressourcen stehen zur Verfügung?
-
- """
- )
- ),
- points=6,
- ),
- EvaluationSubTaskBlockFactory(
- title="Die Ausgangslage ist grösstenteils vollständig beschrieben.",
- points=4,
- ),
- EvaluationSubTaskBlockFactory(
- title="Die Ausgangslage ist unvollständig - nur 2 Punkte wurden beschrieben.",
- points=2,
- ),
- EvaluationSubTaskBlockFactory(
- title="Die Ausgangslage des Auftrag ist unvollständig - es fehlen mehr als 2 Punkte in der Beschreibung.",
- points=0,
- ),
- ],
- ),
- ),
- ),
- )
- assignment.evaluation_tasks.append(
- (
- "task",
- EvaluationTaskBlockFactory(
- title="Inhaltsanalyse und Struktur",
- max_points=6,
- description=RichText(
- "Sind die Deckungen der Police vollständig und nachvollziehbar dokumentiert?"
- ),
- sub_tasks=ListValue(
- ListBlock(EvaluationSubTaskBlock()),
- values=[
- EvaluationSubTaskBlockFactory(
- title="Die Analyse beinhaltet alle in der Police vorhandenen Deckungen und ist logisch aufgebaut.",
- points=6,
- ),
- EvaluationSubTaskBlockFactory(
- title="Die Analyse beinhaltet die meisten vorhandenen Deckungen in der Police und ist grösstenteils logisch aufgebaut.",
- points=4,
- ),
- EvaluationSubTaskBlockFactory(
- title="Die Analyse ist unvollständig (es fehlen mehr als 3 Deckungen) und der rote Faden ist nicht erkennbar.",
- points=2,
- ),
- EvaluationSubTaskBlockFactory(
- title="Die Analyse ist insgesamt nicht nachvollziehbar und es fehlen einige Deckungen.",
- points=0,
- ),
- ],
- ),
- ),
- ),
- )
- assignment.evaluation_tasks.append(
- (
- "task",
- EvaluationTaskBlockFactory(
- title="Sinnvolle Empfehlungen",
- max_points=6,
- description=RichText(
- "Leitet die lernende Person sinnvolle und geeignete Empfehlungen ab?"
- ),
- sub_tasks=ListValue(
- ListBlock(EvaluationSubTaskBlock()),
- values=[
- EvaluationSubTaskBlockFactory(
- title="Die Empfehlungen sind durchgängig sinnvoll und nachvollziehbar begründet.",
- points=6,
- ),
- EvaluationSubTaskBlockFactory(
- title="Die Empfehlungen sind grösstenteils sinnvoll und nachvollziehbar begründet.",
- points=4,
- ),
- EvaluationSubTaskBlockFactory(
- title="Die Empfehlungen sind wenig sinnvoll und unvollständig begründet.",
- points=2,
- ),
- EvaluationSubTaskBlockFactory(
- title="Die Empfehlungen sind weder sinnvoll nch nachvollziehbar begründet.",
- points=0,
- ),
- ],
- ),
- ),
- ),
- )
- assignment.evaluation_tasks.append(
- (
- "task",
- EvaluationTaskBlockFactory(
- title="Qualität der Reflexion",
- max_points=3,
- description=RichText(
- "Reflektiert die lernende Person die Durchführung der geleiteten Fallarbeit?"
- ),
- sub_tasks=ListValue(
- ListBlock(EvaluationSubTaskBlock()),
- values=[
- EvaluationSubTaskBlockFactory(
- title="Die Reflexion bezieht sich auf die geleitete Fallarbeit und umfasst nachvollziehbare positive wie negative Aspekte.",
- points=3,
- ),
- EvaluationSubTaskBlockFactory(
- title="Die Reflexion bezieht sich auf die geleitete Fallarbeit und umfasst grösstenteils nachvollziehbare positive wie negative Aspekte.",
- points=2,
- ),
- EvaluationSubTaskBlockFactory(
- title="Die Reflexion ist unvollständig.",
- points=1,
- ),
- EvaluationSubTaskBlockFactory(
- title="Die Reflexion bezieht sich nicht auf die geleitete Fallarbeit.",
- points=0,
- ),
- ],
- ),
- ),
- ),
- )
- assignment.evaluation_tasks.append(
- (
- "task",
- EvaluationTaskBlockFactory(
- title="Eignung der Learnings",
- max_points=3,
- description=RichText(
- "Leitet die lernende Person geeignete Learnings aus der Reflexion ab?"
- ),
- sub_tasks=ListValue(
- ListBlock(EvaluationSubTaskBlock()),
- values=[
- EvaluationSubTaskBlockFactory(
- title="Die Learnings beziehen sich auf die geleitete Fallarbeit und sind inhaltlich sinnvoll.",
- points=3,
- ),
- EvaluationSubTaskBlockFactory(
- title="Die Learnings beziehen sich grösstenteils auf die geleitete Fallarbeit und sind inhaltlich sinnvoll.",
- points=2,
- ),
- EvaluationSubTaskBlockFactory(
- title="Die Learnings beziehen sich teilweise auf die geleitete Fallarbeit und sind inhaltlich wenig sinnvoll.",
- points=1,
- ),
- EvaluationSubTaskBlockFactory(
- title="Die Learnings beziehen sich nicht auf die geleitete Fallarbeit.",
- points=0,
- ),
- ],
- ),
- ),
- ),
- )
-
assignment.save()
return assignment
diff --git a/server/vbv_lernwelt/core/create_default_users.py b/server/vbv_lernwelt/core/create_default_users.py
index c5cced85..172b269e 100644
--- a/server/vbv_lernwelt/core/create_default_users.py
+++ b/server/vbv_lernwelt/core/create_default_users.py
@@ -230,6 +230,23 @@ def create_default_users(user_model=User, group_model=Group, default_password=No
language="fr",
)
+ # users for cypress tests
+ _create_student_user(
+ email="test-trainer1@example.com",
+ first_name="Test",
+ last_name="Trainer1",
+ )
+ _create_student_user(
+ email="test-student1@example.com",
+ first_name="Test",
+ last_name="Student1",
+ )
+ _create_student_user(
+ email="test-student2@example.com",
+ first_name="Test",
+ last_name="Student2",
+ )
+
def _get_or_create_user(user_model, *args, **kwargs):
username = kwargs.get("username", None)
diff --git a/server/vbv_lernwelt/course/creators/test_course.py b/server/vbv_lernwelt/course/creators/test_course.py
index 746e01e0..a75e099b 100644
--- a/server/vbv_lernwelt/course/creators/test_course.py
+++ b/server/vbv_lernwelt/course/creators/test_course.py
@@ -13,10 +13,18 @@ from vbv_lernwelt.competence.factories import (
PerformanceCriteriaFactory,
)
from vbv_lernwelt.competence.models import CompetencePage
+from vbv_lernwelt.core.models import User
from vbv_lernwelt.core.tests.helpers import create_locales_for_wagtail
from vbv_lernwelt.course.consts import COURSE_TEST_ID
from vbv_lernwelt.course.factories import CoursePageFactory
-from vbv_lernwelt.course.models import Course, CourseCategory, CoursePage, CourseSession
+from vbv_lernwelt.course.models import (
+ Course,
+ CourseCategory,
+ CoursePage,
+ CourseSession,
+ CourseSessionUser,
+)
+from vbv_lernwelt.learnpath.models import Circle
from vbv_lernwelt.learnpath.tests.learning_path_factories import (
AssignmentBlockFactory,
AttendanceDayBlockFactory,
@@ -55,15 +63,40 @@ def create_test_course(include_uk=True, include_vv=True, with_sessions=False):
if with_sessions:
# course sessions
- CourseSession.objects.create(
+ cs_bern = CourseSession.objects.create(
course_id=COURSE_TEST_ID,
title="Bern 2022 a",
)
- CourseSession.objects.create(
+ cs_zurich = CourseSession.objects.create(
course_id=COURSE_TEST_ID,
title="Zürich 2022 a",
)
+ trainer1 = User.objects.get(email="test-trainer1@example.com")
+ csu = CourseSessionUser.objects.create(
+ course_session=cs_bern,
+ user=trainer1,
+ role=CourseSessionUser.Role.EXPERT,
+ )
+ csu.expert.add(Circle.objects.get(slug="test-lehrgang-lp-circle-fahrzeug"))
+
+ student1 = User.objects.get(email="test-student1@example.com")
+ _csu = CourseSessionUser.objects.create(
+ course_session=cs_bern,
+ user=student1,
+ )
+
+ student2 = User.objects.get(email="test-student2@example.com")
+ _csu = CourseSessionUser.objects.create(
+ course_session=cs_bern,
+ user=student2,
+ )
+ student2 = User.objects.get(email="test-student2@example.com")
+ _csu = CourseSessionUser.objects.create(
+ course_session=cs_zurich,
+ user=student2,
+ )
+
return course