コード例 #1
0
class CheckPaperSheetTest(TestCase):
    def setUp(self):
        a_person = PersonFactory(global_id=GLOBAL_ID)

        tutors_group = Group.objects.create(name='tutors')
        permission = Permission.objects.get(codename="is_tutor")
        tutors_group.permissions.add(permission)
        a_person.user.groups.add(tutors_group)

        self.tutor = TutorFactory(person=a_person)

        self.url = reverse('check_papersheet', args=[GLOBAL_ID])
        self.client.force_login(a_person.user)

    def test_when_no_tutor(self):
        self.tutor.delete()

        response = self.client.get(self.url, follow=True)
        self.assertEqual(response.status_code, ACCESS_DENIED)

    def test_when_request_is_post(self):
        response = self.client.post(self.url, data={}, follow=True)
        self.assertEqual(response.status_code, METHOD_NOT_ALLOWED)

    def test_when_request_is_not_ajax(self):
        response = self.client.get(self.url, data={}, follow=True)
        self.assertEqual(response.status_code, ACCESS_DENIED)

    def test_when_no_corresponding_person(self):
        self.url = reverse('check_papersheet', args=["01010101"])

        response = self.client.get(self.url, follow=True)
        self.assertEqual(response.status_code, ACCESS_DENIED)

    @modify_settings(INSTALLED_APPS={'remove': 'assessments'})
    def test_when_app_not_installed(self):
        response = self.client.get(self.url,
                                   data={},
                                   follow=True,
                                   HTTP_X_REQUESTED_WITH='XMLHttpRequest')
        self.assertEqual(response.status_code, METHOD_NOT_ALLOWED)

    def test_when_no_corresponding_papersheet(self):
        response = self.client.get(self.url,
                                   data={},
                                   follow=True,
                                   HTTP_X_REQUESTED_WITH='XMLHttpRequest')
        self.assertEqual(response.status_code, FILE_NOT_FOUND)

    def test_when_papersheet_is_present(self):
        ScoreEncodingFactory(global_id=GLOBAL_ID)

        response = self.client.get(self.url,
                                   data={},
                                   follow=True,
                                   HTTP_X_REQUESTED_WITH='XMLHttpRequest')
        self.assertEqual(response.status_code, OK)
コード例 #2
0
class HomeTest(TestCase):
    def setUp(self):
        Group.objects.get_or_create(name='tutors')
        self.person = PersonFactory()
        self.tutor = TutorFactory(person=self.person)

        attribution_permission = Permission.objects.get(
            codename='can_access_attribution')
        self.person.user.user_permissions.add(attribution_permission)

        today = datetime.datetime.today()
        self.academic_year = AcademicYearFactory(
            year=today.year,
            start_date=today - datetime.timedelta(days=5),
            end_date=today + datetime.timedelta(days=5))
        self.learning_unit_year = LearningUnitYearFactory(
            academic_year=self.academic_year)
        self.learning_unit_year.learning_container_year = LearningContainerYearFactory(
            academic_year=self.learning_unit_year.academic_year,
            in_charge=True)
        self.learning_unit_year.save()
        self.attribution = AttributionFactory(
            function=function.CO_HOLDER,
            learning_unit_year=self.learning_unit_year,
            tutor=self.tutor,
            external_id=ATTRIBUTION_EXTERNAL_ID)

        self.url = reverse('attribution_home')
        self.client.force_login(self.person.user)

    def test_user_not_logged(self):
        self.client.logout()
        response = self.client.get(self.url)

        self.assertRedirects(response, "/login/?next={}".format(self.url))

    def test_user_without_permission(self):
        a_person = PersonFactory()
        self.client.force_login(a_person.user)

        response = self.client.get(self.url)

        self.assertEqual(response.status_code, ACCESS_DENIED)
        self.assertTemplateUsed(response, "access_denied.html")

    def test_person_without_global_id(self):
        self.person.global_id = None
        self.person.save()

        response = self.client.get(self.url)

        self.assertTemplateUsed(response, 'tutor_charge.html')

        self.assertEqual(response.context['user'], self.person.user)
        self.assertEqual(response.context['attributions'], None)
        self.assertEqual(response.context['year'],
                         int(self.academic_year.year))
        self.assertEqual(response.context['tot_lecturing'], 0)
        self.assertEqual(response.context['tot_practical'], 0)
        self.assertEqual(response.context['academic_year'], self.academic_year)
        self.assertEqual(response.context['global_id'], None)
        self.assertEqual(response.context['error'], True)

        self.assertIsInstance(response.context['formset'], BaseFormSet)

    def test_user_without_person(self):
        self.person.delete()

        response = self.client.get(self.url)

        self.assertTemplateUsed(response, 'tutor_charge.html')

        self.assertEqual(response.context['user'], None)
        self.assertEqual(response.context['attributions'], None)
        self.assertEqual(response.context['year'],
                         int(self.academic_year.year))
        self.assertEqual(response.context['tot_lecturing'], None)
        self.assertEqual(response.context['tot_practical'], None)
        self.assertEqual(response.context['academic_year'], self.academic_year)
        self.assertEqual(response.context['global_id'], None)
        self.assertEqual(response.context['error'], False)

        self.assertIsInstance(response.context['formset'], BaseFormSet)

    def test_user_without_tutor(self):
        self.tutor.delete()

        response = self.client.get(self.url)

        self.assertTemplateUsed(response, 'tutor_charge.html')

        self.assertEqual(response.context['user'], self.person.user)
        self.assertEqual(response.context['attributions'], None)
        self.assertEqual(response.context['year'],
                         int(self.academic_year.year))
        self.assertEqual(response.context['tot_lecturing'], None)
        self.assertEqual(response.context['tot_practical'], None)
        self.assertEqual(response.context['academic_year'], self.academic_year)
        self.assertEqual(response.context['global_id'], None)
        self.assertEqual(response.context['error'], False)

        self.assertIsInstance(response.context['formset'], BaseFormSet)

    def test_without_current_academic_year(self):
        self.academic_year.year -= 1
        self.academic_year.end_date = datetime.datetime.today(
        ) - datetime.timedelta(days=3)
        self.academic_year.save()

        response = self.client.get(self.url)

        self.assertTemplateUsed(response, 'tutor_charge.html')

        self.assertEqual(response.context['user'], self.person.user)
        self.assertEqual(response.context['attributions'], None)
        self.assertEqual(response.context['year'],
                         int(datetime.datetime.now().year))
        self.assertEqual(response.context['tot_lecturing'], 0)
        self.assertEqual(response.context['tot_practical'], 0)
        self.assertEqual(response.context['academic_year'], None)
        self.assertEqual(response.context['global_id'], None)
        self.assertEqual(response.context['error'], True)

        self.assertIsInstance(response.context['formset'], BaseFormSet)

    @mock.patch('requests.get',
                side_effect=mock_request_none_attribution_charge)
    def test_without_attributions(self, mock_requests_get):
        response = self.client.get(self.url, mock_requests_get)

        self.assertTrue(mock_requests_get.called)

        self.assertTemplateUsed(response, 'tutor_charge.html')

        self.assertEqual(response.context['user'], self.person.user)
        self.assertEqual(response.context['attributions'], None)
        self.assertEqual(response.context['year'],
                         int(self.academic_year.year))
        self.assertEqual(response.context['tot_lecturing'], 0)
        self.assertEqual(response.context['tot_practical'], 0)
        self.assertEqual(response.context['academic_year'], self.academic_year)
        self.assertEqual(response.context['global_id'], self.person.global_id)
        self.assertEqual(response.context['error'], False)

        self.assertIsInstance(response.context['formset'], BaseFormSet)

    @override_settings()
    def test_when_not_configuration_for_attribution(self):
        del settings.ATTRIBUTION_CONFIG

        response = self.client.get(self.url)

        self.assertTemplateUsed(response, 'tutor_charge.html')

        self.assertEqual(response.context['user'], self.person.user)
        self.assertEqual(response.context['attributions'], None)
        self.assertEqual(response.context['year'],
                         int(self.academic_year.year))
        self.assertEqual(response.context['tot_lecturing'], 0)
        self.assertEqual(response.context['tot_practical'], 0)
        self.assertEqual(response.context['academic_year'], self.academic_year)
        self.assertEqual(response.context['global_id'], self.person.global_id)
        self.assertEqual(response.context['error'], True)

        self.assertIsInstance(response.context['formset'], BaseFormSet)

    @mock.patch('requests.get', side_effect=RequestException)
    def test_when_exception_occured_during_request_of_webservice(
            self, mock_requests_get):
        response = self.client.get(self.url)

        self.assertTrue(mock_requests_get.called)

        self.assertTemplateUsed(response, 'tutor_charge.html')

        self.assertEqual(response.context['user'], self.person.user)
        self.assertEqual(response.context['attributions'], None)
        self.assertEqual(response.context['year'],
                         int(self.academic_year.year))
        self.assertEqual(response.context['tot_lecturing'], 0)
        self.assertEqual(response.context['tot_practical'], 0)
        self.assertEqual(response.context['academic_year'], self.academic_year)
        self.assertEqual(response.context['global_id'], self.person.global_id)
        self.assertEqual(response.context['error'], True)

        self.assertIsInstance(response.context['formset'], BaseFormSet)

    @override_settings(ATTRIBUTION_CONFIG=get_attribution_config_settings())
    @mock.patch('requests.get',
                side_effect=mock_request_single_attribution_charge)
    def test_for_one_attribution(self, mock_requests_get):

        response = self.client.get(self.url)

        self.assertTrue(mock_requests_get.called)

        self.assertTemplateUsed(response, 'tutor_charge.html')

        self.assertEqual(response.context['user'], self.person.user)
        self.assertEqual(response.context['year'],
                         int(self.academic_year.year))
        self.assertEqual(response.context['tot_lecturing'],
                         LEARNING_UNIT_LECTURING_DURATION)
        self.assertEqual(response.context['tot_practical'],
                         LEARNING_UNIT_PRACTICAL_EXERCISES_DURATION)
        self.assertEqual(response.context['academic_year'], self.academic_year)
        self.assertEqual(response.context['global_id'], self.person.global_id)
        self.assertEqual(response.context['error'], False)

        self.assertIsInstance(response.context['formset'], BaseFormSet)

        self.assertEqual(len(response.context['attributions']), 1)
        attribution = response.context['attributions'][0]
        self.assertEqual(attribution['acronym'],
                         self.learning_unit_year.acronym)
        self.assertEqual(attribution['title'],
                         self.learning_unit_year.specific_title)
        self.assertEqual(attribution['start_year'],
                         self.attribution.start_year)
        self.assertEqual(attribution['lecturing_allocation_charge'],
                         str(LEARNING_UNIT_LECTURING_DURATION))
        self.assertEqual(attribution['practice_allocation_charge'],
                         str(LEARNING_UNIT_PRACTICAL_EXERCISES_DURATION))
        self.assertEqual(attribution['percentage_allocation_charge'], '75.0')
        self.assertEqual(attribution['weight'],
                         self.learning_unit_year.credits)
        self.assertEqual(attribution['url_schedule'], "")
        self.assertEqual(
            attribution['url_students_list_email'],
            'mailto:{}-{}@listes-student.uclouvain.be'.format(
                self.learning_unit_year.acronym.lower(),
                self.academic_year.year))
        self.assertEqual(attribution['function'], self.attribution.function)
        self.assertEqual(attribution['year'], self.academic_year.year)
        self.assertEqual(attribution['learning_unit_year_url'], "")
        self.assertEqual(attribution['learning_unit_year'],
                         self.learning_unit_year)
        self.assertEqual(attribution['tutor_id'], self.tutor.id)

    @mock.patch('requests.get',
                side_effect=mock_request_multiple_attributions_charge)
    def test_for_multiple_attributions(self, mock_requests_get):
        an_other_attribution = AttributionFactory(
            function=function.CO_HOLDER,
            learning_unit_year=self.learning_unit_year,
            tutor=self.tutor,
            external_id=OTHER_ATTRIBUTION_EXTERNAL_ID)

        response = self.client.get(self.url)

        self.assertTrue(mock_requests_get.called)

        self.assertTemplateUsed(response, 'tutor_charge.html')

        self.assertEqual(response.context['user'], self.person.user)
        self.assertEqual(response.context['year'],
                         int(self.academic_year.year))
        self.assertEqual(response.context['tot_lecturing'],
                         LEARNING_UNIT_LECTURING_DURATION)
        self.assertEqual(response.context['tot_practical'],
                         LEARNING_UNIT_PRACTICAL_EXERCISES_DURATION)
        self.assertEqual(response.context['academic_year'], self.academic_year)
        self.assertEqual(response.context['global_id'], self.person.global_id)
        self.assertEqual(response.context['error'], False)

        self.assertIsInstance(response.context['formset'], BaseFormSet)

        self.assertEqual(len(response.context['attributions']), 2)

    @mock.patch('requests.get',
                side_effect=mock_request_multiple_attributions_charge)
    def test_with_attribution_not_recognized(self, mock_requests_get):
        an_other_attribution = AttributionFactory(
            learning_unit_year=self.learning_unit_year,
            tutor=self.tutor,
            external_id=OTHER_ATTRIBUTION_EXTERNAL_ID)

        inexisting_external_id = "osis.attribution_8082"
        attribution_not_in_json = AttributionFactory(
            learning_unit_year=self.learning_unit_year,
            tutor=self.tutor,
            external_id=inexisting_external_id)

        response = self.client.get(self.url)

        self.assertTrue(mock_requests_get.called)

        self.assertTemplateUsed(response, 'tutor_charge.html')

        self.assertEqual(response.context['user'], self.person.user)
        self.assertEqual(response.context['year'],
                         int(self.academic_year.year))
        self.assertEqual(response.context['tot_lecturing'],
                         LEARNING_UNIT_LECTURING_DURATION)
        self.assertEqual(response.context['tot_practical'],
                         LEARNING_UNIT_PRACTICAL_EXERCISES_DURATION)
        self.assertEqual(response.context['academic_year'], self.academic_year)
        self.assertEqual(response.context['global_id'], self.person.global_id)
        self.assertEqual(response.context['error'], False)

        self.assertIsInstance(response.context['formset'], BaseFormSet)

        self.assertEqual(len(response.context['attributions']), 2)

    @mock.patch(
        'requests.get',
        side_effect=mock_request_multiple_attributions_charge_with_missing_values
    )
    def test_with_missing_values(self, mock_requests_get):
        an_other_attribution = AttributionFactory(
            learning_unit_year=self.learning_unit_year,
            tutor=self.tutor,
            external_id=OTHER_ATTRIBUTION_EXTERNAL_ID)

        response = self.client.get(self.url)

        self.assertTrue(mock_requests_get.called)

        self.assertTemplateUsed(response, 'tutor_charge.html')

        self.assertEqual(response.context['user'], self.person.user)
        self.assertEqual(response.context['year'],
                         int(self.academic_year.year))
        self.assertEqual(response.context['tot_lecturing'],
                         LEARNING_UNIT_LECTURING_DURATION)
        self.assertEqual(response.context['tot_practical'],
                         LEARNING_UNIT_PRACTICAL_EXERCISES_DURATION)
        self.assertEqual(response.context['academic_year'], self.academic_year)
        self.assertEqual(response.context['global_id'], self.person.global_id)
        self.assertEqual(response.context['error'], False)

        self.assertIsInstance(response.context['formset'], BaseFormSet)

        attributions = response.context['attributions']
        reduced_list_attributions = map(
            lambda attribution: [
                attribution["lecturing_allocation_charge"], attribution[
                    'practice_allocation_charge'], attribution[
                        'percentage_allocation_charge']
            ], attributions)
        self.assertIn([str(LEARNING_UNIT_LECTURING_DURATION), None, "25.0"],
                      reduced_list_attributions)
コード例 #3
0
class DownloadPaperSheetTest(TestCase):
    def setUp(self):
        a_person = PersonFactory(global_id=GLOBAL_ID)

        tutors_group = Group.objects.create(name='tutors')
        permission = Permission.objects.get(codename="is_tutor")
        tutors_group.permissions.add(permission)
        a_person.user.groups.add(tutors_group)

        self.tutor = TutorFactory(person=a_person)

        self.url = reverse('scores_download', args=[GLOBAL_ID])
        self.client.force_login(a_person.user)

    def test_when_user_not_tutor(self):
        self.tutor.delete()

        response = self.client.get(self.url, follow=True)
        self.assertEqual(response.status_code, ACCESS_DENIED)

    def test_when_trying_to_access_other_tutor_papersheet(self):
        self.url = reverse('scores_download', args=[OTHER_GLOBAL_ID])
        response = self.client.get(self.url, follow=True)

        self.assertEqual(response.status_code, ACCESS_DENIED)

    def test_when_papersheet_is_not_present(self):
        response = self.client.get(self.url, follow=True)

        self.assertEqual(response.context['scores_sheets_unavailable'], True)
        self.assertTemplateUsed(response, 'scores_sheets.html')

    def test_when_papersheet_is_present(self):
        ScoreEncodingFactory(global_id=GLOBAL_ID)

        response = self.client.get(self.url, follow=True)

        self.assertEqual(response.status_code, OK)
        self.assertEqual(response.get('Content-Type'), 'application/pdf')
        self.assertEqual(
            response.get('Content-Disposition'),
            'attachment; filename="%s"' % ("%s.pdf" % _('scores_sheet')))

    def test_when_person_not_exist_as_faculty_administrator(self):
        self.__set_user_as_faculty_administrator()

        response = self.client.get(self.url, follow=True)

        self.assertEqual(response.status_code, FILE_NOT_FOUND)

    def test_when_person_exists_but_no_papersheet_as_faculty_adminstrator(
            self):
        PersonFactory(global_id=OTHER_GLOBAL_ID)

        self.__set_user_as_faculty_administrator()

        response = self.client.get(self.url, follow=True)

        self.assertEqual(response.context['scores_sheets_unavailable'], True)
        self.assertTemplateUsed(response, 'scores_sheets.html')

    def test_when_faculty_administator(self):
        PersonFactory(global_id=OTHER_GLOBAL_ID)
        ScoreEncodingFactory(global_id=OTHER_GLOBAL_ID)

        self.__set_user_as_faculty_administrator()

        response = self.client.get(self.url, follow=True)

        self.assertEqual(response.status_code, OK)
        self.assertEqual(response.get('Content-Type'), 'application/pdf')
        self.assertEqual(
            response.get('Content-Disposition'),
            'attachment; filename="%s"' % ("%s.pdf" % _('scores_sheet')))

    def __set_user_as_faculty_administrator(self):
        faculty_admin_permission = Permission.objects.get(
            codename="is_faculty_administrator")
        self.tutor.person.user.user_permissions.add(faculty_admin_permission)
        self.url = reverse('scores_download', args=[OTHER_GLOBAL_ID])
コード例 #4
0
class AskPaperSheetTest(TestCase):
    def setUp(self):
        a_person = PersonFactory(global_id=GLOBAL_ID)

        tutors_group = Group.objects.create(name='tutors')
        permission = Permission.objects.get(codename="is_tutor")
        tutors_group.permissions.add(permission)
        a_person.user.groups.add(tutors_group)

        self.tutor = TutorFactory(person=a_person)

        self.url = reverse('ask_papersheet', args=[GLOBAL_ID])
        self.client.force_login(a_person.user)

    def test_when_no_tutor(self):
        self.tutor.delete()

        response = self.client.get(self.url, follow=True)
        self.assertEqual(response.status_code, ACCESS_DENIED)

    def test_when_request_is_post(self):
        response = self.client.post(self.url, data={}, follow=True)
        self.assertEqual(response.status_code, METHOD_NOT_ALLOWED)

    def test_when_request_is_not_ajax(self):
        response = self.client.get(self.url, data={}, follow=True)
        self.assertEqual(response.status_code, ACCESS_DENIED)

    def test_when_no_corresponding_person(self):
        self.url = reverse('ask_papersheet', args=["01010101"])

        response = self.client.get(self.url, follow=True)
        self.assertEqual(response.status_code, ACCESS_DENIED)

    @modify_settings(INSTALLED_APPS={'remove': 'assessments'})
    def test_when_app_not_installed(self):
        response = self.client.get(self.url,
                                   data={},
                                   follow=True,
                                   HTTP_X_REQUESTED_WITH='XMLHttpRequest')
        self.assertEqual(response.status_code, METHOD_NOT_ALLOWED)

    @override_settings(QUEUES="")
    def test_when_no_queues(self):
        response = self.client.get(self.url,
                                   data={},
                                   follow=True,
                                   HTTP_X_REQUESTED_WITH='XMLHttpRequest')
        self.assertEqual(response.status_code, METHOD_NOT_ALLOWED)

    if hasattr(settings, 'QUEUES') and settings.QUEUES:

        @patch('assessments.views.score_encoding.ask_queue_for_papersheet')
        def test_when_exception_occured_when_publishing_to_queue(
                self, mock_ask_queue_for_papersheet):
            from pika.exceptions import ConnectionClosed, ChannelClosed, AMQPError
            side_effects = [
                RuntimeError, ConnectionClosed, ChannelClosed, AMQPError
            ]

            for side_effect in side_effects:
                mock_ask_queue_for_papersheet.side_effect = side_effect

                response = self.client.get(
                    self.url,
                    data={},
                    follow=True,
                    HTTP_X_REQUESTED_WITH='XMLHttpRequest')

                self.assertTrue(mock_ask_queue_for_papersheet.called)
                self.assertEqual(response.status_code, BAD_REQUEST)

        @patch('assessments.views.score_encoding.ask_queue_for_papersheet',
               side_effect=lambda x: False)
        def test_when_message_not_publish_to_queue(
                self, mock_ask_queue_for_papersheet):
            response = self.client.get(self.url,
                                       data={},
                                       follow=True,
                                       HTTP_X_REQUESTED_WITH='XMLHttpRequest')

            self.assertTrue(mock_ask_queue_for_papersheet.called)
            self.assertEqual(response.status_code, METHOD_NOT_ALLOWED)

        @patch('assessments.views.score_encoding.ask_queue_for_papersheet',
               side_effect=lambda x: True)
        def test_when_message_publish_to_queue(self,
                                               mock_ask_queue_for_papersheet):
            response = self.client.get(self.url,
                                       data={},
                                       follow=True,
                                       HTTP_X_REQUESTED_WITH='XMLHttpRequest')

            self.assertTrue(mock_ask_queue_for_papersheet.called)
            self.assertEqual(response.status_code, OK)