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