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( + """ + + """ + ) + ), + 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( - """ - - """ - ) - ), - 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