示例#1
0
 def setUp(self):
     super().setUp()
     self.group1 = obj_build.build_group(
         group_kwargs={'project': self.visible_public_project})
     self.group2 = obj_build.build_group(
         group_kwargs={'project': self.visible_public_project})
     self.original_num_groups = 2
     self.assertEqual(self.original_num_groups,
                      ag_models.Group.objects.count())
示例#2
0
    def setUp(self):
        super().setUp()

        self.group = obj_build.build_group()
        self.project = self.group.project
        self.course = self.project.course

        self.group_dir_basename = 'group{}'.format(self.group.pk)
        self.course_dirname = 'course{}'.format(self.course.pk)
        self.project_dirname = 'project{}'.format(self.project.pk)
示例#3
0
    def test_error_merge_groups_diff_projects(self):
        group_diff_proj = obj_build.build_group(
            group_kwargs={'project': self.visible_private_project})
        self.assertNotEqual(self.group1.project, group_diff_proj.project)
        with self.assert_queryset_count_unchanged(ag_models.Group.objects):
            self.client.force_authenticate(self.admin)
            response = self.client.post(
                self.get_merge_url(self.group1, group_diff_proj))

        self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code)
        self.assertIn('groups', response.data)
示例#4
0
    def test_position_in_queue_multiple_projects(self):
        """
        Makes sure that position in queue is calculated per-project
        """
        project1 = obj_build.build_project()
        group1_proj1 = obj_build.build_group(
            group_kwargs={'project': project1})
        group2_proj1 = obj_build.build_group(
            group_kwargs={'project': project1})

        project2 = obj_build.build_project()
        group1_proj2 = obj_build.build_group(
            group_kwargs={'project': project2})
        group2_proj2 = obj_build.build_group(
            group_kwargs={'project': project2})

        group1_p1 = obj_build.make_submission(group=group1_proj1)
        group1_p1.status = (ag_models.Submission.GradingStatus.queued)
        group1_p1.save()
        group1_p1_queue_pos = 1

        group2_p1 = obj_build.make_submission(group=group2_proj1)
        group2_p1.status = (ag_models.Submission.GradingStatus.queued)
        group2_p1.save()
        group2_p1_queue_pos = 2

        group1_p2 = obj_build.make_submission(group=group1_proj2)
        group1_p2.status = (ag_models.Submission.GradingStatus.queued)
        group1_p2.save()
        group1_p2_queue_pos = 1

        group2_p2 = obj_build.make_submission(group=group2_proj2)
        group2_p2.status = (ag_models.Submission.GradingStatus.queued)
        group2_p2.save()
        group2_p2_queue_pos = 2

        self.assertEqual(group1_p1_queue_pos, group1_p1.position_in_queue)
        self.assertEqual(group2_p1_queue_pos, group2_p1.position_in_queue)
        self.assertEqual(group1_p2_queue_pos, group1_p2.position_in_queue)
        self.assertEqual(group2_p2_queue_pos, group2_p2.position_in_queue)
示例#5
0
    def test_update(self):
        group = obj_build.build_group()
        submission = ag_models.Submission.objects.validate_and_create(
            [], group=group)
        self.assertTrue(submission.count_towards_daily_limit)

        serializer = ag_serializers.SubmissionSerializer(
            submission, data={'count_towards_daily_limit': False})
        serializer.is_valid()
        serializer.save()

        submission.refresh_from_db()

        self.assertFalse(submission.count_towards_daily_limit)
示例#6
0
 def test_serializable_fields(self):
     expected = [
         'pk',
         'group',
         'timestamp',
         'submitter',
         'submitted_filenames',
         'discarded_files',
         'missing_files',
         'status',
         'count_towards_daily_limit',
         'is_past_daily_limit',
         'is_bonus_submission',
         'count_towards_total_limit',
         'does_not_count_for',
         'position_in_queue',
     ]
     self.assertCountEqual(expected,
                           ag_models.Submission.get_serializable_fields())
     group = obj_build.build_group()
     submission = ag_models.Submission(group=group)
     self.assertTrue(submission.to_dict())
示例#7
0
    def setUp(self):
        super().setUp()

        self.group = obj_build.build_group(num_members=2)
        self.project = self.group.project

        expected_files = [{
            'project': self.project,
            'pattern': 'spam.cpp'
        }, {
            'project': self.project,
            'pattern': 'eggs.cpp'
        }, {
            'project': self.project,
            'pattern': 'test_*.cpp',
            'min_num_matches': 1,
            'max_num_matches': 2
        }]

        for expected_file_dict in expected_files:
            ag_models.ExpectedStudentFile.objects.validate_and_create(
                **expected_file_dict)
示例#8
0
    def test_serializable_fields(self):
        expected_fields = [
            'pk',
            'member_names',
            'project',
            'extended_due_date',

            'bonus_submissions_remaining',

            'late_days_used',

            'num_submits_towards_limit',
            'num_submissions',

            'created_at',
        ]

        self.assertCountEqual(
            expected_fields,
            ag_models.Group.get_serializable_fields())

        group = obj_build.build_group()
        self.assertTrue(group.to_dict())
示例#9
0
    def test_create(self):
        files = [
            SimpleUploadedFile('spam', b'spammo'),
            SimpleUploadedFile('egg', b'waaaaluigi')
        ]
        data = QueryDict(mutable=True)
        data['group'] = obj_build.build_group()
        # We are adding the files one at a time because of the way that
        # QueryDict appends values to lists
        for file_ in files:
            data.update({'submitted_files': file_})
        # Sanity check for data contents
        self.assertCountEqual(files, data.getlist('submitted_files'))
        self.assertEqual(QueryDict, type(data))

        serializer = ag_serializers.SubmissionSerializer(data=data)
        serializer.is_valid()
        serializer.save()

        self.assertEqual(1, ag_models.Submission.objects.count())
        loaded = ag_models.Submission.objects.first()

        self.assertCountEqual((file_.name for file_ in files),
                              loaded.discarded_files)
示例#10
0
 def test_serialize(self):
     group = obj_build.build_group()
     submission = ag_models.Submission.objects.validate_and_create(
         submitted_files=[], group=group)
     self.do_basic_serialize_test(submission,
                                  ag_serializers.SubmissionSerializer)
示例#11
0
 def test_serialize(self):
     group = obj_build.build_group()
     self.do_basic_serialize_test(group,
                                  ag_serializers.SubmissionGroupSerializer)
    def test_move_ag_test_case_to_different_suite_in_same_project(self):
        other_suite = ag_models.AGTestSuite.objects.validate_and_create(
            name='fa;weifjawef',
            project=self.project)  # type: ag_models.AGTestSuite

        ag_test = ag_models.AGTestCase.objects.validate_and_create(
            name='asdlkfjaewi;ojf',
            ag_test_suite=self.ag_suite)  # type: ag_models.AGTestCase
        cmd = ag_models.AGTestCommand.objects.validate_and_create(
            name='asdfknja;wej',
            ag_test_case=ag_test,
            cmd='asdklfja;sdjkfaldsf')  # type: ag_models.AGTestCommand

        # This group has results for ONLY self.ag_suite
        submission = obj_build.make_submission(group=obj_build.build_group(
            group_kwargs={'project': self.project}))
        suite_result = ag_models.AGTestSuiteResult.objects.validate_and_create(
            submission=submission,
            ag_test_suite=self.ag_suite)  # type: ag_models.AGTestSuiteResult
        ag_test_result = ag_models.AGTestCaseResult.objects.validate_and_create(
            ag_test_case=ag_test, ag_test_suite_result=suite_result
        )  # type: ag_models.AGTestCaseResult
        cmd_result = obj_build.make_correct_ag_test_command_result(
            cmd, ag_test_result)

        # This group has results for self.ag_suite and other_suite
        submission2 = obj_build.make_submission(group=obj_build.build_group(
            group_kwargs={'project': self.project}))
        suite_result2 = ag_models.AGTestSuiteResult.objects.validate_and_create(
            submission=submission2,
            ag_test_suite=self.ag_suite)  # type: ag_models.AGTestSuiteResult
        ag_test_result2 = ag_models.AGTestCaseResult.objects.validate_and_create(
            ag_test_case=ag_test, ag_test_suite_result=suite_result2
        )  # type: ag_models.AGTestCaseResult
        cmd_result2 = obj_build.make_correct_ag_test_command_result(
            cmd, ag_test_result2)
        other_suite_result = ag_models.AGTestSuiteResult.objects.validate_and_create(
            submission=submission2,
            ag_test_suite=other_suite)  # type: ag_models.AGTestSuiteResult

        self.assertEqual(self.ag_suite, ag_test.ag_test_suite)

        # This that should be re-wired after this line:
        # - ag_test should belong to other_suite
        # - AGTestCaseResults should point to suite results in their
        #   own submissions that belong to other_suite (creating them
        #   if necessary).
        ag_test.validate_and_update(ag_test_suite=other_suite)

        other_suite = ag_models.AGTestSuite.objects.get(pk=other_suite.pk)
        self.assertSequenceEqual([ag_test], other_suite.ag_test_cases.all())

        self.ag_suite.refresh_from_db()
        self.assertSequenceEqual([], self.ag_suite.ag_test_cases.all())

        # An AGTestSuiteResult for other_suite should have been created for submission.
        self.assertEqual(2, submission.ag_test_suite_results.count())
        self.assertEqual(suite_result,
                         submission.ag_test_suite_results.first())
        new_other_suite_result = submission.ag_test_suite_results.last()
        self.assertEqual(other_suite, new_other_suite_result.ag_test_suite)

        # ag_test should belong to other_suite
        self.assertEqual(other_suite, ag_test.ag_test_suite)

        # ag_test_result should belong to new_other_suite_result
        ag_test_result.refresh_from_db()
        self.assertEqual(new_other_suite_result,
                         ag_test_result.ag_test_suite_result)

        # ag_test_result2 should belong to other_suite_result
        ag_test_result2.refresh_from_db()
        self.assertEqual(other_suite_result,
                         ag_test_result2.ag_test_suite_result)

        # Make sure no errors are thrown
        get_suite_fdbk(suite_result,
                       ag_models.FeedbackCategory.max).ag_test_case_results
        get_suite_fdbk(suite_result2,
                       ag_models.FeedbackCategory.max).ag_test_case_results
        get_suite_fdbk(new_other_suite_result,
                       ag_models.FeedbackCategory.max).ag_test_case_results