Пример #1
0
 def test_error_non_unique_name(self):
     course = obj_build.make_course()
     with self.assertRaises(exceptions.ValidationError):
         copy_course(course,
                     new_course_name=course.name,
                     new_course_semester=None,
                     new_course_year=None)
    def test_admin_change_late_day_count_for_other_course_permission_denied(
            self):
        admin = obj_build.make_admin_user(self.course)

        # Student for other course
        other_course = obj_build.make_course()
        other_course_student = obj_build.make_student_user(other_course)
        self.assertFalse(other_course.is_admin(admin))

        self.client.force_authenticate(admin)
        response = self.client.put(
            self.get_pk_url(other_course_student, other_course),
            {'late_days_remaining': 10})
        self.assertEqual(status.HTTP_403_FORBIDDEN, response.status_code)

        response = self.client.put(
            self.get_username_url(other_course_student, other_course),
            {'late_days_remaining': 10})
        self.assertEqual(status.HTTP_403_FORBIDDEN, response.status_code)

        # Guest for other course
        other_guest = obj_build.make_user()
        response = self.client.put(self.get_pk_url(other_guest, other_course),
                                   {'late_days_remaining': 7})
        self.assertEqual(status.HTTP_403_FORBIDDEN, response.status_code)

        other_guest = obj_build.make_user()
        response = self.client.put(
            self.get_username_url(other_guest, other_course),
            {'late_days_remaining': 7})
        self.assertEqual(status.HTTP_403_FORBIDDEN, response.status_code)
    def test_staff_view_late_day_count_for_other_course_permission_denied(
            self):
        staff = obj_build.make_staff_user(self.course)

        # Student for other course
        other_course = obj_build.make_course()
        other_course_student = obj_build.make_student_user(other_course)
        self.assertFalse(other_course.is_staff(staff))

        self.client.force_authenticate(staff)
        response = self.client.get(
            self.get_pk_url(other_course_student, other_course))
        self.assertEqual(status.HTTP_403_FORBIDDEN, response.status_code)

        response = self.client.get(
            self.get_username_url(other_course_student, other_course))
        self.assertEqual(status.HTTP_403_FORBIDDEN, response.status_code)

        # Guest for other course
        other_guest = obj_build.make_user()
        response = self.client.get(self.get_pk_url(other_guest, other_course))
        self.assertEqual(status.HTTP_403_FORBIDDEN, response.status_code)

        response = self.client.get(
            self.get_username_url(other_guest, other_course))
        self.assertEqual(status.HTTP_403_FORBIDDEN, response.status_code)
    def setUp(self):
        super().setUp()
        self.client = APIClient()

        self.initial_num_late_days = 4
        self.course = obj_build.make_course(
            num_late_days=self.initial_num_late_days)
Пример #5
0
    def test_is_admin(self):
        self.course = obj_build.make_course()
        self.user = obj_build.create_dummy_user()

        self.assertFalse(self.course.is_admin(self.user))

        self.course.admins.add(self.user)
        self.assertTrue(self.course.is_admin(self.user))
    def setUp(self):
        super().setUp()

        self.client = APIClient()
        self.project = obj_build.make_project()
        self.admin = obj_build.make_admin_user(self.project.course)

        self.other_course = obj_build.make_course()
        self.other_course.admins.add(self.admin)
    def setUp(self):
        super().setUp()
        self.course = obj_build.make_course()
        self.client = APIClient()
        self.url = reverse('course-staff', kwargs={'pk': self.course.pk})

        [self.admin] = obj_build.make_admin_users(self.course, 1)
        [self.student] = obj_build.make_student_users(self.course, 1)
        [self.guest] = obj_build.make_users(1)
        [self.handgrader] = obj_build.make_handgrader_users(self.course, 1)
    def test_get_course_by_pk(self):
        course = obj_build.make_course()
        [admin] = obj_build.make_admin_users(course, 1)
        [guest] = obj_build.make_users(1)

        for user in admin, guest:
            self.client.force_authenticate(user)
            response = self.client.get(
                reverse('course-detail', kwargs={'pk': course.pk}))

            self.assertEqual(status.HTTP_200_OK, response.status_code)
            self.assertEqual(course.to_dict(), response.data)
    def test_get_num_queued_submissions(self):
        client = APIClient()

        course = obj_build.make_course()
        admin = obj_build.make_admin_user(course)
        proj_kwargs = {'visible_to_students': True, 'guests_can_submit': True}
        no_submits = obj_build.make_project(course, **proj_kwargs)
        with_submits1 = obj_build.make_project(course, **proj_kwargs)
        with_submits2 = obj_build.make_project(course, **proj_kwargs)

        group_with_submits1 = obj_build.make_group(project=with_submits1)
        group_with_submits2 = obj_build.make_group(project=with_submits2)

        g1_statuses = [
            ag_models.Submission.GradingStatus.queued,
            ag_models.Submission.GradingStatus.finished_grading,
            ag_models.Submission.GradingStatus.removed_from_queue,
            ag_models.Submission.GradingStatus.received,
            ag_models.Submission.GradingStatus.being_graded,
            ag_models.Submission.GradingStatus.error
        ]

        for grading_status in g1_statuses:
            obj_build.make_submission(status=grading_status,
                                      group=group_with_submits1)

        for i in range(3):
            obj_build.make_submission(
                status=ag_models.Submission.GradingStatus.queued,
                group=group_with_submits2)

        client.force_authenticate(admin)
        response = client.get(
            reverse('project-num-queued-submissions',
                    kwargs={'pk': no_submits.pk}))
        self.assertEqual(status.HTTP_200_OK, response.status_code)
        self.assertEqual(0, response.data)

        response = client.get(
            reverse('project-num-queued-submissions',
                    kwargs={'pk': with_submits1.pk}))
        self.assertEqual(status.HTTP_200_OK, response.status_code)
        self.assertEqual(1, response.data)

        response = client.get(
            reverse('project-num-queued-submissions',
                    kwargs={'pk': with_submits2.pk}))
        self.assertEqual(status.HTTP_200_OK, response.status_code)
        self.assertEqual(3, response.data)
    def test_invalid_semester(self):
        course = obj_build.make_course(semester=ag_models.Semester.winter,
                                       year=2019)
        url = reverse('course-by-fields',
                      kwargs={
                          'name': course.name,
                          'semester': 'bad',
                          'year': course.year
                      })

        guest = obj_build.make_user()

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

        self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code)
    def setUp(self):
        super().setUp()
        self.maxDiff = None

        self.client = APIClient()
        self.course = obj_build.make_course()
        self.project = obj_build.make_project(course=self.course)
        self.assertEqual(ag_models.UltimateSubmissionPolicy.most_recent,
                         self.project.ultimate_submission_policy)

        self.rubric = hg_models.HandgradingRubric.objects.validate_and_create(
            project=self.project,
            points_style=hg_models.PointsStyle.start_at_max_and_subtract,
            max_points=43)

        [self.staff] = obj_build.make_staff_users(self.course, 1)
        [self.handgrader] = obj_build.make_handgrader_users(self.course, 1)
    def test_get_course_by_name_semester_and_year(self):
        course = obj_build.make_course(semester=ag_models.Semester.winter,
                                       year=2019)
        url = reverse('course-by-fields',
                      kwargs={
                          'name': course.name,
                          'semester': course.semester.value,
                          'year': course.year
                      })

        guest = obj_build.make_user()

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

        self.assertEqual(status.HTTP_200_OK, response.status_code)
        self.assertEqual(course.to_dict(), response.data)
Пример #13
0
    def test_serialization(self):
        expected_fields = [
            'pk',
            'name',
            'semester',
            'year',
            'subtitle',
            'num_late_days',
            'last_modified',
        ]

        course = obj_build.make_course()
        serialized = course.to_dict()

        self.assertCountEqual(expected_fields, serialized.keys())

        serialized.pop('pk')
        serialized.pop('last_modified')

        course.validate_and_update(**serialized)
    def test_superuser_view_calls_copy_course(self):
        superuser = obj_build.make_user(superuser=True)

        dummy_course = obj_build.make_course()
        mock_copy_course = mock.Mock(return_value=dummy_course)
        with mock.patch(
                'autograder.rest_api.views.course_views.course_views.copy_course',
                new=mock_copy_course):
            self.client.force_authenticate(superuser)
            response = self.client.post(
                reverse('copy-course', kwargs={'course_pk': self.course.pk}), {
                    'new_name': 'Clone',
                    'new_semester': ag_models.Semester.winter.value,
                    'new_year': 2020
                })

            mock_copy_course.assert_called_once_with(
                course=self.course,
                new_course_name='Clone',
                new_course_semester=ag_models.Semester.winter,
                new_course_year=2020)
    def test_user_can_copy_course_and_is_admin_view_calls_copy_course(self):
        user = obj_build.make_admin_user(self.course)
        user.user_permissions.add(
            Permission.objects.get(codename='create_course'))

        dummy_course = obj_build.make_course()
        mock_copy_course = mock.Mock(return_value=dummy_course)
        with mock.patch(
                'autograder.rest_api.views.course_views.course_views.copy_course',
                new=mock_copy_course):
            self.client.force_authenticate(user)
            response = self.client.post(
                reverse('copy-course', kwargs={'course_pk': self.course.pk}), {
                    'new_name': 'Cloney',
                    'new_semester': ag_models.Semester.spring.value,
                    'new_year': 2021
                })

            mock_copy_course.assert_called_once_with(
                course=self.course,
                new_course_name='Cloney',
                new_course_semester=ag_models.Semester.spring,
                new_course_year=2021)
    def setUp(self):
        super().setUp()

        self.client = APIClient()
        self.course = obj_build.make_course()
Пример #17
0
    def setUp(self):
        super().setUp()

        self.course = obj_build.make_course()
        self.user = obj_build.create_dummy_user()
Пример #18
0
    def test_copy_project(self):
        # In new project, hide_ultimate_submission_fdbk should be set to True,
        # visible_to_students should be set to False,
        # and guests_can_submit should be set to False
        project = obj_build.make_project(hide_ultimate_submission_fdbk=False,
                                         visible_to_students=True)
        instructor_file1 = obj_build.make_instructor_file(project)
        instructor_file2 = obj_build.make_instructor_file(project)
        student_file1 = obj_build.make_expected_student_file(project)
        student_file2 = obj_build.make_expected_student_file(project)

        suite1 = obj_build.make_ag_test_suite(
            project,
            instructor_files_needed=[instructor_file1],
            student_files_needed=[student_file1])
        case1 = obj_build.make_ag_test_case(suite1)
        cmd1 = obj_build.make_full_ag_test_command(
            case1,
            expected_stderr_source=ag_models.ExpectedOutputSource.
            instructor_file,
            expected_stderr_instructor_file=instructor_file2)
        cmd2 = obj_build.make_full_ag_test_command(
            case1,
            set_arbitrary_points=False,
            expected_stdout_source=ag_models.ExpectedOutputSource.
            instructor_file,
            expected_stdout_instructor_file=instructor_file1)

        suite2 = obj_build.make_ag_test_suite(
            project,
            instructor_files_needed=[instructor_file1, instructor_file2],
            student_files_needed=[student_file2])
        case2 = obj_build.make_ag_test_case(suite2)
        cmd3 = obj_build.make_full_ag_test_command(
            case2,
            set_arbitrary_expected_vals=False,
            stdin_source=ag_models.StdinSource.instructor_file,
            stdin_instructor_file=instructor_file2)
        case3 = obj_build.make_ag_test_case(suite2)

        suite3 = obj_build.make_ag_test_suite(project)

        student_suite1 = obj_build.make_student_test_suite(
            project,
            instructor_files_needed=[instructor_file1, instructor_file2],
            student_files_needed=[student_file1],
            setup_command={
                'name': 'stave',
                'cmd': 'yorp'
            })

        student_suite2 = obj_build.make_student_test_suite(
            project,
            instructor_files_needed=[instructor_file1],
            student_files_needed=[student_file1, student_file2])

        student_suite3 = obj_build.make_student_test_suite(project)

        other_course = obj_build.make_course()
        new_project = copy_project(project, other_course)
        self.assertTrue(new_project.hide_ultimate_submission_fdbk)
        self.assertFalse(new_project.visible_to_students)

        self.assertEqual(project.name, new_project.name)
        self.assertEqual(other_course, new_project.course)
        self.assertNotEqual(project.course, other_course)

        ignore_fields = [
            'pk', 'course', 'last_modified', 'instructor_files',
            'expected_student_files'
        ]
        expected_ag_tests = _pop_many(project.to_dict(), ignore_fields)
        expected_ag_tests.update({
            'visible_to_students': False,
            'hide_ultimate_submission_fdbk': True
        })
        self.assertEqual(expected_ag_tests,
                         _pop_many(new_project.to_dict(), ignore_fields))

        self.assertEqual(project.instructor_files.count(),
                         new_project.instructor_files.count())
        for old_file, new_file in itertools.zip_longest(
                sorted(project.instructor_files.all(),
                       key=lambda obj: obj.name),
                sorted(new_project.instructor_files.all(),
                       key=lambda obj: obj.name)):
            self.assertNotEqual(new_file.pk, old_file.pk)
            self.assertNotEqual(new_file.abspath, old_file.abspath)

            self.assertEqual(old_file.name, new_file.name)
            with old_file.open() as old_f, new_file.open() as new_f:
                self.assertEqual(old_f.read(), new_f.read())

        self.assertEqual(project.expected_student_files.count(),
                         new_project.expected_student_files.count())
        for old_expected_file, new_expected_file in itertools.zip_longest(
                project.expected_student_files.order_by('pattern'),
                new_project.expected_student_files.order_by('pattern')):
            self.assertNotEqual(old_expected_file.pk, new_expected_file.pk)

            self.assertEqual(
                _pop_many(old_expected_file.to_dict(), ['pk', 'project']),
                _pop_many(new_expected_file.to_dict(), ['pk', 'project']))

        old_suite_pks = {suite.pk for suite in project.ag_test_suites.all()}
        new_suite_pks = {
            suite.pk
            for suite in new_project.ag_test_suites.all()
        }
        self.assertTrue(old_suite_pks.isdisjoint(new_suite_pks))

        old_case_pks = {
            case.pk
            for case in ag_models.AGTestCase.objects.filter(
                ag_test_suite__project=project)
        }
 def setUp(self):
     super().setUp()
     self.client = APIClient()
     self.course = obj_build.make_course()
     self.url = reverse('projects', kwargs={'pk': self.course.pk})
 def setUp(self):
     super().setUp()
     self.client = APIClient()
     self.course = obj_build.make_course()
     [self.guest] = obj_build.make_users(1)
 def setUp(self):
     super().setUp()
     self.client = APIClient()
     self.courses = [obj_build.make_course() for i in range(4)]