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 h-[74px] items-center justify-center py-1 pr-3 text-3xl font-bold"
data-cy="dashboard.mentor.menteeCountValue"
>
<span>{{ menteeCount }}</span>
</div>

View File

@ -37,10 +37,13 @@ onMounted(async () => {
});
const averageGrade = computed(() => {
return percentToRoundedGrade(
assignmentStats.value?.summary.average_evaluation_percent ?? 0,
false
);
if (assignmentStats.value?.summary.average_evaluation_percent) {
return percentToRoundedGrade(
assignmentStats.value?.summary.average_evaluation_percent ?? 0,
false
);
}
return null;
});
</script>
@ -59,7 +62,7 @@ const averageGrade = computed(() => {
>
<template #title>{{ $t("a.Kompetenznachweise") }}</template>
<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="heading-2 rounded bg-green-500 p-4"

View File

@ -104,7 +104,7 @@ function hasActionButton(): boolean {
</a>
</div>
<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) }}
</span>
<router-link

View File

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

View File

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

View File

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

View File

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

View File

@ -22,7 +22,9 @@ const displayDueDates = computed(() => {
</div>
<div v-else>
<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>
<router-link class="btn-secondary" to="/dashboard/persons">
{{ $t("a.Alle Personen anzeigen") }}

View File

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

View File

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

View File

@ -174,7 +174,7 @@ const courseSessionCompetenceAssignments = computed(() => {
:hide-circle-filter="true"
>
<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 }}
</div>
</template>
@ -182,6 +182,7 @@ const courseSessionCompetenceAssignments = computed(() => {
<div
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"
:data-cy="`competence-grade@${item.course_session_id}-${item.competenceCertificateTitle}`"
>
<div class="w-full flex-auto md:w-1/2">
<span class="text-bold">

View File

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

View File

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

View File

@ -401,6 +401,9 @@ export interface CompetenceCertificateAssignment extends BaseCourseWagtailPage {
| null;
completions: {
id: string;
assignment_user: {
id: string;
};
completion_status: AssignmentCompletionStatus;
evaluation_submitted_at: string | 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", () => {
beforeEach(() => { })
beforeEach(() => {});
it("check without points", () => {
cy.manageCommand("cypress_reset")
login("test-student1@example.com", "test")
cy.visit("/course/test-lehrgang/competence")
cy.manageCommand("cypress_reset");
login("test-student1@example.com", "test");
cy.visit("/course/test-lehrgang/competence");
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(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]'
).and("contain", "0 von 2 Kompetenznachweis-Elementen")
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]',
).and("contain", "0 von 2 Kompetenznachweis-Elementen");
// 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(
"Der Punktestand wird zu einem späteren Zeitpunkt berechnet."
)
"Der Punktestand wird zu einem späteren Zeitpunkt berechnet.",
);
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]'
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]',
)
.should(
"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
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]'
).click()
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]',
).click();
cy.get(
'[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"]'
).should("contain", "Höchstpunktzahl")
'[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"]',
).should("contain", "Höchstpunktzahl");
cy.get(
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]'
).should("contain", "Höchstpunktzahl")
})
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]',
).should("contain", "Höchstpunktzahl");
});
it("check with finished passed edoniq test", () => {
cy.manageCommand(
"cypress_reset --create-assignment-completion --create-edoniq-test-results 19 24 0"
)
login("test-student1@example.com", "test")
cy.visit("/course/test-lehrgang/competence")
"cypress_reset --create-assignment-completion --create-edoniq-test-results 19 24 0",
);
login("test-student1@example.com", "test");
cy.visit("/course/test-lehrgang/competence");
cy.get('[data-cy="certificate-total-points-text"]').contains(
"Erfahrungsnote üK: 5"
)
"Erfahrungsnote üK: 5",
);
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]'
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]',
)
.should("contain", "Note: 5")
.and("contain", "1 von 2 Kompetenznachweis-Elementen")
.and("contain", "1 von 2 Kompetenznachweis-Elementen");
// 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"]')
.should("contain", "Erfahrungsnote üK")
.and("contain", "Zwischenstand")
cy.get('[data-cy="certificate-total-grade"]').should("contain", "Note: 5")
.and("contain", "Zwischenstand");
cy.get('[data-cy="certificate-total-grade"]').should("contain", "Note: 5");
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]'
).should("contain", "Note: 5")
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]',
).should("contain", "Note: 5");
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]'
).should("contain", "Ungerundete Note: 4.96")
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]',
).should("contain", "Ungerundete Note: 4.96");
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", "1 von 2 Kompetenznachweis-Elementen")
.and("contain", "1 von 2 Kompetenznachweis-Elementen");
// check certificate detail page
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]'
).click()
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]',
).click();
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")
.and("contain", "Ergebnisse abgegeben")
.and("contain", "Ergebnisse abgegeben");
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")
.and("contain", "Bewertung freigegeben")
.and("not.contain", "Nicht Bestanden")
.and("not.contain", "Nicht Bestanden");
// it can open learning content page directly
cy.get(
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"] [data-cy="open-learning-content"]'
).click()
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"] [data-cy="open-learning-content"]',
).click();
cy.get('[data-cy="test-result"]')
.should("contain", "19 von 24 Punkten")
.and("contain", "79%")
})
.and("contain", "79%");
});
it("check with finished failed edoniq test", () => {
cy.manageCommand(
"cypress_reset --create-assignment-completion --create-edoniq-test-results 10 24 0"
)
login("test-student1@example.com", "test")
"cypress_reset --create-assignment-completion --create-edoniq-test-results 10 24 0",
);
login("test-student1@example.com", "test");
// go to certificate detail page
cy.visit(
"/course/test-lehrgang/competence/certificates/kompetenznachweis-1"
)
"/course/test-lehrgang/competence/certificates/kompetenznachweis-1",
);
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]'
).should("contain", "Note: 3")
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]',
).should("contain", "Note: 3");
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]'
).should("contain", "Ungerundete Note: 3.08")
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]',
).should("contain", "Ungerundete Note: 3.08");
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")
.and("contain", "Bewertung freigegeben")
.and("contain", "42%")
.and("contain", "Nicht bestanden")
.and("contain", "Nicht bestanden");
// it can open learning content page directly
cy.get(
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"] [data-cy="open-learning-content"]'
).click()
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"] [data-cy="open-learning-content"]',
).click();
cy.get('[data-cy="test-result"]')
.should("contain", "10 von 24 Punkten")
.and("contain", "42%")
.and("contain", "Nicht bestanden")
})
.and("contain", "Nicht bestanden");
});
it("check with finished edoniq test and finished casework", () => {
cy.manageCommand(
"cypress_reset --create-assignment-evaluation --create-edoniq-test-results 19 24 0"
)
login("test-student1@example.com", "test")
cy.visit("/course/test-lehrgang/competence")
"cypress_reset --create-assignment-evaluation --create-edoniq-test-results 19 24 0",
);
login("test-student1@example.com", "test");
cy.visit("/course/test-lehrgang/competence");
cy.get('[data-cy="certificate-total-points-text"]').contains(
"Erfahrungsnote üK: 5.5"
)
"Erfahrungsnote üK: 5.5",
);
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")
.and("contain", "2 von 2 Kompetenznachweis-Elementen")
.and("contain", "2 von 2 Kompetenznachweis-Elementen");
// 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"]')
.should("contain", "Erfahrungsnote üK")
.and("contain", "Note: 5.5")
.and("not.contain", "Zwischenstand")
.and("not.contain", "Zwischenstand");
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("contain", "2 von 2 Kompetenznachweis-Elementen")
.and("contain", "2 von 2 Kompetenznachweis-Elementen");
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]'
).should("contain", "Note: 5.5")
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]',
).should("contain", "Note: 5.5");
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]'
).should("contain", "Ungerundete Note: 5.48")
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]',
).should("contain", "Ungerundete Note: 5.48");
// check certificate detail page
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]'
).click()
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]',
).click();
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")
.and("contain", "von 24 Punkten")
.and("contain", "Bewertung freigegeben")
.and("contain", "Bewertung freigegeben");
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")
.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", () => {
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
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")
`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");
cy.get('[data-cy="certificate-total-points-text"]').contains(
"Erfahrungsnote üK: 5.5"
)
"Erfahrungsnote üK: 5.5",
);
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")
.and("contain", "2 von 2 Kompetenznachweis-Elementen")
.and("contain", "2 von 2 Kompetenznachweis-Elementen");
// 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"]')
.should("contain", "Erfahrungsnote üK")
.and("contain", "Note: 5.5")
.and("not.contain", "Zwischenstand")
.and("not.contain", "Zwischenstand");
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("contain", "2 von 2 Kompetenznachweis-Elementen")
.and("contain", "2 von 2 Kompetenznachweis-Elementen");
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]'
).should("contain", "Note: 5.5")
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]',
).should("contain", "Note: 5.5");
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]'
).should("contain", "Ungerundete Note: 5.48")
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]',
).should("contain", "Ungerundete Note: 5.48");
// check certificate detail page
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]'
).click()
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]',
).click();
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")
.and("contain", "von 24 Punkten")
.and("contain", "Bewertung freigegeben")
.and("contain", "Bewertung freigegeben");
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")
.and("contain", "von 24 Punkten")
.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")
.and("contain", "Bewertung freigegeben");
cy.get(
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"] [data-cy="open-learning-content"]'
).click()
'[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");
});
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", () => {
cy.manageCommand(
"cypress_reset --create-assignment-completion --create-edoniq-test-results 19 24 8"
)
login("test-student1@example.com", "test")
"cypress_reset --create-assignment-completion --create-edoniq-test-results 19 24 8",
);
login("test-student1@example.com", "test");
// go to certificate detail page
cy.visit(
"/course/test-lehrgang/competence/certificates/kompetenznachweis-1"
)
"/course/test-lehrgang/competence/certificates/kompetenznachweis-1",
);
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]'
).should("contain", "Note: 3.5")
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]',
).should("contain", "Note: 3.5");
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]'
).should("contain", "Ungerundete Note: 3.29")
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]',
).should("contain", "Ungerundete Note: 3.29");
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")
.and("contain", "Bewertung freigegeben")
.and("contain", "46%")
.and("contain", "mit Abzug")
.and("contain", "Nicht bestanden")
.and("contain", "Nicht bestanden");
// it can open learning content page directly
cy.get(
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"] [data-cy="open-learning-content"]'
).click()
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"] [data-cy="open-learning-content"]',
).click();
cy.get('[data-cy="test-result"]')
.should("contain", "11 von 24 Punkten")
.and("contain", "46%")
.and("contain", "Punkte aus Bewertung: 19")
.and("contain", "Abgezogene Punkte: 8")
.and("contain", "Grund: Edoniq Punkteabzug Test")
.and("contain", "Nicht bestanden")
})
.and("contain", "Nicht bestanden");
});
it("check with finished casework and points deducted", () => {
cy.manageCommand(
"cypress_reset --create-assignment-evaluation --assignment-evaluation-scores 4,6,4,3,2 --assignment-points-deducted 5"
)
login("test-student1@example.com", "test")
cy.visit("/course/test-lehrgang/competence")
"cypress_reset --create-assignment-evaluation --assignment-evaluation-scores 4,6,4,3,2 --assignment-points-deducted 5",
);
login("test-student1@example.com", "test");
cy.visit("/course/test-lehrgang/competence");
cy.get('[data-cy="certificate-total-points-text"]').contains(
"Erfahrungsnote üK: 4"
)
"Erfahrungsnote üK: 4",
);
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]'
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]',
)
.should("contain", "Note: 4")
.and("contain", "1 von 2 Kompetenznachweis-Elementen")
.and("contain", "1 von 2 Kompetenznachweis-Elementen");
// 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"]')
.should("contain", "Erfahrungsnote üK")
.and("contain", "Note: 4")
.and("contain", "Zwischenstand")
.and("contain", "Zwischenstand");
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", "1 von 2 Kompetenznachweis-Elementen")
.and("contain", "1 von 2 Kompetenznachweis-Elementen");
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]'
).should("contain", "Note: 4")
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]',
).should("contain", "Note: 4");
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]'
).should("contain", "Ungerundete Note: 3.92")
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]',
).should("contain", "Ungerundete Note: 3.92");
// check certificate detail page
cy.get(
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]'
).click()
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]',
).click();
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")
.and("contain", "von 24 Punkten")
.and("contain", "58%")
.and("contain", "mit Abzug")
.and("contain", "Bewertung freigegeben")
.and("contain", "Bewertung freigegeben");
cy.get(
'[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"] [data-cy="open-learning-content"]'
).click()
cy.get('[data-cy="user-points"]').should("contain", "14")
'[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"] [data-cy="open-learning-content"]',
).click();
cy.get('[data-cy="user-points"]').should("contain", "14");
cy.get('[data-cy="total-points"]').should(
"contain",
"von 24 Punkten (58%)"
)
"von 24 Punkten (58%)",
);
cy.get('[data-cy="points-deducted"]')
.should("contain", "Punkte aus Bewertung: 19")
.and("contain", "Abgezogene Punkte: 5")
.and("contain", "Grund: Assignment Punkteabzug Test")
})
.and("contain", "Grund: Assignment Punkteabzug Test");
});
it("should display link to details", () => {
cy.manageCommand("cypress_reset")
login("test-student1@example.com", "test")
cy.visit("/course/test-lehrgang/competence/self-evaluation-and-feedback")
cy.manageCommand("cypress_reset");
login("test-student1@example.com", "test");
cy.visit("/course/test-lehrgang/competence/self-evaluation-and-feedback");
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"]'
).click();
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");
cy.get(
'[data-cy="Überprüfen einer Motorfahrzeugs-Versicherungspolice"]'
'[data-cy="Überprüfen einer Motorfahrzeugs-Versicherungspolice@-1"]'
).should("contain", "0 von 3 bestanden");
});
});

View File

@ -14,29 +14,29 @@ describe("dueDates.cy.js", () => {
});
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
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");
cy.get('[data-cy="due-date-list"]').children().should("have.length", 6);
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
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");
cy.get('[data-cy="due-date-list"]').children().should("have.length", 1);
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
selectDropboxItem('[data-cy="select-type"]', "Präsenzkurs");
cy.get('[data-cy="due-date-list"]').children().should("have.length", 3);
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
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);
selectDropboxItem('[data-cy="select-session"]', "Zürich");
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");
});
});

View File

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

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_STUDENT3_USER_ID = "bcf94dba-53bc-474b-a22d-e4af39aa042b"
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_STUDENT2_VV_AND_VV_MENTOR_USER_ID = "7e8ebf0b-e6e2-4022-88f4-6e663ba0a9db"
TEST_USER_EMPTY_ID = "daecbabe-4ab9-4edf-a71f-4119042ccb02"

View File

@ -12,6 +12,7 @@ env.read_env()
from vbv_lernwelt.core.constants import (
ADMIN_USER_ID,
TEST_BERUFSBILDNER1_USER_ID,
TEST_MENTOR1_USER_ID,
TEST_STUDENT1_USER_ID,
TEST_STUDENT1_VV_USER_ID,
@ -410,6 +411,15 @@ def create_default_users(default_password="test", set_avatar=False):
language="de",
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(
id=TEST_STUDENT2_VV_AND_VV_MENTOR_USER_ID,
email="test-student-and-mentor2@example.com",

View File

@ -189,7 +189,7 @@ def command(
SelfEvaluationFeedback.objects.all().delete()
CourseCompletionFeedback.objects.all().delete()
AgentParticipantRelation.objects.all().delete()
AgentParticipantRelation.objects.filter(role="LEARNING_MENTOR").delete()
# LearningMentor.objects.all().delete()
MentorInvitation.objects.all().delete()
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.core.constants import (
TEST_BERUFSBILDNER1_USER_ID,
TEST_COURSE_SESSION_BERN_ID,
TEST_COURSE_SESSION_ZURICH_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.feedback.services import update_feedback_response
from vbv_lernwelt.learning_mentor.models import AgentParticipantRelation
from vbv_lernwelt.learnpath.models import (
Circle,
LearningContentAssignment,
@ -158,6 +160,14 @@ def create_test_course(
id=TEST_COURSE_SESSION_BERN_ID,
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(
course_session=cs_bern,
learning_content=LearningContentAttendanceCourse.objects.get(
@ -201,25 +211,26 @@ def create_test_course(
)
csac.due_date.save()
csa = CourseSessionAssignment.objects.create(
course_session=cs_bern,
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
for course_session in [cs_bern, cs_zurich]:
csa = CourseSessionAssignment.objects.create(
course_session=course_session,
learning_content=LearningContentAssignment.objects.get(
slug=f"{course.slug}-lp-circle-fahrzeug-lc-überprüfen-einer-motorfahrzeug-versicherungspolice"
),
)
)
csa.submission_deadline.save()
csa.evaluation_deadline.start = timezone.make_aware(
(next_thursday + relativedelta(weeks=5)).replace(
hour=23, minute=59, second=59, microsecond=0
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
)
)
)
csa.evaluation_deadline.save()
csa.submission_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(
course_session=cs_bern,
@ -235,18 +246,19 @@ def create_test_course(
)
csa.submission_deadline.save()
cset = CourseSessionEdoniqTest.objects.create(
course_session=cs_bern,
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
for course_session in [cs_bern, cs_zurich]:
cset = CourseSessionEdoniqTest.objects.create(
course_session=course_session,
learning_content=LearningContentEdoniqTest.objects.get(
slug="test-lehrgang-lp-circle-fahrzeug-lc-wissens-und-verständnisfragen"
),
)
)
cset.deadline.save()
cset.deadline.start = timezone.make_aware(
(next_monday + relativedelta(days=3)).replace(
hour=21, minute=0, second=0, microsecond=0
)
)
cset.deadline.save()
if include_vv:
_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(
course_session=cs_zurich,
learning_content=LearningContentAttendanceCourse.objects.get(
@ -322,6 +327,40 @@ def create_test_course(
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

View File

@ -92,8 +92,8 @@ def create_assignment_summary(
total_failed = sum([m.failed_count for m in completed_metrics])
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(
_id=urql_id, # noqa

View File

@ -57,7 +57,8 @@ class CourseSessionUserTests(TestCase):
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(
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(
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.reset_mock()
self.csu1_student2.delete()