from dateutil.relativedelta import relativedelta from odoo import fields from odoo.tests.common import TransactionCase, tagged @tagged('post_install', '-at_install') class TestSchool(TransactionCase): def setUp(self): super().setUp() self.term = self.env['community.school.term'].create({ 'name': 'Fall 2030', 'start_date': '2030-09-01', 'end_date': '2030-12-15', }) self.level = self.env['community.school.level'].create({ 'name': 'Beginner', 'code': 'BEG', 'min_age': 5, 'max_age': 8, }) self.klass = self.env['community.school.class'].create({ 'level_id': self.level.id, 'term_id': self.term.id, 'max_students': 2, }) self.parent = self.env['res.partner'].create({'name': 'Parent One'}) self.child = self.env['res.partner'].create({'name': 'Child One'}) self.student = self.env['community.school.student'].create({ 'partner_id': self.child.id, 'parent_partner_id': self.parent.id, 'date_of_birth': '2023-01-01', }) def test_class_auto_creates_slide_channel(self): self.assertTrue(self.klass.slide_channel_id, "Creating a class should auto-create a slide channel") def test_class_name_computed(self): self.assertEqual(self.klass.name, f"{self.level.name} - {self.term.name}") def test_enrollment_updates_enrolled_count(self): self.assertEqual(self.klass.enrolled_count, 0) self.env['community.school.enrollment'].create({ 'student_id': self.student.id, 'class_id': self.klass.id, }) self.klass.invalidate_recordset() self.assertEqual(self.klass.enrolled_count, 1) def test_withdrawn_enrollment_does_not_count(self): enrollment = self.env['community.school.enrollment'].create({ 'student_id': self.student.id, 'class_id': self.klass.id, }) enrollment.state = 'withdrawn' self.klass.invalidate_recordset() self.assertEqual(self.klass.enrolled_count, 0) def test_attendance_rate_computed(self): enrollment = self.env['community.school.enrollment'].create({ 'student_id': self.student.id, 'class_id': self.klass.id, }) self.env['community.school.attendance'].create({ 'enrollment_id': enrollment.id, 'date': '2030-09-08', 'state': 'present', }) self.env['community.school.attendance'].create({ 'enrollment_id': enrollment.id, 'date': '2030-09-15', 'state': 'absent', }) self.env['community.school.attendance'].create({ 'enrollment_id': enrollment.id, 'date': '2030-09-22', 'state': 'present', }) self.assertAlmostEqual(enrollment.attendance_rate, (2 / 3) * 100) def test_age_computed(self): dob = fields.Date.today() - relativedelta(years=5, days=1) self.student.date_of_birth = dob self.assertEqual(self.student.age, 5)