class TestFetchEducationGroupToPostpone(TestCase): @classmethod def setUpTestData(cls): cls.current_year = get_current_year() cls.academic_years = [ AcademicYearFactory(year=i) for i in range(cls.current_year, cls.current_year + 7) ] def setUp(self): self.education_group = EducationGroupFactory(end_year=None) def test_fetch_education_group_to_postpone_to_N6(self): education_group_years_to_postpone = EducationGroupYearFactory.create_batch( 2, education_group__end_year=None, academic_year=self.academic_years[-4]) result, errors = EducationGroupAutomaticPostponementToN6().postpone() self.assertFalse(errors) self.assertCountEqual([egy.academic_year for egy in result], [self.academic_years[6]] * 2) self.assertCountEqual( [egy.education_group for egy in result], [egy.education_group for egy in education_group_years_to_postpone]) self.assertEqual(EducationGroupYear.objects.count(), 8) def test_if_structure_is_postponed(self): parent = EducationGroupYearFactory( education_group=self.education_group, academic_year=self.academic_years[-2], ) mandatory_child = GroupFactory(academic_year=self.academic_years[-2], ) not_mandatory_child = GroupFactory( academic_year=self.academic_years[-2], ) GroupElementYearFactory(parent=parent, child_branch=mandatory_child) GroupElementYearFactory(parent=parent, child_branch=not_mandatory_child) AuthorizedRelationshipFactory( parent_type=parent.education_group_type, child_type=mandatory_child.education_group_type, min_count_authorized=1) AuthorizedRelationshipFactory( parent_type=parent.education_group_type, child_type=not_mandatory_child.education_group_type, min_count_authorized=0) self.assertEqual(EducationGroupYear.objects.count(), 3) result, errors = EducationGroupAutomaticPostponementToN6().postpone() self.assertEqual(len(result), 1) self.assertFalse(errors) self.assertEqual(result[0].education_group, self.education_group) self.assertEqual(result[0].groupelementyear_set.count(), 1) def test_egy_to_not_duplicated(self): # The education group is over self.education_group.end_year = self.academic_years[-2] self.education_group.save() EducationGroupYearFactory( education_group=self.education_group, academic_year=self.academic_years[-2], ) self.assertEqual(EducationGroupYear.objects.count(), 1) postponement = EducationGroupAutomaticPostponementToN6() self.assertQuerysetEqual(postponement.to_duplicate, []) result, errors = postponement.postpone() self.assertEqual(len(result), 0) self.assertFalse(errors) def test_do_not_duplicate_11BA(self): TrainingFactory(education_group_type__name=TrainingType.BACHELOR.name, acronym="OSIS11BA") postponement = EducationGroupAutomaticPostponementToN6() self.assertQuerysetEqual(postponement.queryset, []) def test_egy_already_duplicated(self): EducationGroupYearFactory( education_group=self.education_group, academic_year=self.academic_years[-2], ) EducationGroupYearFactory( education_group=self.education_group, academic_year=self.academic_years[-1], ) self.assertEqual(EducationGroupYear.objects.count(), 2) result, errors = EducationGroupAutomaticPostponementToN6().postpone() self.assertEqual(len(result), 0) self.assertFalse(errors) @mock.patch( 'base.business.education_groups.automatic_postponement.EducationGroupAutomaticPostponementToN6.extend_obj' ) def test_egy_to_duplicate_with_error(self, mock_method): mock_method.side_effect = Mock(side_effect=Error("test error")) egy_with_error = EducationGroupYearFactory( education_group=self.education_group, academic_year=self.academic_years[-2], ) self.assertEqual(EducationGroupYear.objects.count(), 1) result, errors = EducationGroupAutomaticPostponementToN6().postpone() self.assertTrue(mock_method.called) self.assertEqual(errors, [egy_with_error.education_group]) self.assertEqual(len(result), 0) def test_education_group_wrong_mini_training(self): egt = EducationGroupTypeFactory(name=MiniTrainingType.OPTION.name, category=MINI_TRAINING) EducationGroupYearFactory(education_group=self.education_group, academic_year=self.academic_years[-2], education_group_type=egt) queryset = EducationGroupAutomaticPostponementToN6().get_queryset() self.assertQuerysetEqual(queryset, [])
class TestFetchEducationGroupToPostpone(TestCase): def setUp(self): current_year = get_current_year() self.academic_years = [ AcademicYearFactory(year=i) for i in range(current_year, current_year + 7) ] self.education_group = EducationGroupFactory(end_year=None) def test_fetch_education_group_to_postpone_to_N6(self): EducationGroupYearFactory( education_group=self.education_group, academic_year=self.academic_years[-4], ) education_group_to_postpone = EducationGroupYearFactory( education_group=self.education_group, academic_year=self.academic_years[-3], ) self.assertEqual(EducationGroupYear.objects.count(), 2) result, errors = EducationGroupAutomaticPostponement().postpone() self.assertEqual(len(result), 2) self.assertEqual(EducationGroupYear.objects.count(), 4) self.assertEqual(result[-1].academic_year.year, get_current_year() + 6) self.assertEqual(result[-1].education_group, education_group_to_postpone.education_group) self.assertFalse(errors) def test_if_structure_is_postponed(self): parent = EducationGroupYearFactory( education_group=self.education_group, academic_year=self.academic_years[-2], ) mandatory_child = GroupFactory(academic_year=self.academic_years[-2], ) not_mandatory_child = GroupFactory( academic_year=self.academic_years[-2], ) GroupElementYearFactory(parent=parent, child_branch=mandatory_child) GroupElementYearFactory(parent=parent, child_branch=not_mandatory_child) AuthorizedRelationshipFactory( parent_type=parent.education_group_type, child_type=mandatory_child.education_group_type, min_count_authorized=1) AuthorizedRelationshipFactory( parent_type=parent.education_group_type, child_type=not_mandatory_child.education_group_type, min_count_authorized=0) self.assertEqual(EducationGroupYear.objects.count(), 3) result, errors = EducationGroupAutomaticPostponement().postpone() self.assertEqual(len(result), 1) self.assertFalse(errors) self.assertEqual(result[0].education_group, self.education_group) self.assertEqual(result[0].groupelementyear_set.count(), 1) def test_egy_to_not_duplicated(self): # The learning unit is over self.education_group.end_year = self.academic_years[-2].year self.education_group.save() EducationGroupYearFactory( education_group=self.education_group, academic_year=self.academic_years[-2], ) self.assertEqual(EducationGroupYear.objects.count(), 1) result, errors = EducationGroupAutomaticPostponement().postpone() self.assertEqual(len(result), 0) self.assertFalse(errors) def test_egy_already_duplicated(self): EducationGroupYearFactory( education_group=self.education_group, academic_year=self.academic_years[-2], ) EducationGroupYearFactory( education_group=self.education_group, academic_year=self.academic_years[-1], ) self.assertEqual(EducationGroupYear.objects.count(), 2) result, errors = EducationGroupAutomaticPostponement().postpone() self.assertEqual(len(result), 0) self.assertFalse(errors) @mock.patch( 'base.business.education_groups.automatic_postponement.EducationGroupAutomaticPostponement.extend_obj' ) def test_egy_to_duplicate_with_error(self, mock_method): mock_method.side_effect = Mock(side_effect=Error("test error")) egy_with_error = EducationGroupYearFactory( education_group=self.education_group, academic_year=self.academic_years[-2], ) self.assertEqual(EducationGroupYear.objects.count(), 1) result, errors = EducationGroupAutomaticPostponement().postpone() self.assertTrue(mock_method.called) self.assertEqual(errors, [egy_with_error.education_group]) self.assertEqual(len(result), 0) def test_education_group_wrong_mini_training(self): egt = EducationGroupTypeFactory(name=MiniTrainingType.OPTION.name, category=MINI_TRAINING) EducationGroupYearFactory(education_group=self.education_group, academic_year=self.academic_years[-2], education_group_type=egt) queryset = EducationGroupAutomaticPostponement().get_queryset() self.assertQuerysetEqual(queryset, [])