Merged in feature/berufsbilnder-cypress (pull request #378)

Feature/berufsbilnder cypress

* Berufsbildner cypress test

* Fix tests
This commit is contained in:
Daniel Egger 2024-08-23 13:26:47 +00:00
parent f8f9ed86dc
commit 0f6ec66122
26 changed files with 518 additions and 248 deletions

View File

@ -40,6 +40,7 @@ onMounted(async () => {
<div :class="['flex flex-row space-x-3 bg-white', slim ? '' : 'pb-6']"> <div :class="['flex flex-row space-x-3 bg-white', slim ? '' : 'pb-6']">
<div <div
class="flex h-[74px] items-center justify-center py-1 pr-3 text-3xl font-bold" class="flex h-[74px] items-center justify-center py-1 pr-3 text-3xl font-bold"
data-cy="dashboard.mentor.menteeCountValue"
> >
<span>{{ menteeCount }}</span> <span>{{ menteeCount }}</span>
</div> </div>

View File

@ -37,10 +37,13 @@ onMounted(async () => {
}); });
const averageGrade = computed(() => { const averageGrade = computed(() => {
return percentToRoundedGrade( if (assignmentStats.value?.summary.average_evaluation_percent) {
assignmentStats.value?.summary.average_evaluation_percent ?? 0, return percentToRoundedGrade(
false assignmentStats.value?.summary.average_evaluation_percent ?? 0,
); false
);
}
return null;
}); });
</script> </script>
@ -59,7 +62,7 @@ const averageGrade = computed(() => {
> >
<template #title>{{ $t("a.Kompetenznachweise") }}</template> <template #title>{{ $t("a.Kompetenznachweise") }}</template>
<template #content> <template #content>
<div class="flex items-center gap-4"> <div v-if="averageGrade" class="flex items-center gap-4">
<div class="min-w-12 text-center"> <div class="min-w-12 text-center">
<div <div
class="heading-2 rounded bg-green-500 p-4" class="heading-2 rounded bg-green-500 p-4"

View File

@ -104,7 +104,7 @@ function hasActionButton(): boolean {
</a> </a>
</div> </div>
<p> <p>
<span class="rounded bg-gray-300 px-2 py-1"> <span class="rounded bg-gray-300 px-2 py-1" data-cy="panel-role-key">
{{ $t(courseConfig.role_key) }} {{ $t(courseConfig.role_key) }}
</span> </span>
<router-link <router-link

View File

@ -117,18 +117,21 @@ function getFilteredItems() {
v-model="regionFilterValue" v-model="regionFilterValue"
class="min-w-[12rem]" class="min-w-[12rem]"
:items="regionFilter" :items="regionFilter"
data-cy="select-region"
borderless borderless
></ItDropdownSelect> ></ItDropdownSelect>
<ItDropdownSelect <ItDropdownSelect
v-model="sessionFilterValue" v-model="sessionFilterValue"
class="min-w-[12rem]" class="min-w-[12rem]"
:items="sessionFilter" :items="sessionFilter"
data-cy="select-session"
borderless borderless
></ItDropdownSelect> ></ItDropdownSelect>
<ItDropdownSelect <ItDropdownSelect
v-model="generationFilterValue" v-model="generationFilterValue"
class="min-w-[12rem]" class="min-w-[12rem]"
:items="generationFilter" :items="generationFilter"
data-cy="select-generation"
borderless borderless
></ItDropdownSelect> ></ItDropdownSelect>
<ItDropdownSelect <ItDropdownSelect
@ -136,6 +139,7 @@ function getFilteredItems() {
v-model="circleFilterValue" v-model="circleFilterValue"
class="min-w-[12rem]" class="min-w-[12rem]"
:items="circleFilter" :items="circleFilter"
data-cy="select-circle"
borderless borderless
></ItDropdownSelect> ></ItDropdownSelect>
</div> </div>
@ -145,6 +149,7 @@ function getFilteredItems() {
v-for="item in filteredItems" v-for="item in filteredItems"
:key="item._id" :key="item._id"
class="mx-6 border-t border-gray-500 first:border-t-0" class="mx-6 border-t border-gray-500 first:border-t-0"
data-cy="statistics-filter-list-item"
> >
<div class="py-4"> <div class="py-4">
<slot :item="item"></slot> <slot :item="item"></slot>

View File

@ -736,9 +736,28 @@ export function useAllCompetenceCertificates(userId: string, courseSlug: string)
}) })
); );
const isLoaded = computed(() => !certificateQueries.some((q) => q.fetching.value)); const isLoaded = computed(() => !certificateQueries.some((q) => q.fetching.value));
const competenceCertificates = computed(() => const allCompetenceCertificates = computed(() =>
mergeCompetenceCertificates(competenceCertificatesPerCs.value.flat()) mergeCompetenceCertificates(competenceCertificatesPerCs.value.flat())
); );
// it is possible that because of caching (?) the query returns completions for other
// users, when the logged in user is Berufsbildner, so filter completions by user
const competenceCertificates = computed(() => {
return (allCompetenceCertificates.value ?? []).map((cc) => {
return {
...cc,
assignments: cc.assignments.map((a) => {
return {
...a,
completions: (a.completions ?? []).filter(
(c) => c.assignment_user.id === userId
),
};
}),
};
});
});
return { return {
competenceCertificates, competenceCertificates,
isLoaded, isLoaded,

View File

@ -15,13 +15,14 @@ const props = defineProps<{
log.debug("CompetenceCertificateDetailPage setup", props); log.debug("CompetenceCertificateDetailPage setup", props);
const { id: currentUserId } = useUserStore(); const { id: currentUserId } = useUserStore();
const { competenceCertificates } = useAllCompetenceCertificates( const { competenceCertificates } = useAllCompetenceCertificates(
props.userId ?? currentUserId, props.userId ?? currentUserId,
props.courseSlug props.courseSlug
); );
const certificate = computed(() => { const certificate = computed(() => {
if (!competenceCertificates) { if (!competenceCertificates.value) {
return null; return null;
} }

View File

@ -19,6 +19,7 @@ log.debug("CompetenceCertificateListPage setup", props);
const route = useRoute(); const route = useRoute();
const { id: currentUserId } = useUserStore(); const { id: currentUserId } = useUserStore();
const { competenceCertificates } = useAllCompetenceCertificates( const { competenceCertificates } = useAllCompetenceCertificates(
props.userId ?? currentUserId, props.userId ?? currentUserId,
props.courseSlug props.courseSlug

View File

@ -3,6 +3,7 @@ import { percentToRoundedGrade } from "@/services/assignmentService";
import type { CompetenceCertificate, CompetenceCertificateAssignment } from "@/types"; import type { CompetenceCertificate, CompetenceCertificateAssignment } from "@/types";
import dayjs from "dayjs"; import dayjs from "dayjs";
import _ from "lodash"; import _ from "lodash";
import log from "loglevel";
export function assignmentsMaxEvaluationPoints( export function assignmentsMaxEvaluationPoints(
assignments: CompetenceCertificateAssignment[] assignments: CompetenceCertificateAssignment[]
@ -103,7 +104,7 @@ export function mergeCompetenceCertificates(
groupedCompetenceCertificates[certificate.id].push(certificate); groupedCompetenceCertificates[certificate.id].push(certificate);
}); });
console.log( log.debug(
`Found ${Object.keys(groupedCompetenceCertificates).length} competence certificates over all course sessions` `Found ${Object.keys(groupedCompetenceCertificates).length} competence certificates over all course sessions`
); );

View File

@ -22,7 +22,9 @@ const displayDueDates = computed(() => {
</div> </div>
<div v-else> <div v-else>
<section class="border-b p-8"> <section class="border-b p-8">
<h3 class="mb-4">{{ dashboardPersons.length }} {{ $t("a.Personen") }}</h3> <h3 class="mb-4" data-cy="num-dashboard-persons">
{{ dashboardPersons.length }} {{ $t("a.Personen") }}
</h3>
<div> <div>
<router-link class="btn-secondary" to="/dashboard/persons"> <router-link class="btn-secondary" to="/dashboard/persons">
{{ $t("a.Alle Personen anzeigen") }} {{ $t("a.Alle Personen anzeigen") }}

View File

@ -40,6 +40,7 @@ const learningContentAssignment = computed(() => {
<router-link <router-link
class="btn-text inline-flex items-center pl-0" class="btn-text inline-flex items-center pl-0"
:to="`/statistic/${props.agentRole}/${props.courseSlug}/assignment`" :to="`/statistic/${props.agentRole}/${props.courseSlug}/assignment`"
data-cy="back-button"
> >
<it-icon-arrow-left /> <it-icon-arrow-left />
<span>{{ $t("general.back") }}</span> <span>{{ $t("general.back") }}</span>

View File

@ -62,6 +62,10 @@ const totalAverageGrade = computed(() => {
(c) => c?.completion_status == "EVALUATION_SUBMITTED" (c) => c?.completion_status == "EVALUATION_SUBMITTED"
); );
if (relevantCompletions.length === 0) {
return 0;
}
const averagePercent = const averagePercent =
_.sumBy(relevantCompletions, (c) => c?.evaluation_percent ?? 0) / _.sumBy(relevantCompletions, (c) => c?.evaluation_percent ?? 0) /
relevantCompletions.length; relevantCompletions.length;
@ -73,7 +77,6 @@ const totalAverageGrade = computed(() => {
return averagePercent * (assignment.competence_certificate_weight ?? 1); return averagePercent * (assignment.competence_certificate_weight ?? 1);
} }
); );
return percentToRoundedGrade( return percentToRoundedGrade(
_.sum(assignmentAverageGrades) / (divisor ?? 1), _.sum(assignmentAverageGrades) / (divisor ?? 1),
false false
@ -118,6 +121,7 @@ onMounted(async () => {
<router-link <router-link
class="btn-text inline-flex items-center pl-0" class="btn-text inline-flex items-center pl-0"
:to="`/statistic/${props.agentRole}/${props.courseSlug}/competence-grade`" :to="`/statistic/${props.agentRole}/${props.courseSlug}/competence-grade`"
data-cy="back-button"
> >
<it-icon-arrow-left /> <it-icon-arrow-left />
<span>{{ $t("general.back") }}</span> <span>{{ $t("general.back") }}</span>
@ -128,7 +132,10 @@ onMounted(async () => {
<div class="border-b bg-white px-6 py-6"> <div class="border-b bg-white px-6 py-6">
{{ courseSession?.session_title }} {{ courseSession?.session_title }}
</div> </div>
<div class="heading-3 border-b bg-white px-6 py-6"> <div
class="heading-3 border-b bg-white px-6 py-6"
data-cy="total-average-grade"
>
{{ $t("a.Durchschnittsnote") }}: {{ $t("a.Durchschnittsnote") }}:
{{ totalAverageGrade }} {{ totalAverageGrade }}
</div> </div>
@ -136,7 +143,7 @@ onMounted(async () => {
<div <div
v-for="person in participants" v-for="person in participants"
:key="person.user_id" :key="person.user_id"
data-cy="person" :data-cy="`person-${person.user_id}`"
class="flex flex-col justify-between gap-4 border-b p-2 last:border-b-0 md:flex-row md:items-center md:justify-between md:gap-16" class="flex flex-col justify-between gap-4 border-b p-2 last:border-b-0 md:flex-row md:items-center md:justify-between md:gap-16"
> >
<div class="w-full flex-auto md:w-1/2"> <div class="w-full flex-auto md:w-1/2">

View File

@ -174,7 +174,7 @@ const courseSessionCompetenceAssignments = computed(() => {
:hide-circle-filter="true" :hide-circle-filter="true"
> >
<template #header> <template #header>
<div class="heading-3 border-b px-6 py-4"> <div class="heading-3 border-b px-6 py-4" data-cy="average-grade-header">
{{ $t("a.Durchschnittsnote") }}: {{ totalAverageGrade }} {{ $t("a.Durchschnittsnote") }}: {{ totalAverageGrade }}
</div> </div>
</template> </template>
@ -182,6 +182,7 @@ const courseSessionCompetenceAssignments = computed(() => {
<div <div
v-if="isGroupedAssignmentEntry(item)" v-if="isGroupedAssignmentEntry(item)"
class="flex flex-col justify-between gap-4 border-b last:border-b-0 md:flex-row md:items-center md:justify-between md:gap-16" class="flex flex-col justify-between gap-4 border-b last:border-b-0 md:flex-row md:items-center md:justify-between md:gap-16"
:data-cy="`competence-grade@${item.course_session_id}-${item.competenceCertificateTitle}`"
> >
<div class="w-full flex-auto md:w-1/2"> <div class="w-full flex-auto md:w-1/2">
<span class="text-bold"> <span class="text-bold">

View File

@ -84,7 +84,7 @@ const itemDetailUrl = (item: AssignmentStatisticsRecordType) => {
<template #default="{ item }"> <template #default="{ item }">
<div <div
class="flex justify-between" class="flex justify-between"
:data-cy="(item as AssignmentStatisticsRecordType).assignment_title" :data-cy="`${(item as AssignmentStatisticsRecordType).assignment_title}@${(item as AssignmentStatisticsRecordType).course_session_id}`"
> >
<div> <div>
<h4 class="font-bold"> <h4 class="font-bold">
@ -123,6 +123,7 @@ const itemDetailUrl = (item: AssignmentStatisticsRecordType) => {
<router-link <router-link
class="underline" class="underline"
:to="itemDetailUrl(item as AssignmentStatisticsRecordType)" :to="itemDetailUrl(item as AssignmentStatisticsRecordType)"
data-cy="details-link"
> >
{{ $t("a.Details anschauen") }} {{ $t("a.Details anschauen") }}
</router-link> </router-link>

View File

@ -84,6 +84,7 @@ const route = useRoute();
entry.routeMatch.includes(convertRouteRecordNameToString(record?.name)) entry.routeMatch.includes(convertRouteRecordNameToString(record?.name))
), ),
}" }"
:data-cy="`side-menu-${entry.routeMatch[0]}`"
> >
<span>{{ $t(entry.label) }}</span> <span>{{ $t(entry.label) }}</span>
</router-link> </router-link>

View File

@ -401,6 +401,9 @@ export interface CompetenceCertificateAssignment extends BaseCourseWagtailPage {
| null; | null;
completions: { completions: {
id: string; id: string;
assignment_user: {
id: string;
};
completion_status: AssignmentCompletionStatus; completion_status: AssignmentCompletionStatus;
evaluation_submitted_at: string | null; evaluation_submitted_at: string | null;
evaluation_points: number | null; evaluation_points: number | null;

View File

@ -0,0 +1,155 @@
import { login } from "../helpers";
import {
TEST_COURSE_SESSION_ZURICH_ID,
TEST_STUDENT1_USER_ID,
TEST_STUDENT1_VV_USER_ID,
TEST_STUDENT2_USER_ID,
} from "../../consts";
function selectDropboxItem(dropboxSelector, item) {
cy.get(dropboxSelector).click();
cy.get(dropboxSelector).contains(item).click();
}
describe("berufsbildner.cy.js", () => {
beforeEach(() => {
cy.manageCommand(
`cypress_reset --create-assignment-evaluation --assignment-evaluation-scores 4,6,4,3,2 --assignment-points-deducted 3 --create-edoniq-test-results 19 24 8 --edoniq-user-id ${TEST_STUDENT2_USER_ID} --edoniq-course-session-id ${TEST_COURSE_SESSION_ZURICH_ID}`,
);
});
it("check data on dashboard", () => {
login("test-berufsbildner1@example.com", "test");
cy.visit("/");
cy.get('[data-cy="panel-role-key"]').should("contain", "Berufsbildner");
cy.get('[data-cy="num-dashboard-persons"]').should("contain", "3 Personen");
cy.get('[data-cy="dashboard.stats.competenceGrades"]').should(
"contain",
"3.81",
);
cy.get('[data-cy="dashboard.stats.assignments"]').should("contain", "17%");
cy.get('[data-cy="dashboard.stats.assignments"]').should(
"contain",
"2 Elemente abgeschlossen",
);
cy.get('[data-cy="dashboard.mentor.menteeCountValue"]').should(
"contain",
"3",
);
});
it("check competence grades with subpages", () => {
login("test-berufsbildner1@example.com", "test");
cy.visit("/");
cy.get(
'[data-cy="dashboard.stats.competenceGrades"] [data-cy="basebox.detailsLink"]',
).click();
// check average grade filtered by dropbox selects
cy.get('[data-cy="average-grade-header"]').should("contain", "3.81");
selectDropboxItem('[data-cy="select-session"]', "Bern");
cy.get('[data-cy="average-grade-header"]').should("contain", "4.33");
selectDropboxItem('[data-cy="select-session"]', "Zürich");
cy.get('[data-cy="average-grade-header"]').should("contain", "3.29");
selectDropboxItem('[data-cy="select-session"]', "Alle");
cy.get('[data-cy="average-grade-header"]').should("contain", "3.81");
// go to competence certificate detail page
cy.get(
'[data-cy="competence-grade@-1-Kompetenznachweis 1"] [data-cy="basebox.detailsLink"]',
).click();
cy.get('[data-cy="total-average-grade"]').should("contain", "4.33");
cy.get(`[data-cy="person-${TEST_STUDENT1_USER_ID}"]`).should(
"contain",
"4.33",
);
cy.get('[data-cy="back-button"]').click();
cy.get(
'[data-cy="competence-grade@-2-Kompetenznachweis 1"] [data-cy="basebox.detailsLink"]',
).click();
cy.get('[data-cy="total-average-grade"]').should("contain", "3.29");
// open student profile link
cy.get(`[data-cy="person-${TEST_STUDENT2_USER_ID}"]`)
.find('[data-cy="person-learning-path-link"]')
.click();
cy.get('[data-cy="profileCompetence"]').click();
cy.get('[data-cy="side-menu-competenceCertificates"]').click();
cy.get('[data-cy="certificate-total-grade"]').should(
"contain",
"Note: 3.5",
);
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]',
).should("contain", "3.29");
});
it("check competence elements with subpages", () => {
login("test-berufsbildner1@example.com", "test");
cy.visit("/");
cy.get(
'[data-cy="dashboard.stats.assignments"] [data-cy="basebox.detailsLink"]',
).click();
// check assignment filter
cy.get('[data-cy="statistics-filter-list-item"]').should("have.length", 4);
selectDropboxItem('[data-cy="select-session"]', "Bern");
cy.get('[data-cy="statistics-filter-list-item"]').should("have.length", 2);
cy.get(
'[data-cy="Überprüfen einer Motorfahrzeugs-Versicherungspolice@-1"]',
).should("contain", "1 von 3 bestanden");
selectDropboxItem('[data-cy="select-session"]', "Zürich");
cy.get('[data-cy="statistics-filter-list-item"]').should("have.length", 2);
cy.get(
'[data-cy="Edoniq Wissens- und Verständisfragen - Circle Fahrzeug (Demo)@-2"]',
).should("contain", "0 von 1 bestanden");
selectDropboxItem('[data-cy="select-session"]', "Alle");
cy.get('[data-cy="statistics-filter-list-item"]').should("have.length", 4);
// check detail values for Student 1
cy.get(
'[data-cy="Überprüfen einer Motorfahrzeugs-Versicherungspolice@-1"] [data-cy="details-link"]',
).click();
cy.get('[data-cy="Student1"]').should("contain", "Bewertung freigegeben");
cy.get('[data-cy="Student1"]').should("contain", "16 von 24 Punkten");
cy.get('[data-cy="Student1"]').should("contain", "67%");
cy.get('[data-cy="Student1"] [data-cy="show-results"]').click();
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]',
).should("contain", "4.5");
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]',
).should("contain", "4.33");
cy.get('[data-cy="back-button"]').click();
cy.get(".heading-2").should(
"contain",
"Überprüfen einer Motorfahrzeug-Versicherungspolice",
);
cy.get('[data-cy="back-button"]').click();
// check detail values for Student 2
cy.get(
'[data-cy="Edoniq Wissens- und Verständisfragen - Circle Fahrzeug (Demo)@-2"] [data-cy="details-link"]',
).click();
cy.get('[data-cy="Student2"]').should("contain", "Bewertung freigegeben");
cy.get('[data-cy="Student2"]').should("contain", "11 von 24 Punkten (46%)");
cy.get('[data-cy="Student2"]').should("contain", "Nicht bestanden");
});
});

View File

@ -1,392 +1,404 @@
import { login } from "../helpers" import { login } from "../helpers";
describe("competenceCertificate.cy.js", () => { describe("competenceCertificate.cy.js", () => {
beforeEach(() => { }) beforeEach(() => {});
it("check without points", () => { it("check without points", () => {
cy.manageCommand("cypress_reset") cy.manageCommand("cypress_reset");
login("test-student1@example.com", "test") login("test-student1@example.com", "test");
cy.visit("/course/test-lehrgang/competence") cy.visit("/course/test-lehrgang/competence");
cy.get('[data-cy="certificate-total-points-text"]').contains( cy.get('[data-cy="certificate-total-points-text"]').contains(
"Der Punktestand wird zu einem späteren Zeitpunkt berechnet." "Der Punktestand wird zu einem späteren Zeitpunkt berechnet.",
) );
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]',
).and("contain", "0 von 2 Kompetenznachweis-Elementen") ).and("contain", "0 von 2 Kompetenznachweis-Elementen");
// check on certificates page // check on certificates page
cy.get('[data-cy="certificates-show-all-button"]').click() cy.get('[data-cy="certificates-show-all-button"]').click();
cy.get('[data-cy="certificate-total-points-text"]').contains( cy.get('[data-cy="certificate-total-points-text"]').contains(
"Der Punktestand wird zu einem späteren Zeitpunkt berechnet." "Der Punktestand wird zu einem späteren Zeitpunkt berechnet.",
) );
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]',
) )
.should( .should(
"contain", "contain",
"Der Punktestand wird zu einem späteren Zeitpunkt berechnet." "Der Punktestand wird zu einem späteren Zeitpunkt berechnet.",
) )
.and("contain", "0 von 2 Kompetenznachweis-Elementen") .and("contain", "0 von 2 Kompetenznachweis-Elementen");
// check certificate detail page // check certificate detail page
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]',
).click() ).click();
cy.get( cy.get(
'[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"]' '[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"]',
).should("contain", "Höchstpunktzahl") ).should("contain", "Höchstpunktzahl");
cy.get( cy.get(
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]' '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]',
).should("contain", "Höchstpunktzahl") ).should("contain", "Höchstpunktzahl");
}) });
it("check with finished passed edoniq test", () => { it("check with finished passed edoniq test", () => {
cy.manageCommand( cy.manageCommand(
"cypress_reset --create-assignment-completion --create-edoniq-test-results 19 24 0" "cypress_reset --create-assignment-completion --create-edoniq-test-results 19 24 0",
) );
login("test-student1@example.com", "test") login("test-student1@example.com", "test");
cy.visit("/course/test-lehrgang/competence") cy.visit("/course/test-lehrgang/competence");
cy.get('[data-cy="certificate-total-points-text"]').contains( cy.get('[data-cy="certificate-total-points-text"]').contains(
"Erfahrungsnote üK: 5" "Erfahrungsnote üK: 5",
) );
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]',
) )
.should("contain", "Note: 5") .should("contain", "Note: 5")
.and("contain", "1 von 2 Kompetenznachweis-Elementen") .and("contain", "1 von 2 Kompetenznachweis-Elementen");
// check on certificates page // check on certificates page
cy.get('[data-cy="certificates-show-all-button"]').click() cy.get('[data-cy="certificates-show-all-button"]').click();
cy.get('[data-cy="certificate-total-points-text"]') cy.get('[data-cy="certificate-total-points-text"]')
.should("contain", "Erfahrungsnote üK") .should("contain", "Erfahrungsnote üK")
.and("contain", "Zwischenstand") .and("contain", "Zwischenstand");
cy.get('[data-cy="certificate-total-grade"]').should("contain", "Note: 5") cy.get('[data-cy="certificate-total-grade"]').should("contain", "Note: 5");
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]',
).should("contain", "Note: 5") ).should("contain", "Note: 5");
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]',
).should("contain", "Ungerundete Note: 4.96") ).should("contain", "Ungerundete Note: 4.96");
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]',
) )
.and("contain", "Zwischenstand") .and("contain", "Zwischenstand")
.and("contain", "1 von 2 Kompetenznachweis-Elementen") .and("contain", "1 von 2 Kompetenznachweis-Elementen");
// check certificate detail page // check certificate detail page
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]',
).click() ).click();
cy.get( cy.get(
'[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"]' '[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"]',
) )
.should("contain", "Höchstpunktzahl") .should("contain", "Höchstpunktzahl")
.and("contain", "Ergebnisse abgegeben") .and("contain", "Ergebnisse abgegeben");
cy.get( cy.get(
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]' '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]',
) )
.should("contain", "19") .should("contain", "19")
.and("contain", "Bewertung freigegeben") .and("contain", "Bewertung freigegeben")
.and("not.contain", "Nicht Bestanden") .and("not.contain", "Nicht Bestanden");
// it can open learning content page directly // it can open learning content page directly
cy.get( cy.get(
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"] [data-cy="open-learning-content"]' '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"] [data-cy="open-learning-content"]',
).click() ).click();
cy.get('[data-cy="test-result"]') cy.get('[data-cy="test-result"]')
.should("contain", "19 von 24 Punkten") .should("contain", "19 von 24 Punkten")
.and("contain", "79%") .and("contain", "79%");
}) });
it("check with finished failed edoniq test", () => { it("check with finished failed edoniq test", () => {
cy.manageCommand( cy.manageCommand(
"cypress_reset --create-assignment-completion --create-edoniq-test-results 10 24 0" "cypress_reset --create-assignment-completion --create-edoniq-test-results 10 24 0",
) );
login("test-student1@example.com", "test") login("test-student1@example.com", "test");
// go to certificate detail page // go to certificate detail page
cy.visit( cy.visit(
"/course/test-lehrgang/competence/certificates/kompetenznachweis-1" "/course/test-lehrgang/competence/certificates/kompetenznachweis-1",
) );
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]',
).should("contain", "Note: 3") ).should("contain", "Note: 3");
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]',
).should("contain", "Ungerundete Note: 3.08") ).should("contain", "Ungerundete Note: 3.08");
cy.get( cy.get(
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]' '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]',
) )
.should("contain", "10") .should("contain", "10")
.and("contain", "Bewertung freigegeben") .and("contain", "Bewertung freigegeben")
.and("contain", "42%") .and("contain", "42%")
.and("contain", "Nicht bestanden") .and("contain", "Nicht bestanden");
// it can open learning content page directly // it can open learning content page directly
cy.get( cy.get(
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"] [data-cy="open-learning-content"]' '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"] [data-cy="open-learning-content"]',
).click() ).click();
cy.get('[data-cy="test-result"]') cy.get('[data-cy="test-result"]')
.should("contain", "10 von 24 Punkten") .should("contain", "10 von 24 Punkten")
.and("contain", "42%") .and("contain", "42%")
.and("contain", "Nicht bestanden") .and("contain", "Nicht bestanden");
}) });
it("check with finished edoniq test and finished casework", () => { it("check with finished edoniq test and finished casework", () => {
cy.manageCommand( cy.manageCommand(
"cypress_reset --create-assignment-evaluation --create-edoniq-test-results 19 24 0" "cypress_reset --create-assignment-evaluation --create-edoniq-test-results 19 24 0",
) );
login("test-student1@example.com", "test") login("test-student1@example.com", "test");
cy.visit("/course/test-lehrgang/competence") cy.visit("/course/test-lehrgang/competence");
cy.get('[data-cy="certificate-total-points-text"]').contains( cy.get('[data-cy="certificate-total-points-text"]').contains(
"Erfahrungsnote üK: 5.5" "Erfahrungsnote üK: 5.5",
) );
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]',
) )
.should("contain", "Note: 5.5") .should("contain", "Note: 5.5")
.and("contain", "2 von 2 Kompetenznachweis-Elementen") .and("contain", "2 von 2 Kompetenznachweis-Elementen");
// check on certificates page // check on certificates page
cy.get('[data-cy="certificates-show-all-button"]').click() cy.get('[data-cy="certificates-show-all-button"]').click();
cy.get('[data-cy="certificate-total-points-text"]') cy.get('[data-cy="certificate-total-points-text"]')
.should("contain", "Erfahrungsnote üK") .should("contain", "Erfahrungsnote üK")
.and("contain", "Note: 5.5") .and("contain", "Note: 5.5")
.and("not.contain", "Zwischenstand") .and("not.contain", "Zwischenstand");
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]',
) )
.and("not.contain", "Zwischenstand") .and("not.contain", "Zwischenstand")
.and("contain", "2 von 2 Kompetenznachweis-Elementen") .and("contain", "2 von 2 Kompetenznachweis-Elementen");
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]',
).should("contain", "Note: 5.5") ).should("contain", "Note: 5.5");
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]',
).should("contain", "Ungerundete Note: 5.48") ).should("contain", "Ungerundete Note: 5.48");
// check certificate detail page // check certificate detail page
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]',
).click() ).click();
cy.get( cy.get(
'[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"]' '[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"]',
) )
.should("contain", "24") .should("contain", "24")
.and("contain", "von 24 Punkten") .and("contain", "von 24 Punkten")
.and("contain", "Bewertung freigegeben") .and("contain", "Bewertung freigegeben");
cy.get( cy.get(
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]' '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]',
) )
.should("contain", "19") .should("contain", "19")
.and("contain", "von 24 Punkten") .and("contain", "von 24 Punkten")
.and("contain", "Bewertung freigegeben") .and("contain", "Bewertung freigegeben");
}) });
it("check with finished edoniq test and finished casework in different course sessions", () => { it("check with finished edoniq test and finished casework in different course sessions", () => {
const TEST_TRAINER2_USER_ID = "299941ae-1e4b-4f45-8180-876c3ad340b4" const TEST_TRAINER2_USER_ID = "299941ae-1e4b-4f45-8180-876c3ad340b4";
const TEST_STUDENT2_USER_ID = "19c40d94-15cc-4198-aaad-ef707c4b0900" const TEST_STUDENT2_USER_ID = "19c40d94-15cc-4198-aaad-ef707c4b0900";
const TEST_COURSE_SESSION_ZURICH_ID = -2 const TEST_COURSE_SESSION_ZURICH_ID = -2;
cy.manageCommand( cy.manageCommand(
`cypress_reset --create-assignment-evaluation --assignment-evaluation-user-id ${TEST_TRAINER2_USER_ID} --assignment-completion-user-id ${TEST_STUDENT2_USER_ID} --edoniq-user-id ${TEST_STUDENT2_USER_ID} --edoniq-course-session-id '${TEST_COURSE_SESSION_ZURICH_ID}' --create-edoniq-test-results 19 24 0` `cypress_reset --create-assignment-evaluation --assignment-evaluation-user-id ${TEST_TRAINER2_USER_ID} --assignment-completion-user-id ${TEST_STUDENT2_USER_ID} --edoniq-user-id ${TEST_STUDENT2_USER_ID} --edoniq-course-session-id '${TEST_COURSE_SESSION_ZURICH_ID}' --create-edoniq-test-results 19 24 0`,
) );
login("test-student2@example.com", "test") login("test-student2@example.com", "test");
cy.visit("/course/test-lehrgang/competence") cy.visit("/course/test-lehrgang/competence");
cy.get('[data-cy="certificate-total-points-text"]').contains( cy.get('[data-cy="certificate-total-points-text"]').contains(
"Erfahrungsnote üK: 5.5" "Erfahrungsnote üK: 5.5",
) );
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]',
) )
.should("contain", "Note: 5.5") .should("contain", "Note: 5.5")
.and("contain", "2 von 2 Kompetenznachweis-Elementen") .and("contain", "2 von 2 Kompetenznachweis-Elementen");
// check on certificates page // check on certificates page
cy.get('[data-cy="certificates-show-all-button"]').click() cy.get('[data-cy="certificates-show-all-button"]').click();
cy.get('[data-cy="certificate-total-points-text"]') cy.get('[data-cy="certificate-total-points-text"]')
.should("contain", "Erfahrungsnote üK") .should("contain", "Erfahrungsnote üK")
.and("contain", "Note: 5.5") .and("contain", "Note: 5.5")
.and("not.contain", "Zwischenstand") .and("not.contain", "Zwischenstand");
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]',
) )
.and("not.contain", "Zwischenstand") .and("not.contain", "Zwischenstand")
.and("contain", "2 von 2 Kompetenznachweis-Elementen") .and("contain", "2 von 2 Kompetenznachweis-Elementen");
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]',
).should("contain", "Note: 5.5") ).should("contain", "Note: 5.5");
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]',
).should("contain", "Ungerundete Note: 5.48") ).should("contain", "Ungerundete Note: 5.48");
// check certificate detail page // check certificate detail page
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]',
).click() ).click();
cy.get( cy.get(
'[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"]' '[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"]',
) )
.should("contain", "24") .should("contain", "24")
.and("contain", "von 24 Punkten") .and("contain", "von 24 Punkten")
.and("contain", "Bewertung freigegeben") .and("contain", "Bewertung freigegeben");
cy.get( cy.get(
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]' '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]',
) )
.should("contain", "19") .should("contain", "19")
.and("contain", "von 24 Punkten") .and("contain", "von 24 Punkten")
.and("contain", "Bewertung freigegeben") .and("contain", "Bewertung freigegeben");
cy.get('[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice-course-session"]').should("contain", "Test Bern 2022 a")
cy.get('[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo-course-session"]').should("contain", "Test Zürich 2022 a")
})
it("check show assignment in different course session", () => {
const TEST_TRAINER2_USER_ID = "299941ae-1e4b-4f45-8180-876c3ad340b4"
const TEST_STUDENT2_USER_ID = "19c40d94-15cc-4198-aaad-ef707c4b0900"
const TEST_COURSE_SESSION_ZURICH_ID = -2
cy.manageCommand(
`cypress_reset --create-assignment-evaluation --assignment-evaluation-user-id ${TEST_TRAINER2_USER_ID} --assignment-completion-user-id ${TEST_STUDENT2_USER_ID} --edoniq-user-id ${TEST_STUDENT2_USER_ID} --edoniq-course-session-id '${TEST_COURSE_SESSION_ZURICH_ID}' --create-edoniq-test-results 19 24 0`
)
login("test-student2@example.com", "test")
cy.visit("course/test-lehrgang/competence/certificates/kompetenznachweis-1")
cy.get('[data-cy="current-course-session-title"]').should("contain", "Test Bern 2022 a")
cy.get( cy.get(
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"] [data-cy="open-learning-content"]' '[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice-course-session"]',
).click() ).should("contain", "Test Bern 2022 a");
cy.get(
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo-course-session"]',
).should("contain", "Test Zürich 2022 a");
});
cy.get('[data-cy="current-course-session-title"]').should("contain", "Test Zürich 2022 a") it("check show assignment in different course session", () => {
}) const TEST_TRAINER2_USER_ID = "299941ae-1e4b-4f45-8180-876c3ad340b4";
const TEST_STUDENT2_USER_ID = "19c40d94-15cc-4198-aaad-ef707c4b0900";
const TEST_COURSE_SESSION_ZURICH_ID = -2;
cy.manageCommand(
`cypress_reset --create-assignment-evaluation --assignment-evaluation-user-id ${TEST_TRAINER2_USER_ID} --assignment-completion-user-id ${TEST_STUDENT2_USER_ID} --edoniq-user-id ${TEST_STUDENT2_USER_ID} --edoniq-course-session-id '${TEST_COURSE_SESSION_ZURICH_ID}' --create-edoniq-test-results 19 24 0`,
);
login("test-student2@example.com", "test");
cy.visit(
"course/test-lehrgang/competence/certificates/kompetenznachweis-1",
);
cy.get('[data-cy="current-course-session-title"]').should(
"contain",
"Test Bern 2022 a",
);
cy.get(
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"] [data-cy="open-learning-content"]',
).click();
cy.get('[data-cy="current-course-session-title"]').should(
"contain",
"Test Zürich 2022 a",
);
});
it("check with finished edoniq test with deducted points", () => { it("check with finished edoniq test with deducted points", () => {
cy.manageCommand( cy.manageCommand(
"cypress_reset --create-assignment-completion --create-edoniq-test-results 19 24 8" "cypress_reset --create-assignment-completion --create-edoniq-test-results 19 24 8",
) );
login("test-student1@example.com", "test") login("test-student1@example.com", "test");
// go to certificate detail page // go to certificate detail page
cy.visit( cy.visit(
"/course/test-lehrgang/competence/certificates/kompetenznachweis-1" "/course/test-lehrgang/competence/certificates/kompetenznachweis-1",
) );
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]',
).should("contain", "Note: 3.5") ).should("contain", "Note: 3.5");
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]',
).should("contain", "Ungerundete Note: 3.29") ).should("contain", "Ungerundete Note: 3.29");
cy.get( cy.get(
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]' '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]',
) )
.should("contain", "11") .should("contain", "11")
.and("contain", "Bewertung freigegeben") .and("contain", "Bewertung freigegeben")
.and("contain", "46%") .and("contain", "46%")
.and("contain", "mit Abzug") .and("contain", "mit Abzug")
.and("contain", "Nicht bestanden") .and("contain", "Nicht bestanden");
// it can open learning content page directly // it can open learning content page directly
cy.get( cy.get(
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"] [data-cy="open-learning-content"]' '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"] [data-cy="open-learning-content"]',
).click() ).click();
cy.get('[data-cy="test-result"]') cy.get('[data-cy="test-result"]')
.should("contain", "11 von 24 Punkten") .should("contain", "11 von 24 Punkten")
.and("contain", "46%") .and("contain", "46%")
.and("contain", "Punkte aus Bewertung: 19") .and("contain", "Punkte aus Bewertung: 19")
.and("contain", "Abgezogene Punkte: 8") .and("contain", "Abgezogene Punkte: 8")
.and("contain", "Grund: Edoniq Punkteabzug Test") .and("contain", "Grund: Edoniq Punkteabzug Test")
.and("contain", "Nicht bestanden") .and("contain", "Nicht bestanden");
}) });
it("check with finished casework and points deducted", () => { it("check with finished casework and points deducted", () => {
cy.manageCommand( cy.manageCommand(
"cypress_reset --create-assignment-evaluation --assignment-evaluation-scores 4,6,4,3,2 --assignment-points-deducted 5" "cypress_reset --create-assignment-evaluation --assignment-evaluation-scores 4,6,4,3,2 --assignment-points-deducted 5",
) );
login("test-student1@example.com", "test") login("test-student1@example.com", "test");
cy.visit("/course/test-lehrgang/competence") cy.visit("/course/test-lehrgang/competence");
cy.get('[data-cy="certificate-total-points-text"]').contains( cy.get('[data-cy="certificate-total-points-text"]').contains(
"Erfahrungsnote üK: 4" "Erfahrungsnote üK: 4",
) );
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]',
) )
.should("contain", "Note: 4") .should("contain", "Note: 4")
.and("contain", "1 von 2 Kompetenznachweis-Elementen") .and("contain", "1 von 2 Kompetenznachweis-Elementen");
// check on certificates page // check on certificates page
cy.get('[data-cy="certificates-show-all-button"]').click() cy.get('[data-cy="certificates-show-all-button"]').click();
cy.get('[data-cy="certificate-total-points-text"]') cy.get('[data-cy="certificate-total-points-text"]')
.should("contain", "Erfahrungsnote üK") .should("contain", "Erfahrungsnote üK")
.and("contain", "Note: 4") .and("contain", "Note: 4")
.and("contain", "Zwischenstand") .and("contain", "Zwischenstand");
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]',
) )
.and("contain", "Zwischenstand") .and("contain", "Zwischenstand")
.and("contain", "1 von 2 Kompetenznachweis-Elementen") .and("contain", "1 von 2 Kompetenznachweis-Elementen");
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]',
).should("contain", "Note: 4") ).should("contain", "Note: 4");
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]',
).should("contain", "Ungerundete Note: 3.92") ).should("contain", "Ungerundete Note: 3.92");
// check certificate detail page // check certificate detail page
cy.get( cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]' '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]',
).click() ).click();
cy.get( cy.get(
'[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"]' '[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"]',
) )
.should("contain", "14") .should("contain", "14")
.and("contain", "von 24 Punkten") .and("contain", "von 24 Punkten")
.and("contain", "58%") .and("contain", "58%")
.and("contain", "mit Abzug") .and("contain", "mit Abzug")
.and("contain", "Bewertung freigegeben") .and("contain", "Bewertung freigegeben");
cy.get( cy.get(
'[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"] [data-cy="open-learning-content"]' '[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"] [data-cy="open-learning-content"]',
).click() ).click();
cy.get('[data-cy="user-points"]').should("contain", "14") cy.get('[data-cy="user-points"]').should("contain", "14");
cy.get('[data-cy="total-points"]').should( cy.get('[data-cy="total-points"]').should(
"contain", "contain",
"von 24 Punkten (58%)" "von 24 Punkten (58%)",
) );
cy.get('[data-cy="points-deducted"]') cy.get('[data-cy="points-deducted"]')
.should("contain", "Punkte aus Bewertung: 19") .should("contain", "Punkte aus Bewertung: 19")
.and("contain", "Abgezogene Punkte: 5") .and("contain", "Abgezogene Punkte: 5")
.and("contain", "Grund: Assignment Punkteabzug Test") .and("contain", "Grund: Assignment Punkteabzug Test");
}) });
it("should display link to details", () => { it("should display link to details", () => {
cy.manageCommand("cypress_reset") cy.manageCommand("cypress_reset");
login("test-student1@example.com", "test") login("test-student1@example.com", "test");
cy.visit("/course/test-lehrgang/competence/self-evaluation-and-feedback") cy.visit("/course/test-lehrgang/competence/self-evaluation-and-feedback");
cy.get('[data-cy^="self-eval-"][data-cy$="-detail-url"]:first').contains( cy.get('[data-cy^="self-eval-"][data-cy$="-detail-url"]:first').contains(
"Selbsteinschätzung anschauen" "Selbsteinschätzung anschauen",
) );
}) });
}) });

View File

@ -123,11 +123,11 @@ describe("dashboardSupervisor.cy.js", () => {
'[data-cy="dashboard.stats.assignments"] [data-cy="basebox.detailsLink"]' '[data-cy="dashboard.stats.assignments"] [data-cy="basebox.detailsLink"]'
).click(); ).click();
cy.get( cy.get(
'[data-cy="Edoniq Wissens- und Verständisfragen - Circle Fahrzeug (Demo)"]' '[data-cy="Edoniq Wissens- und Verständisfragen - Circle Fahrzeug (Demo)@-1"]'
).should("contain", "0 von 3 bestanden"); ).should("contain", "0 von 3 bestanden");
cy.get( cy.get(
'[data-cy="Überprüfen einer Motorfahrzeugs-Versicherungspolice"]' '[data-cy="Überprüfen einer Motorfahrzeugs-Versicherungspolice@-1"]'
).should("contain", "0 von 3 bestanden"); ).should("contain", "0 von 3 bestanden");
}); });
}); });

View File

@ -14,29 +14,29 @@ describe("dueDates.cy.js", () => {
}); });
it("can filter due dates by dropbox selects", () => { it("can filter due dates by dropbox selects", () => {
cy.get('[data-cy="due-date-list"]').children().should("have.length", 7); cy.get('[data-cy="due-date-list"]').children().should("have.length", 10);
// can filter by session // can filter by session
selectDropboxItem('[data-cy="select-session"]', "Zürich"); selectDropboxItem('[data-cy="select-session"]', "Zürich");
cy.get('[data-cy="due-date-list"]').children().should("have.length", 1); cy.get('[data-cy="due-date-list"]').children().should("have.length", 4);
selectDropboxItem('[data-cy="select-session"]', "Bern"); selectDropboxItem('[data-cy="select-session"]', "Bern");
cy.get('[data-cy="due-date-list"]').children().should("have.length", 6); cy.get('[data-cy="due-date-list"]').children().should("have.length", 6);
selectDropboxItem('[data-cy="select-session"]', "Alle"); selectDropboxItem('[data-cy="select-session"]', "Alle");
cy.get('[data-cy="due-date-list"]').children().should("have.length", 7); cy.get('[data-cy="due-date-list"]').children().should("have.length", 10);
// can filter by circle // can filter by circle
selectDropboxItem('[data-cy="select-circle"]', "Fahrzeug"); selectDropboxItem('[data-cy="select-circle"]', "Fahrzeug");
cy.get('[data-cy="due-date-list"]').children().should("have.length", 6); cy.get('[data-cy="due-date-list"]').children().should("have.length", 9);
selectDropboxItem('[data-cy="select-circle"]', "Reisen"); selectDropboxItem('[data-cy="select-circle"]', "Reisen");
cy.get('[data-cy="due-date-list"]').children().should("have.length", 1); cy.get('[data-cy="due-date-list"]').children().should("have.length", 1);
selectDropboxItem('[data-cy="select-circle"]', "Alle"); selectDropboxItem('[data-cy="select-circle"]', "Alle");
cy.get('[data-cy="due-date-list"]').children().should("have.length", 7); cy.get('[data-cy="due-date-list"]').children().should("have.length", 10);
// can filter by types // can filter by types
selectDropboxItem('[data-cy="select-type"]', "Präsenzkurs"); selectDropboxItem('[data-cy="select-type"]', "Präsenzkurs");
cy.get('[data-cy="due-date-list"]').children().should("have.length", 3); cy.get('[data-cy="due-date-list"]').children().should("have.length", 3);
selectDropboxItem('[data-cy="select-type"]', "Bewertung"); selectDropboxItem('[data-cy="select-type"]', "Bewertung");
cy.get('[data-cy="due-date-list"]').children().should("have.length", 1); cy.get('[data-cy="due-date-list"]').children().should("have.length", 2);
// combination // combination
selectDropboxItem('[data-cy="select-session"]', "Bern"); selectDropboxItem('[data-cy="select-session"]', "Bern");
@ -44,7 +44,7 @@ describe("dueDates.cy.js", () => {
cy.get('[data-cy="due-date-list"]').children().should("have.length", 2); cy.get('[data-cy="due-date-list"]').children().should("have.length", 2);
selectDropboxItem('[data-cy="select-session"]', "Zürich"); selectDropboxItem('[data-cy="select-session"]', "Zürich");
cy.get('[data-cy="due-date-list"]').children().should("have.length", 1); cy.get('[data-cy="due-date-list"]').children().should("have.length", 1);
selectDropboxItem('[data-cy="select-type"]', "Bewertung"); selectDropboxItem('[data-cy="select-type"]', "Abgabetermin Vorbereitungsauftrag");
cy.get('[data-cy="due-date-list"]').should("contain", "Keine Termine"); cy.get('[data-cy="due-date-list"]').should("contain", "Keine Termine");
}); });
}); });

View File

@ -1,7 +1,9 @@
from dataclasses import dataclass from dataclasses import dataclass
from datetime import datetime
from io import BytesIO from io import BytesIO
import structlog import structlog
from django.utils import timezone
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from openpyxl import Workbook from openpyxl import Workbook
@ -34,7 +36,8 @@ COMPETENCE_ELEMENT_EXPORT_FILE_NAME = _("export_kompetenznachweis_elemente")
@dataclass @dataclass
class CompetenceCertificateElement: class CompetenceCertificateElement:
assignment: Assignment assignment: Assignment
date: DueDate # date: DueDate
sort_datetime: datetime
learning_content: LearningContent learning_content: LearningContent
course_session: CourseSession course_session: CourseSession
@ -227,7 +230,7 @@ def _get_competence_certificate_elements(
cse = [ cse = [
CompetenceCertificateElement( CompetenceCertificateElement(
assignment=csa.learning_content.content_assignment, assignment=csa.learning_content.content_assignment,
date=csa.submission_deadline, sort_datetime=csa.submission_deadline.start or timezone.now(),
learning_content=csa.learning_content, learning_content=csa.learning_content,
course_session=csa.course_session, course_session=csa.course_session,
) )
@ -237,7 +240,7 @@ def _get_competence_certificate_elements(
cse += [ cse += [
CompetenceCertificateElement( CompetenceCertificateElement(
assignment=cset.learning_content.content_assignment, assignment=cset.learning_content.content_assignment,
date=cset.deadline, sort_datetime=cset.deadline.start or timezone.now(),
learning_content=cset.learning_content, learning_content=cset.learning_content,
course_session=cset.course_session, course_session=cset.course_session,
) )
@ -245,6 +248,6 @@ def _get_competence_certificate_elements(
] ]
# order by course_session and submission_deadline # order by course_session and submission_deadline
cse.sort(key=lambda x: (x.course_session.title, x.date.start)) cse.sort(key=lambda x: (x.course_session.title, x.sort_datetime))
return cse return cse

View File

@ -25,6 +25,7 @@ TEST_STUDENT1_USER_ID = "65c73ad0-6d53-43a9-a4a4-64143f27b03a"
TEST_STUDENT2_USER_ID = "19c40d94-15cc-4198-aaad-ef707c4b0900" TEST_STUDENT2_USER_ID = "19c40d94-15cc-4198-aaad-ef707c4b0900"
TEST_STUDENT3_USER_ID = "bcf94dba-53bc-474b-a22d-e4af39aa042b" TEST_STUDENT3_USER_ID = "bcf94dba-53bc-474b-a22d-e4af39aa042b"
TEST_MENTOR1_USER_ID = "d1f5f5a9-5b0a-4e1a-9e1a-9e9b5b5e1b1b" TEST_MENTOR1_USER_ID = "d1f5f5a9-5b0a-4e1a-9e1a-9e9b5b5e1b1b"
TEST_BERUFSBILDNER1_USER_ID = "bb83dde0-27e7-4859-8acb-a323025d712c"
TEST_STUDENT1_VV_USER_ID = "5ff59857-8de5-415e-a387-4449f9a0337a" TEST_STUDENT1_VV_USER_ID = "5ff59857-8de5-415e-a387-4449f9a0337a"
TEST_STUDENT2_VV_AND_VV_MENTOR_USER_ID = "7e8ebf0b-e6e2-4022-88f4-6e663ba0a9db" TEST_STUDENT2_VV_AND_VV_MENTOR_USER_ID = "7e8ebf0b-e6e2-4022-88f4-6e663ba0a9db"
TEST_USER_EMPTY_ID = "daecbabe-4ab9-4edf-a71f-4119042ccb02" TEST_USER_EMPTY_ID = "daecbabe-4ab9-4edf-a71f-4119042ccb02"

View File

@ -12,6 +12,7 @@ env.read_env()
from vbv_lernwelt.core.constants import ( from vbv_lernwelt.core.constants import (
ADMIN_USER_ID, ADMIN_USER_ID,
TEST_BERUFSBILDNER1_USER_ID,
TEST_MENTOR1_USER_ID, TEST_MENTOR1_USER_ID,
TEST_STUDENT1_USER_ID, TEST_STUDENT1_USER_ID,
TEST_STUDENT1_VV_USER_ID, TEST_STUDENT1_VV_USER_ID,
@ -410,6 +411,15 @@ def create_default_users(default_password="test", set_avatar=False):
language="de", language="de",
avatar_image="uk1.patrizia.huggel.jpg", avatar_image="uk1.patrizia.huggel.jpg",
) )
_create_user(
_id=TEST_BERUFSBILDNER1_USER_ID,
email="test-berufsbildner1@example.com",
first_name="Ursina",
last_name="Meier-Bildner",
password=default_password,
language="de",
avatar_image="uk1.patrizia.huggel.jpg",
)
_create_student_user( _create_student_user(
id=TEST_STUDENT2_VV_AND_VV_MENTOR_USER_ID, id=TEST_STUDENT2_VV_AND_VV_MENTOR_USER_ID,
email="test-student-and-mentor2@example.com", email="test-student-and-mentor2@example.com",

View File

@ -189,7 +189,7 @@ def command(
SelfEvaluationFeedback.objects.all().delete() SelfEvaluationFeedback.objects.all().delete()
CourseCompletionFeedback.objects.all().delete() CourseCompletionFeedback.objects.all().delete()
AgentParticipantRelation.objects.all().delete() AgentParticipantRelation.objects.filter(role="LEARNING_MENTOR").delete()
# LearningMentor.objects.all().delete() # LearningMentor.objects.all().delete()
MentorInvitation.objects.all().delete() MentorInvitation.objects.all().delete()
User.objects.all().update(organisation=Organisation.objects.first()) User.objects.all().update(organisation=Organisation.objects.first())

View File

@ -34,6 +34,7 @@ from vbv_lernwelt.competence.factories import (
) )
from vbv_lernwelt.competence.models import ActionCompetence from vbv_lernwelt.competence.models import ActionCompetence
from vbv_lernwelt.core.constants import ( from vbv_lernwelt.core.constants import (
TEST_BERUFSBILDNER1_USER_ID,
TEST_COURSE_SESSION_BERN_ID, TEST_COURSE_SESSION_BERN_ID,
TEST_COURSE_SESSION_ZURICH_ID, TEST_COURSE_SESSION_ZURICH_ID,
TEST_STUDENT1_USER_ID, TEST_STUDENT1_USER_ID,
@ -62,6 +63,7 @@ from vbv_lernwelt.course_session.models import (
) )
from vbv_lernwelt.course_session_group.models import CourseSessionGroup from vbv_lernwelt.course_session_group.models import CourseSessionGroup
from vbv_lernwelt.feedback.services import update_feedback_response from vbv_lernwelt.feedback.services import update_feedback_response
from vbv_lernwelt.learning_mentor.models import AgentParticipantRelation
from vbv_lernwelt.learnpath.models import ( from vbv_lernwelt.learnpath.models import (
Circle, Circle,
LearningContentAssignment, LearningContentAssignment,
@ -158,6 +160,14 @@ def create_test_course(
id=TEST_COURSE_SESSION_BERN_ID, id=TEST_COURSE_SESSION_BERN_ID,
start_date=now, start_date=now,
) )
cs_zurich = CourseSession.objects.create(
course_id=COURSE_TEST_ID,
title="Test Zürich 2022 a",
import_id="Test Zürich 2022 a",
id=TEST_COURSE_SESSION_ZURICH_ID,
start_date=now,
)
csac = CourseSessionAttendanceCourse.objects.create( csac = CourseSessionAttendanceCourse.objects.create(
course_session=cs_bern, course_session=cs_bern,
learning_content=LearningContentAttendanceCourse.objects.get( learning_content=LearningContentAttendanceCourse.objects.get(
@ -201,25 +211,26 @@ def create_test_course(
) )
csac.due_date.save() csac.due_date.save()
csa = CourseSessionAssignment.objects.create( for course_session in [cs_bern, cs_zurich]:
course_session=cs_bern, csa = CourseSessionAssignment.objects.create(
learning_content=LearningContentAssignment.objects.get( course_session=course_session,
slug=f"{course.slug}-lp-circle-fahrzeug-lc-überprüfen-einer-motorfahrzeug-versicherungspolice" learning_content=LearningContentAssignment.objects.get(
), slug=f"{course.slug}-lp-circle-fahrzeug-lc-überprüfen-einer-motorfahrzeug-versicherungspolice"
) ),
next_thursday = datetime.now() + relativedelta(weekday=TH(2))
csa.submission_deadline.start = timezone.make_aware(
(next_thursday + relativedelta(weeks=3)).replace(
hour=23, minute=59, second=59, microsecond=0
) )
) next_thursday = datetime.now() + relativedelta(weekday=TH(2))
csa.submission_deadline.save() csa.submission_deadline.start = timezone.make_aware(
csa.evaluation_deadline.start = timezone.make_aware( (next_thursday + relativedelta(weeks=3)).replace(
(next_thursday + relativedelta(weeks=5)).replace( hour=23, minute=59, second=59, microsecond=0
hour=23, minute=59, second=59, microsecond=0 )
) )
) csa.submission_deadline.save()
csa.evaluation_deadline.save() csa.evaluation_deadline.start = timezone.make_aware(
(next_thursday + relativedelta(weeks=5)).replace(
hour=23, minute=59, second=59, microsecond=0
)
)
csa.evaluation_deadline.save()
csa = CourseSessionAssignment.objects.create( csa = CourseSessionAssignment.objects.create(
course_session=cs_bern, course_session=cs_bern,
@ -235,18 +246,19 @@ def create_test_course(
) )
csa.submission_deadline.save() csa.submission_deadline.save()
cset = CourseSessionEdoniqTest.objects.create( for course_session in [cs_bern, cs_zurich]:
course_session=cs_bern, cset = CourseSessionEdoniqTest.objects.create(
learning_content=LearningContentEdoniqTest.objects.get( course_session=course_session,
slug="test-lehrgang-lp-circle-fahrzeug-lc-wissens-und-verständnisfragen" learning_content=LearningContentEdoniqTest.objects.get(
), slug="test-lehrgang-lp-circle-fahrzeug-lc-wissens-und-verständnisfragen"
) ),
cset.deadline.start = timezone.make_aware(
(next_monday + relativedelta(days=3)).replace(
hour=21, minute=0, second=0, microsecond=0
) )
) cset.deadline.start = timezone.make_aware(
cset.deadline.save() (next_monday + relativedelta(days=3)).replace(
hour=21, minute=0, second=0, microsecond=0
)
)
cset.deadline.save()
if include_vv: if include_vv:
_csa = CourseSessionAssignment.objects.create( _csa = CourseSessionAssignment.objects.create(
@ -256,13 +268,6 @@ def create_test_course(
), ),
) )
cs_zurich = CourseSession.objects.create(
course_id=COURSE_TEST_ID,
title="Test Zürich 2022 a",
import_id="Test Zürich 2022 a",
id=TEST_COURSE_SESSION_ZURICH_ID,
start_date=now,
)
csac = CourseSessionAttendanceCourse.objects.create( csac = CourseSessionAttendanceCourse.objects.create(
course_session=cs_zurich, course_session=cs_zurich,
learning_content=LearningContentAttendanceCourse.objects.get( learning_content=LearningContentAttendanceCourse.objects.get(
@ -322,6 +327,40 @@ def create_test_course(
user=User.objects.get(id=TEST_STUDENT3_USER_ID), user=User.objects.get(id=TEST_STUDENT3_USER_ID),
) )
# add berufsbildner
AgentParticipantRelation.objects.create(
agent=User.objects.get(id=TEST_BERUFSBILDNER1_USER_ID),
participant=CourseSessionUser.objects.get(
user__id=TEST_STUDENT1_USER_ID,
course_session=cs_bern,
),
role="BERUFSBILDNER",
)
AgentParticipantRelation.objects.create(
agent=User.objects.get(id=TEST_BERUFSBILDNER1_USER_ID),
participant=CourseSessionUser.objects.get(
user__id=TEST_STUDENT2_USER_ID,
course_session=cs_bern,
),
role="BERUFSBILDNER",
)
AgentParticipantRelation.objects.create(
agent=User.objects.get(id=TEST_BERUFSBILDNER1_USER_ID),
participant=CourseSessionUser.objects.get(
user__id=TEST_STUDENT2_USER_ID,
course_session=cs_zurich,
),
role="BERUFSBILDNER",
)
AgentParticipantRelation.objects.create(
agent=User.objects.get(id=TEST_BERUFSBILDNER1_USER_ID),
participant=CourseSessionUser.objects.get(
user__id=TEST_STUDENT3_USER_ID,
course_session=cs_bern,
),
role="BERUFSBILDNER",
)
return course return course

View File

@ -92,8 +92,8 @@ def create_assignment_summary(
total_failed = sum([m.failed_count for m in completed_metrics]) total_failed = sum([m.failed_count for m in completed_metrics])
total_average_evaluation_percent = ( total_average_evaluation_percent = (
sum([m.average_evaluation_percent for m in completed_metrics]) / completed_count sum([m.average_evaluation_percent for m in completed_metrics]) or 0
) ) / (completed_count or 1)
return AssignmentStatisticsSummaryType( return AssignmentStatisticsSummaryType(
_id=urql_id, # noqa _id=urql_id, # noqa

View File

@ -57,7 +57,8 @@ class CourseSessionUserTests(TestCase):
self.csu1_student1.delete() self.csu1_student1.delete()
self.assertEqual(mock_remove_roles_from_user.call_count, 1) # course_session_user and agent_participant_relation will call signal
self.assertEqual(mock_remove_roles_from_user.call_count, 2)
mock_remove_roles_from_user.assert_called_with( mock_remove_roles_from_user.assert_called_with(
self.student1, [(self.csu1_student1.course_session.course.slug, "MEMBER")] self.student1, [(self.csu1_student1.course_session.course.slug, "MEMBER")]
@ -67,7 +68,9 @@ class CourseSessionUserTests(TestCase):
def test_dont_remove_roles_for_multiple_roles_in_cs( def test_dont_remove_roles_for_multiple_roles_in_cs(
self, mock_remove_roles_from_user self, mock_remove_roles_from_user
): ):
AgentParticipantRelation.objects.filter(participant=self.csu1_student2).delete()
mock_remove_roles_from_user.return_value = None mock_remove_roles_from_user.return_value = None
mock_remove_roles_from_user.reset_mock()
self.csu1_student2.delete() self.csu1_student2.delete()