from odoo.tests.common import TransactionCase, tagged @tagged('post_install', '-at_install') class TestSchoolRegistration(TransactionCase): def setUp(self): super().setUp() self.term = self.env['community.school.term'].create({ 'name': 'Reg Term', 'start_date': '2030-09-01', 'end_date': '2030-12-15', }) self.level = self.env['community.school.level'].create({'name': 'Beginner', 'code': 'REG-BEG'}) self.klass = self.env['community.school.class'].create({ 'level_id': self.level.id, 'term_id': self.term.id, 'max_students': 1, 'fee': 100.0, }) def _make_student(self, name): parent = self.env['res.partner'].create({'name': f'{name} Parent', 'email': f'{name.lower()}@example.com'}) child = self.env['res.partner'].create({'name': name}) return self.env['community.school.student'].create({ 'partner_id': child.id, 'parent_partner_id': parent.id, }) def test_enrollment_creates_invoice_when_class_has_fee(self): student = self._make_student('Fee Student') enrollment = self.env['community.school.enrollment'].create({ 'student_id': student.id, 'class_id': self.klass.id, }) invoice = enrollment._create_fee_invoice() self.assertTrue(invoice) self.assertEqual(invoice.state, 'draft') self.assertEqual(enrollment.payment_state, 'invoiced') def test_full_class_waitlists_second_student(self): student1 = self._make_student('First Student') student2 = self._make_student('Second Student') enrollment1 = self.env['community.school.enrollment'].create({ 'student_id': student1.id, 'class_id': self.klass.id, }) self.assertEqual(enrollment1.state, 'enrolled') # max_students=1, so a manual second enrollment past capacity should be # created as waitlist by the controller logic; simulate that here. state = 'enrolled' if self.klass.enrolled_count < self.klass.max_students else 'waitlist' enrollment2 = self.env['community.school.enrollment'].create({ 'student_id': student2.id, 'class_id': self.klass.id, 'state': state, }) self.assertEqual(enrollment2.state, 'waitlist') def test_waitlist_promoted_when_seat_frees(self): student1 = self._make_student('Withdraw Student') student2 = self._make_student('Waitlist Student') enrollment1 = self.env['community.school.enrollment'].create({ 'student_id': student1.id, 'class_id': self.klass.id, }) enrollment2 = self.env['community.school.enrollment'].create({ 'student_id': student2.id, 'class_id': self.klass.id, 'state': 'waitlist', }) enrollment1.write({'state': 'withdrawn'}) self.klass.invalidate_recordset() self.assertEqual(self.klass.enrolled_count, 0) mail_count_before = self.env['mail.mail'].search_count([]) self.env['community.school.enrollment']._cron_promote_waitlist() self.assertEqual(enrollment2.state, 'enrolled') mail_count_after = self.env['mail.mail'].search_count([]) self.assertGreater(mail_count_after, mail_count_before) def test_lms_enrol_and_unenrol(self): student = self._make_student('LMS Student') enrollment = self.env['community.school.enrollment'].create({ 'student_id': student.id, 'class_id': self.klass.id, }) channel = self.klass.slide_channel_id membership = self.env['slide.channel.partner'].sudo().search([ ('channel_id', '=', channel.id), ('partner_id', '=', student.partner_id.id), ]) self.assertTrue(membership, "Enrolling should add the student to the class's slide channel") enrollment.write({'state': 'withdrawn'}) membership.invalidate_recordset() self.assertFalse(membership.active, "Withdrawing should deactivate the LMS membership")