aboutsummaryrefslogtreecommitdiff
path: root/tests.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests.py')
-rw-r--r--tests.py251
1 files changed, 201 insertions, 50 deletions
diff --git a/tests.py b/tests.py
index 1425a84..c3d34fd 100644
--- a/tests.py
+++ b/tests.py
@@ -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)