diff options
Diffstat (limited to 'tests.py')
-rw-r--r-- | tests.py | 251 |
1 files changed, 201 insertions, 50 deletions
@@ -1,4 +1,4 @@ -# Copyright (C) 2017 Alban Gruin +# Copyright (C) 2017-2018 Alban Gruin # # celcatsanitizer is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published @@ -14,9 +14,13 @@ # along with celcatsanitizer. If not, see <http://www.gnu.org/licenses/>. from django.test import TestCase -from .models import Course, Group, Timetable, Year +from django.utils import timezone + +from .models import Course, Group, Room, Source, Timetable, Year from .utils import tz_now +import datetime + class CourseTestCase(TestCase): def setUp(self): @@ -25,29 +29,44 @@ class CourseTestCase(TestCase): self.year = Year(name="L2", slug="l2") self.year.save() - self.timetable = Timetable(year=self.year, name="Test timetable 2", url="http://example.org/", slug="test-timetable2") + source = Source(url="http://example.org/") + source.save() + + self.timetable = Timetable(year=self.year, name="Test timetable 2", + source=source, slug="test-timetable2") self.timetable.save() - cma = Group.objects.create(celcat_name="L1 info s2 CMA", timetable=self.timetable) - tda2 = Group.objects.create(celcat_name="L1 info s2 TDA2", timetable=self.timetable) - self.tpa21 = Group.objects.create(celcat_name="L1 info s2 TPA21", timetable=self.timetable) + cma = Group.objects.create(celcat_name="L1 info s2 CMA", source=source) + tda2 = Group.objects.create(celcat_name="L1 info s2 TDA2", + source=source) + self.tpa21 = Group.objects.create(celcat_name="L1 info s2 TPA21", + source=source) - cmb = Group.objects.create(celcat_name="L1 info s2 CMB", timetable=self.timetable) - tdb2 = Group.objects.create(celcat_name="L1 info s2 TDB2", timetable=self.timetable) - self.tpb21 = Group.objects.create(celcat_name="L1 info s2 TPB21", timetable=self.timetable) + cmb = Group.objects.create(celcat_name="L1 info s2 CMB", source=source) + tdb2 = Group.objects.create(celcat_name="L1 info s2 TDB2", + source=source) + self.tpb21 = Group.objects.create(celcat_name="L1 info s2 TPB21", + source=source) for group in (cma, tda2, self.tpa21, cmb, tdb2, self.tpb21,): - course = Course.objects.create(name="{0} course".format(group.name), type="cours", timetable=self.timetable, begin=dt, end=dt) + course = Course.objects.create( + name="{0} course".format(group.name), type="cours", + source=source, begin=dt, end=dt) course.groups.add(group) def test_get_courses_for_group(self): - tpa21_courses = Course.objects.get_courses_for_group(self.tpa21) - tpb21_courses = Course.objects.get_courses_for_group(self.tpb21) - - tpa21_course_names = ["L1 info s2 CMA course", "L1 info s2 TDA2 course", "L1 info s2 TPA21 course"] - tpb21_course_names = ["L1 info s2 CMB course", "L1 info s2 TDB2 course", "L1 info s2 TPB21 course"] - - for courses, names in ((tpa21_courses, tpa21_course_names,), (tpb21_courses, tpb21_course_names,),): + tpa21_courses = Course.objects.get_courses(self.tpa21) + tpb21_courses = Course.objects.get_courses(self.tpb21) + + tpa21_course_names = ["L1 info s2 CMA course", + "L1 info s2 TDA2 course", + "L1 info s2 TPA21 course"] + tpb21_course_names = ["L1 info s2 CMB course", + "L1 info s2 TDB2 course", + "L1 info s2 TPB21 course"] + + for courses, names in ((tpa21_courses, tpa21_course_names,), + (tpb21_courses, tpb21_course_names,),): for course in courses: self.assertIn(course.name, names) names.remove(course.name) @@ -58,29 +77,59 @@ class GroupTestCase(TestCase): self.year = Year(name="L1", slug="l1") self.year.save() - self.timetable = Timetable(year=self.year, name="Test timetable", url="http://example.com/", slug="test-timetable") + self.source = Source(url="http://example.org/") + self.source.save() + + self.timetable = Timetable(year=self.year, name="Test timetable", + source=self.source, slug="test-timetable") self.timetable.save() - Group.objects.create(celcat_name="L1 info s2 CMA", timetable=self.timetable) - Group.objects.create(celcat_name="L1 info s2 TDA2", timetable=self.timetable) - Group.objects.create(celcat_name="L1 info s2 TPA21", timetable=self.timetable) + Group.objects.create(celcat_name="L1 info s2 CMA", source=self.source) + Group.objects.create(celcat_name="L1 info s2 TDA2", source=self.source) + Group.objects.create(celcat_name="L1 info s2 TPA21", + source=self.source) - Group.objects.create(celcat_name="L1 info s2 CMB", timetable=self.timetable) - Group.objects.create(celcat_name="L1 info s2 TDB2", timetable=self.timetable) - Group.objects.create(celcat_name="L1 info s2 TPB21", timetable=self.timetable) + Group.objects.create(celcat_name="L1 info s2 CMB", source=self.source) + Group.objects.create(celcat_name="L1 info s2 TDB2", source=self.source) + Group.objects.create(celcat_name="L1 info s2 TPB21", + source=self.source) - Group.objects.create(celcat_name="L1 info (toutes sections et semestres confondus)", timetable=self.timetable) + Group.objects.create(celcat_name="L1 info (toutes sections et " + "semestres confondus)", source=self.source) - def test_corresponds(self): - cma = Group.objects.get(celcat_name="L1 info s2 CMA", timetable=self.timetable) - tda2 = Group.objects.get(celcat_name="L1 info s2 TDA2", timetable=self.timetable) - tpa21 = Group.objects.get(celcat_name="L1 info s2 TPA21", timetable=self.timetable) + # Cas spéciaux de groupes sans semestre. Normalement un groupe + # sans semestre ne possède pas de sous-groupe non plus, mais + # certains cas font foirer la regex. Voici un exemple trouvé + # dans la base de données de production. + Group.objects.create(celcat_name="M1 GC (toutes sections et semestres " + "confondus)", source=self.source) + + # Doit appartenir au groupe au-dessus. + Group.objects.create(celcat_name="M1 GC s2 GA111", source=self.source) - cmb = Group.objects.get(celcat_name="L1 info s2 CMB", timetable=self.timetable) - tdb2 = Group.objects.get(celcat_name="L1 info s2 TDB2", timetable=self.timetable) - tpb21 = Group.objects.get(celcat_name="L1 info s2 TPB21", timetable=self.timetable) + # Cas spécial avec les parenthèses + Group.objects.create(celcat_name="M1 CHI-TCCM (EM) (toutes sections et" + " semestres confondus)", source=self.source) + Group.objects.create(celcat_name="M1 CHI-TCCM (EM) s2 TPA12", + source=self.source) - general = Group.objects.get(celcat_name="L1 info (toutes sections et semestres confondus)", timetable=self.timetable) + def test_corresponds(self): + cma = Group.objects.get(celcat_name="L1 info s2 CMA", + source=self.source) + tda2 = Group.objects.get(celcat_name="L1 info s2 TDA2", + source=self.source) + tpa21 = Group.objects.get(celcat_name="L1 info s2 TPA21", + source=self.source) + + cmb = Group.objects.get(celcat_name="L1 info s2 CMB", + source=self.source) + tdb2 = Group.objects.get(celcat_name="L1 info s2 TDB2", + source=self.source) + tpb21 = Group.objects.get(celcat_name="L1 info s2 TPB21", + source=self.source) + + general = Group.objects.get(celcat_name="L1 info (toutes sections et " + "semestres confondus)", source=self.source) self.assertFalse(cma.corresponds_to(*tda2.group_info)) self.assertFalse(cma.corresponds_to(*tpa21.group_info)) @@ -120,16 +169,34 @@ class GroupTestCase(TestCase): self.assertTrue(tpa21.corresponds_to(*general.group_info)) self.assertTrue(tpb21.corresponds_to(*general.group_info)) + def test_corresponds_no_semester(self): + general = Group.objects.get(celcat_name="M1 GC (toutes sections et " + "semestres confondus)", source=self.source) + ga111 = Group.objects.get(celcat_name="M1 GC s2 GA111", + source=self.source) + + self.assertTrue(ga111.corresponds_to(*general.group_info)) + self.assertFalse(general.corresponds_to(*ga111.group_info)) + + def test_correspond_parenthesis(self): + general = Group.objects.get(celcat_name="M1 CHI-TCCM (EM) (toutes" + " sections et semestres confondus)") + a12 = Group.objects.get(celcat_name="M1 CHI-TCCM (EM) s2 TPA12") + + self.assertTrue(a12.corresponds_to(*general.group_info)) + self.assertFalse(general.corresponds_to(*a12.group_info)) + def test_get(self): - cma = Group.objects.get(name="L1 info s2 CMA", timetable=self.timetable) - tda2 = Group.objects.get(name="L1 info s2 TDA2", timetable=self.timetable) - tpa21 = Group.objects.get(name="L1 info s2 TPA21", timetable=self.timetable) + cma = Group.objects.get(name="L1 info s2 CMA", source=self.source) + tda2 = Group.objects.get(name="L1 info s2 TDA2", source=self.source) + tpa21 = Group.objects.get(name="L1 info s2 TPA21", source=self.source) - cmb = Group.objects.get(name="L1 info s2 CMB", timetable=self.timetable) - tdb2 = Group.objects.get(name="L1 info s2 TDB2", timetable=self.timetable) - tpb21 = Group.objects.get(name="L1 info s2 TPB21", timetable=self.timetable) + cmb = Group.objects.get(name="L1 info s2 CMB", source=self.source) + tdb2 = Group.objects.get(name="L1 info s2 TDB2", source=self.source) + tpb21 = Group.objects.get(name="L1 info s2 TPB21", source=self.source) - general = Group.objects.get(celcat_name="L1 info (toutes sections et semestres confondus)", timetable=self.timetable) + general = Group.objects.get(celcat_name="L1 info (toutes sections et " + "semestres confondus)", source=self.source) self.assertEqual(cma.celcat_name, "L1 info s2 CMA") self.assertEqual(tda2.celcat_name, "L1 info s2 TDA2") @@ -139,18 +206,26 @@ class GroupTestCase(TestCase): self.assertEqual(tdb2.celcat_name, "L1 info s2 TDB2") self.assertEqual(tpb21.celcat_name, "L1 info s2 TPB21") - self.assertEqual(general.celcat_name, "L1 info (toutes sections et semestres confondus)") + self.assertEqual(general.celcat_name, "L1 info (toutes sections et " + "semestres confondus)") def test_parse(self): - cma = Group.objects.get(celcat_name="L1 info s2 CMA", timetable=self.timetable) - tda2 = Group.objects.get(celcat_name="L1 info s2 TDA2", timetable=self.timetable) - tpa21 = Group.objects.get(celcat_name="L1 info s2 TPA21", timetable=self.timetable) - - cmb = Group.objects.get(celcat_name="L1 info s2 CMB", timetable=self.timetable) - tdb2 = Group.objects.get(celcat_name="L1 info s2 TDB2", timetable=self.timetable) - tpb21 = Group.objects.get(celcat_name="L1 info s2 TPB21", timetable=self.timetable) - - general = Group.objects.get(celcat_name="L1 info (toutes sections et semestres confondus)", timetable=self.timetable) + cma = Group.objects.get(celcat_name="L1 info s2 CMA", + source=self.source) + tda2 = Group.objects.get(celcat_name="L1 info s2 TDA2", + source=self.source) + tpa21 = Group.objects.get(celcat_name="L1 info s2 TPA21", + source=self.source) + + cmb = Group.objects.get(celcat_name="L1 info s2 CMB", + source=self.source) + tdb2 = Group.objects.get(celcat_name="L1 info s2 TDB2", + source=self.source) + tpb21 = Group.objects.get(celcat_name="L1 info s2 TPB21", + source=self.source) + + general = Group.objects.get(celcat_name="L1 info (toutes sections et " + "semestres confondus)", source=self.source) self.assertEqual(cma.group_info, ("L1 info", 2, "A")) self.assertEqual(tda2.group_info, ("L1 info", 2, "A2")) @@ -161,3 +236,79 @@ class GroupTestCase(TestCase): self.assertEqual(tpb21.group_info, ("L1 info", 2, "B21")) self.assertEqual(general.group_info, ("L1 info", None, "")) + + def test_parse_no_semester(self): + general = Group.objects.get(celcat_name="M1 GC (toutes sections et " + "semestres confondus)", source=self.source) + ga111 = Group.objects.get(celcat_name="M1 GC s2 GA111", + source=self.source) + + self.assertEqual(general.group_info, ("M1 GC", None, "")) + self.assertEqual(ga111.group_info, ("M1 GC", 2, "A111")) + + def test_parse_parenthesis(self): + general = Group.objects.get(celcat_name="M1 CHI-TCCM (EM) (toutes" + " sections et semestres confondus)") + a12 = Group.objects.get(celcat_name="M1 CHI-TCCM (EM) s2 TPA12") + + self.assertEqual(general.group_info, ("M1 CHI-TCCM (EM)", None, "")) + self.assertEqual(a12.group_info, ("M1 CHI-TCCM (EM)", 2, "A12")) + + +class RoomTestCase(TestCase): + def setUp(self): + self.day = datetime.datetime(year=2018, month=1, day=27) + + self.year = Year.objects.create(name="L1") + self.source = Source.objects.create(url="http://example.org/") + + # Pas besoin de créer plus de groupes que ça, ni de le rendre + # global + group = Group.objects.create(celcat_name="L1 info s2 CMA", + source=self.source) + + self.rooms = [Room.objects.create(name="0"), + Room.objects.create(name="1"), + Room.objects.create(name="2"), + Room.objects.create(name="3"), + Room.objects.create(name="4"), + Room.objects.create(name="5"), + Room.objects.create(name="6")] + + hours = [({"begin": datetime.time(hour=14, minute=0)},), + ({"begin": datetime.time(hour=16, minute=0)},), + ({"begin": datetime.time(hour=13, minute=30)}, + {"begin": datetime.time(hour=16, minute=0)}), + ({"begin": datetime.time(hour=14, minute=0), "duration": 4},), + ({"begin": datetime.time(hour=15, minute=30), + "duration": 1},), + ({"begin": datetime.time(hour=13, minute=0)}, + {"begin": datetime.time(hour=17, minute=0)}), + ()] + + for i, room in enumerate(self.rooms): + for rn in hours[i]: + begin = timezone.make_aware( + datetime.datetime.combine(self.day, rn["begin"])) + end = begin + datetime.timedelta(hours=rn.get("duration", 2)) + + course = Course.objects.create(source=self.source, + begin=begin, end=end) + course.groups.add(group) + course.rooms.add(room) + + def test_qsjps(self): + begin = timezone.make_aware(datetime.datetime.combine( + self.day, datetime.time(hour=15, minute=0))) + end = begin + datetime.timedelta(hours=2) + + rooms = Room.objects.qsjps(begin, end) + self.assertEqual(rooms.count(), 2) + + self.assertNotIn(self.rooms[0], rooms) + self.assertNotIn(self.rooms[1], rooms) + self.assertNotIn(self.rooms[2], rooms) + self.assertNotIn(self.rooms[3], rooms) + self.assertNotIn(self.rooms[4], rooms) + self.assertIn(self.rooms[5], rooms) + self.assertIn(self.rooms[6], rooms) |