From 5ed289c9122bf9c3c57dc25c0759a6af70657cb3 Mon Sep 17 00:00:00 2001 From: Christian Cueni Date: Wed, 9 Aug 2023 07:34:31 +0200 Subject: [PATCH] WIP: Fix and extend importer test --- .../edoniq_test/tests/test_import.py | 252 ------------------ server/vbv_lernwelt/importer/services.py | 37 ++- .../tests/test_import_course_sessions.py | 107 +++++--- .../importer/tests/test_import_trainers.py | 35 ++- 4 files changed, 131 insertions(+), 300 deletions(-) delete mode 100644 server/vbv_lernwelt/edoniq_test/tests/test_import.py diff --git a/server/vbv_lernwelt/edoniq_test/tests/test_import.py b/server/vbv_lernwelt/edoniq_test/tests/test_import.py deleted file mode 100644 index 69b4e528..00000000 --- a/server/vbv_lernwelt/edoniq_test/tests/test_import.py +++ /dev/null @@ -1,252 +0,0 @@ -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") diff --git a/server/vbv_lernwelt/importer/services.py b/server/vbv_lernwelt/importer/services.py index eb0f2099..26381553 100644 --- a/server/vbv_lernwelt/importer/services.py +++ b/server/vbv_lernwelt/importer/services.py @@ -326,27 +326,36 @@ def create_or_update_course_session( if expert: csa.trainer = f"{expert.user.first_name} {expert.user.last_name}" - csa.due_date.start = timezone.make_aware(start) - csa.due_date.end = timezone.make_aware(end) + + if start: + csa.due_date.start = timezone.make_aware(start) + if end: + csa.due_date.end = timezone.make_aware(end) csa.due_date.save() csa.save() for assignment_slug in circle_data["assignments"]: logger.debug("import", slug=f"{course.slug}-lp-circle-{assignment_slug}") - csa, _created = CourseSessionAssignment.objects.get_or_create( - course_session=cs, - learning_content=LearningContentAssignment.objects.get( - slug=f"{course.slug}-lp-circle-{assignment_slug}" - ), - ) + learning_content = LearningContentAssignment.objects.filter( + slug=f"{course.slug}-lp-circle-{assignment_slug}" + ).first() - if ( - csa.learning_content.assignment_type - == AssignmentType.PREP_ASSIGNMENT.value - ): - csa.submission_deadline.end = timezone.make_aware(start) - csa.submission_deadline.save() + if learning_content: + csa, _created = CourseSessionAssignment.objects.get_or_create( + course_session=cs, + learning_content=LearningContentAssignment.objects.get( + slug=f"{course.slug}-lp-circle-{assignment_slug}" + ), + ) + + if ( + csa.learning_content.assignment_type + == AssignmentType.PREP_ASSIGNMENT.value + and start + ): + csa.submission_deadline.end = timezone.make_aware(start) + csa.submission_deadline.save() return cs diff --git a/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py b/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py index 49c2b0da..9a76e169 100644 --- a/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py +++ b/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py @@ -3,15 +3,19 @@ import os from django.test import TestCase from openpyxl.reader.excel import load_workbook +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 +from vbv_lernwelt.course.models import CourseSession, CourseSessionUser from vbv_lernwelt.course_session.models import CourseSessionAttendanceCourse +from vbv_lernwelt.duedate.models import DueDate from vbv_lernwelt.importer.services import ( create_or_update_course_session, DataImportError, validate_row_data, ) from vbv_lernwelt.importer.utils import calc_header_tuple_list_from_pyxl_sheet +from vbv_lernwelt.learnpath.models import Circle test_dir = os.path.dirname(os.path.abspath(__file__)) @@ -28,9 +32,8 @@ class ImportCourseSessionTestCase(TestCase): tuple_list = calc_header_tuple_list_from_pyxl_sheet(sheet) for row in tuple_list: - print(row) create_or_update_course_session( - self.course, dict(row), language="de", circle_keys=["Fahrzeug"] + self.course, dict(row), language="de", circle_keys=["Kickoff"] ) self.assertEqual(CourseSession.objects.count(), 6) @@ -38,23 +41,24 @@ class ImportCourseSessionTestCase(TestCase): class CreateOrUpdateCourseSessionTestCase(TestCase): def setUp(self): + create_default_users() self.course = create_test_course(include_vv=False) def test_create_course_session(self): row = [ - ("ID", "DE 2023 A"), + ("ID", "AG 2023 A"), ("Generation", 2023), - ("Region", "Deutschschweiz"), + ("Region", "Aargau"), ("Sprache", "de"), ("Klasse", "A"), ("Fahrzeug Start", "06.06.2023, 13:30"), ("Fahrzeug Ende", "06.06.2023, 15:00"), ( "Fahrzeug Raum", - "https://teams.microsoft.com/l/meetup-join/19%3ameeting_N2I5YzViZTQtYTM2Ny00OTYwLTgzNzAtYWI4OTQzODcxNTlj%40thread.v2/0?context=%7b%22Tid%22%3a%22fedd03c8-a756-4803-8f27-0db8f7c488f2%22%2c%22Oid%22%3a%22f92e6382-3884-4e71-a2fd-b305a75d9812%22%7d", + "E64", ), - ("Fahrzeug Standort", None), - ("Fahrzeug Adresse", None), + ("Fahrzeug Standort", "HKV Aarau"), + ("Fahrzeug Adresse", "Bahnhofstrasse 460, 5001, Aarau"), ] data = dict(row) @@ -63,10 +67,10 @@ class CreateOrUpdateCourseSessionTestCase(TestCase): self.course, data, language="de", circle_keys=["Fahrzeug"] ) - self.assertEqual(cs.import_id, "DE 2023 A") - self.assertEqual(cs.title, "Deutschschweiz 2023 A") + self.assertEqual(cs.import_id, "AG 2023 A") + self.assertEqual(cs.title, "Aargau 2023 A") self.assertEqual(cs.generation, "2023") - self.assertEqual(cs.region, "Deutschschweiz") + self.assertEqual(cs.region, "Aargau") self.assertEqual(cs.group, "A") attendance_course = CourseSessionAttendanceCourse.objects.first() @@ -76,29 +80,28 @@ class CreateOrUpdateCourseSessionTestCase(TestCase): self.assertEqual( attendance_course.due_date.end.isoformat(), "2023-06-06T13:00:00+00:00" ) + self.assertEqual( + f"E64, HKV Aarau, Bahnhofstrasse 460, 5001, Aarau", + attendance_course.location, + ) + self.assertEqual("", attendance_course.trainer) + self.assertEqual(4, DueDate.objects.count()) def test_update_course_session(self): - cs = CourseSession.objects.create( - course_id=self.course.id, - title="Deutschschweiz 2023 A", - import_id="DE 2023", - group="A", - ) - row = [ - ("ID", "DE 2023"), + ("ID", "AG 2023 A"), ("Generation", 2023), - ("Region", "Deutschschweiz"), + ("Region", "Aargau"), ("Sprache", "de"), ("Klasse", "A"), ("Fahrzeug Start", "06.06.2023, 13:30"), ("Fahrzeug Ende", "06.06.2023, 15:00"), ( "Fahrzeug Raum", - "https://teams.microsoft.com/l/meetup-join/19%3ameeting_N2I5YzViZTQtYTM2Ny00OTYwLTgzNzAtYWI4OTQzODcxNTlj%40thread.v2/0?context=%7b%22Tid%22%3a%22fedd03c8-a756-4803-8f27-0db8f7c488f2%22%2c%22Oid%22%3a%22f92e6382-3884-4e71-a2fd-b305a75d9812%22%7d", + "E64", ), - ("Fahrzeug Standort", None), - ("Fahrzeug Adresse", None), + ("Fahrzeug Standort", "HKV Aarau"), + ("Fahrzeug Adresse", "Bahnhofstrasse 460, 5001, Aarau"), ] data = dict(row) @@ -107,21 +110,59 @@ class CreateOrUpdateCourseSessionTestCase(TestCase): self.course, data, language="de", circle_keys=["Fahrzeug"] ) + 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_row = [ + ("ID", "AG 2023 A"), + ("Generation", 2023), + ("Region", "Aargau"), + ("Sprache", "de"), + ("Klasse", "A"), + ("Fahrzeug Start", "06.06.2023, 14:30"), + ("Fahrzeug Ende", "06.06.2023, 17:00"), + ( + "Fahrzeug Raum", + "E666", + ), + ("Fahrzeug Standort", "HKV Aarau2"), + ("Fahrzeug Adresse", "Bahnhofstrasse 460, 5002, Aarau"), + ] + + data = dict(update_row) + + cs = create_or_update_course_session( + self.course, data, language="de", circle_keys=["Fahrzeug"] + ) + self.assertEqual(1, CourseSession.objects.count()) - self.assertEqual(cs.import_id, "DE 2023") - self.assertEqual(cs.title, "Deutschschweiz 2023 A") + self.assertEqual(cs.import_id, "AG 2023 A") + self.assertEqual(cs.title, "Aargau 2023 A") self.assertEqual(cs.generation, "2023") - self.assertEqual(cs.region, "Deutschschweiz") + self.assertEqual(cs.region, "Aargau") self.assertEqual(cs.group, "A") attendance_course = CourseSessionAttendanceCourse.objects.first() self.assertEqual( - attendance_course.due_date.start.isoformat(), "2023-06-06T11:30:00+00:00" + attendance_course.due_date.start.isoformat(), "2023-06-06T12:30:00+00:00" ) self.assertEqual( - attendance_course.due_date.end.isoformat(), "2023-06-06T13:00:00+00:00" + attendance_course.due_date.end.isoformat(), "2023-06-06T15:00:00+00:00" ) + self.assertEqual( + f"E666, HKV Aarau2, Bahnhofstrasse 460, 5002, Aarau", + attendance_course.location, + ) + self.assertEqual( + f"{trainer1.first_name} {trainer1.last_name}", attendance_course.trainer + ) + self.assertEqual(4, DueDate.objects.count()) def test_import_course_session_twice(self): """ @@ -129,19 +170,19 @@ class CreateOrUpdateCourseSessionTestCase(TestCase): `CourseSessionAttendanceCourse` only once """ row = [ - ("ID", "DE 2023 A"), + ("ID", "AG 2023 A"), ("Generation", 2023), - ("Region", "Deutschschweiz"), + ("Region", "Aargau"), ("Sprache", "de"), ("Klasse", "A"), ("Fahrzeug Start", "06.06.2023, 13:30"), ("Fahrzeug Ende", "06.06.2023, 15:00"), ( "Fahrzeug Raum", - "https://teams.microsoft.com/l/meetup-join/19%3ameeting_N2I5YzViZTQtYTM2Ny00OTYwLTgzNzAtYWI4OTQzODcxNTlj%40thread.v2/0?context=%7b%22Tid%22%3a%22fedd03c8-a756-4803-8f27-0db8f7c488f2%22%2c%22Oid%22%3a%22f92e6382-3884-4e71-a2fd-b305a75d9812%22%7d", + "E64", ), - ("Fahrzeug Standort", None), - ("Fahrzeug Adresse", None), + ("Fahrzeug Standort", "HKV Aarau"), + ("Fahrzeug Adresse", "Bahnhofstrasse 460, 5001, Aarau"), ] data = dict(row) diff --git a/server/vbv_lernwelt/importer/tests/test_import_trainers.py b/server/vbv_lernwelt/importer/tests/test_import_trainers.py index 987fc74a..6c637a8b 100644 --- a/server/vbv_lernwelt/importer/tests/test_import_trainers.py +++ b/server/vbv_lernwelt/importer/tests/test_import_trainers.py @@ -50,7 +50,7 @@ class CreateOrUpdateTrainerTestCase(TestCase): import_id="DE 2023 A", group="A", ) - self.course_session_a = CourseSession.objects.create( + self.course_session_b = CourseSession.objects.create( course=self.course, title="Deutschschweiz 2023 B", import_id="DE 2023 B", @@ -96,3 +96,36 @@ class CreateOrUpdateTrainerTestCase(TestCase): self.assertEqual(csu.role, CourseSessionUser.Role.EXPERT) self.assertEqual(csu.user.email, "fabienne.haenni@vbv-afa.ch") self.assertEqual(csu.expert.all().first().title, "Fahrzeug") + + def test_update_trainer(self): + row = [ + ("Name", "Hänni"), + ("Vorname", "Fabienne"), + ("Email", "fabienne.haenni@vbv-afa.ch"), + ("Sprache", "de"), + ("Generation", "DE 2023"), + ("Klasse", "A"), + ("Circles", "Fahrzeug, Haushalt Teil 1"), + ] + + create_or_update_trainer(self.course, dict(row)) + + update_row = [ + ("Name", "Meier"), + ("Vorname", "Fabienne"), + ("Email", "fabienne.haenni@vbv-afa.ch"), + ("Sprache", "de"), + ("Generation", "DE 2023"), + ("Klasse", "A"), + ("Circles", "Fahrzeug, Haushalt Teil 1"), + ] + + create_or_update_trainer(self.course, dict(update_row)) + + csu = CourseSessionUser.objects.all().first() + + self.assertEqual(csu.course_session, self.course_session_a) + self.assertEqual(csu.role, CourseSessionUser.Role.EXPERT) + self.assertEqual(csu.user.email, "fabienne.haenni@vbv-afa.ch") + self.assertEqual(csu.expert.all().first().title, "Fahrzeug") + self.assertEqual(csu.user.last_name, "Meier")