vbv/server/vbv_lernwelt/edoniq_test/tests/test_import.py

253 lines
8.7 KiB
Python

from django.test import TestCase
from django.utils import timezone
from vbv_lernwelt.assignment.models import AssignmentType
from vbv_lernwelt.core.create_default_users import create_default_users
from vbv_lernwelt.core.models import User
from vbv_lernwelt.course.creators.test_course import create_test_course
from vbv_lernwelt.course.models import CourseSession, CourseSessionUser
from vbv_lernwelt.course_session.models import (
CourseSessionAssignment,
CourseSessionAttendanceCourse,
)
from vbv_lernwelt.duedate.models import DueDate
from vbv_lernwelt.importer.services import (
create_or_update_course_session,
create_or_update_trainer,
)
from vbv_lernwelt.learnpath.models import (
Circle,
LearningContentAssignment,
LearningContentAttendanceCourse,
)
TEST_SESSION = {
"ID": "AG 2023 A",
"Generation": "2023",
"Region": "Aargau",
"Sprache": "de",
"Klasse": "A",
"Kickoff Start": "30.08.2023, 09:15",
"Kickoff Ende": "30.08.2023, 17:00",
"Kickoff Raum": "E34",
"Kickoff Standort": "HKV Aarau",
"Kickoff Adresse": "Bahnhofstrasse 46, 5000, Aarau",
"Basis Start": "06.09.2023, 09:15",
"Basis Ende": "06.09.2023, 17:00",
"Basis Raum": "E34",
"Basis Standort": "HKV Aarau",
"Basis Adresse": "Bahnhofstrasse 46, 5000, Aarau",
"Fahrzeug Start": "08.11.2023, 09:15",
"Fahrzeug Ende": "08.11.2023, 17:00",
"Fahrzeug Raum": "E34",
"Fahrzeug Standort": "HKV Aarau",
"Fahrzeug Adresse": "Bahnhofstrasse 46, 5000, Aarau",
"Haushalt Teil 1 Start": "17.01.2024, 09:15",
"Hauhalt Teil 1 Ende": "17.01.2024, 17:00",
"Haushalt Teil 1 Raum": "E34",
"Haushalt Teil 1 Standort": "HKV Aarau",
"Haushalt Teil 1 Adresse": "Bahnhofstrasse 46, 5000, Aarau",
"Haushalt Teil 2 Start": "20.03.2024, 09:15",
"Haushalt Teil 2 Ende": "20.03.2024, 17:00",
"Haushalt Teil 2 Raum": "E34",
"Haushalt Teil 2 Standort": "HKV Aarau",
"Haushalt Teil 2 Adresse": "Bahnhofstrasse 46, 5000, Aarau",
}
TEST_CIRCLES = ["Fahrzeug"]
LP_DATA = {
"Fahrzeug": {
"de": {
"title": "Fahrzeug",
"slug": "fahrzeug",
"presence_course": "fahrzeug-lc-präsenzkurs-fahrzeug",
"assignments": [
"fahrzeug-lc-überprüfen-einer-motorfahrzeug-versicherungspolice",
"fahrzeug-lc-fahrzeug-mein-erstes-auto",
],
},
},
}
TEST_TRAINER = {
"Name": "Muster",
"Vorname": "Hans",
"Email": "Hans.muster@eiger-versicherung.ch",
"Sprache": "de",
"Generation": "AG 2023",
"Klasse": "A",
"Circles": "Fahrzeug",
"Anrede": "Herr",
"Tel. Geschäft": "031 321 32 32",
"Tel. Mobil": "079 321 32 32",
"Strasse": "Thunstrasse 1",
"PLZ": "3014",
"Wohnort": "Bern",
}
class EdoniqSessionImportTestCase(TestCase):
def setUp(self) -> None:
create_default_users()
self.course = create_test_course(with_sessions=False)
def test_session_import(self):
create_or_update_course_session(
self.course, TEST_SESSION, "de", circle_keys=TEST_CIRCLES
)
cs = CourseSession.objects.get(import_id="AG 2023 A")
self.assertEqual(cs.course, self.course)
for circle_name in TEST_CIRCLES:
self._check_attendance(circle_name, cs, TEST_SESSION)
self._check_assignments(circle_name, cs, TEST_SESSION)
self.assertEqual(4, DueDate.objects.count())
def test_update_session_import(self):
create_or_update_course_session(
self.course, TEST_SESSION, "de", circle_keys=TEST_CIRCLES
)
cs = CourseSession.objects.get(import_id="AG 2023 A")
trainer1 = User.objects.get(email="test-trainer1@example.com")
csu = CourseSessionUser.objects.create(
course_session=cs,
user=trainer1,
role=CourseSessionUser.Role.EXPERT,
)
csu.expert.add(Circle.objects.get(slug="test-lehrgang-lp-circle-fahrzeug"))
UPDATE_SESSION = {
"ID": "AG 2023 A",
"Generation": "2023",
"Region": "Aargau",
"Sprache": "de",
"Klasse": "A",
"Fahrzeug Start": "09.11.2023, 10:15",
"Fahrzeug Ende": "09.11.2023, 16:00",
"Fahrzeug Raum": "E35",
"Fahrzeug Standort": "HKV Aarau2",
"Fahrzeug Adresse": "Bahnhofstrasse 460, 5001, Aarau2",
}
create_or_update_course_session(
self.course, UPDATE_SESSION, "de", circle_keys=TEST_CIRCLES
)
for circle_name in TEST_CIRCLES:
self._check_attendance(
circle_name,
cs,
UPDATE_SESSION,
trainer_name=f"{trainer1.first_name} {trainer1.last_name}",
)
self._check_assignments(circle_name, cs, UPDATE_SESSION)
self.assertEqual(4, DueDate.objects.count())
def _check_attendance(
self,
circle_name: str,
cs: CourseSession,
session_data: dict,
trainer_name: str = "",
):
attendance = LearningContentAttendanceCourse.objects.filter(
slug=f"{self.course.slug}-lp-circle-{LP_DATA[circle_name]['de']['presence_course']}",
)
self.assertEqual(attendance.count(), 1) # only one attendance per circle
csac = CourseSessionAttendanceCourse.objects.get(
course_session=cs, learning_content=attendance.first()
)
self.assertEqual(
f"{session_data[f'{circle_name} Raum']}, {session_data[f'{circle_name} Standort']}, {session_data[f'{circle_name} Adresse']}",
csac.location,
)
self.assertEqual(
f"{session_data[f'{circle_name} Start']}",
timezone.localtime(csac.due_date.start).strftime("%d.%m.%Y, %H:%M"),
)
self.assertEqual(
f"{session_data[f'{circle_name} Ende']}",
timezone.localtime(csac.due_date.end).strftime("%d.%m.%Y, %H:%M"),
)
self.assertEqual(trainer_name, csac.trainer)
def _check_assignments(
self, circle_name: str, cs: CourseSession, session_data: dict
):
for assignment_slug in LP_DATA[circle_name]["de"]["assignments"]:
csa = CourseSessionAssignment.objects.get(
course_session=cs,
learning_content=LearningContentAssignment.objects.get(
slug=f"{self.course.slug}-lp-circle-{assignment_slug}"
),
)
if (
csa.learning_content.assignment_type
== AssignmentType.PREP_ASSIGNMENT.value
):
self.assertEqual(
f"{session_data[f'{circle_name} Start']}",
timezone.localtime(csa.submission_deadline.end).strftime(
"%d.%m.%Y, %H:%M"
),
)
class EdoniqTrainerImportTestCase(TestCase):
def setUp(self) -> None:
create_default_users()
self.course = create_test_course(with_sessions=False)
def test_trainer_import(self):
create_or_update_course_session(
self.course, TEST_SESSION, "de", circle_keys=TEST_CIRCLES
)
cs = CourseSession.objects.get(import_id="AG 2023 A")
create_or_update_trainer(self.course, TEST_TRAINER)
csu = CourseSessionUser.objects.filter(
course_session=cs,
role=CourseSessionUser.Role.EXPERT,
).first()
self.assertEqual(csu.user.first_name, TEST_TRAINER["Vorname"])
self.assertEqual(csu.expert.first().slug, "test-lehrgang-lp-circle-fahrzeug")
def test_update_trainer_import(self):
create_or_update_course_session(
self.course, TEST_SESSION, "de", circle_keys=TEST_CIRCLES
)
cs = CourseSession.objects.get(import_id="AG 2023 A")
create_or_update_trainer(self.course, TEST_TRAINER)
UPDATE_TRAINER = {
"Name": "Hansmeier",
"Vorname": "Hans",
"Email": "Hans.muster@eiger-versicherung.ch",
"Sprache": "de",
"Generation": "AG 2023",
"Klasse": "A",
"Circles": "Fahrzeug",
"Anrede": "Herr",
"Tel. Geschäft": "031 321 32 32",
"Tel. Mobil": "079 321 32 32",
"Strasse": "Thunstrasse 1",
"PLZ": "3014",
"Wohnort": "Bern",
}
csu = CourseSessionUser.objects.filter(
course_session=cs,
role=CourseSessionUser.Role.EXPERT,
).first()
create_or_update_trainer(self.course, UPDATE_TRAINER)
self.assertEqual(csu.user.first_name, UPDATE_TRAINER["Vorname"])
self.assertEqual(csu.expert.first().slug, "test-lehrgang-lp-circle-fahrzeug")