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)
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)
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])
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)