def test_all_suites_deferred(self, *args): suite1 = obj_build.make_ag_test_suite(self.project, deferred=True) case1 = obj_build.make_ag_test_case(suite1) cmd1 = obj_build.make_full_ag_test_command( case1, set_arbitrary_points=False, set_arbitrary_expected_vals=False, expected_return_code=ag_models.ExpectedReturnCode.zero, points_for_correct_return_code=1) suite2 = obj_build.make_ag_test_suite(self.project, deferred=True) case2 = obj_build.make_ag_test_case(suite2) cmd2 = obj_build.make_full_ag_test_command( case2, set_arbitrary_points=False, set_arbitrary_expected_vals=False, expected_return_code=ag_models.ExpectedReturnCode.zero, points_for_correct_return_code=2) tasks.grade_submission(self.submission.pk) self.submission.refresh_from_db() self.assertEqual( 3, get_submission_fdbk(self.submission, ag_models.FeedbackCategory.max).total_points) self.assertEqual(ag_models.Submission.GradingStatus.finished_grading, self.submission.status)
def test_one_ag_suite_deferred_one_student_suite_deferred(self, *args): suite1 = obj_build.make_ag_test_suite(self.project, deferred=False) case1 = obj_build.make_ag_test_case(suite1) cmd1 = obj_build.make_full_ag_test_command( case1, set_arbitrary_points=False, set_arbitrary_expected_vals=False, expected_return_code=ag_models.ExpectedReturnCode.zero, points_for_correct_return_code=1) suite2 = obj_build.make_ag_test_suite(self.project, deferred=True) case2 = obj_build.make_ag_test_case(suite2) cmd2 = obj_build.make_full_ag_test_command( case2, set_arbitrary_points=False, set_arbitrary_expected_vals=False, expected_return_code=ag_models.ExpectedReturnCode.zero, points_for_correct_return_code=2) deferred_student_suite = ag_models.StudentTestSuite.objects.validate_and_create( name='deferryyyy', project=self.project, deferred=True) tasks.grade_submission(self.submission.pk) self.submission.refresh_from_db() self.assertEqual( 3, get_submission_fdbk(self.submission, ag_models.FeedbackCategory.max).total_points) self.assertEqual(ag_models.Submission.GradingStatus.finished_grading, self.submission.status) deferred_student_suite_result = ag_models.StudentTestSuiteResult.objects.get( submission=self.submission, student_test_suite=deferred_student_suite)
def setUp(self): super().setUp() self.cmd1 = obj_build.make_full_ag_test_command() self.ag_test_case = self.cmd1.ag_test_case self.cmd2 = obj_build.make_full_ag_test_command(self.ag_test_case) self.course = self.ag_test_case.ag_test_suite.project.course self.client = APIClient() self.url = reverse('ag_test_commands', kwargs={'ag_test_case_pk': self.ag_test_case.pk})
def setUp(self): super().setUp() submission = obj_build.make_submission() self.project = submission.group.project suite1 = ag_models.AGTestSuite.objects.validate_and_create( name='kajsdhf', project=self.project) self.ag_test_case1 = ag_models.AGTestCase.objects.validate_and_create( name='aksdbva', ag_test_suite=suite1) self.ag_test_case2 = ag_models.AGTestCase.objects.validate_and_create( name='noniresta', ag_test_suite=suite1) suite_result = ag_models.AGTestSuiteResult.objects.validate_and_create( submission=submission, ag_test_suite=suite1) self.ag_test_case1_correct_result = ag_models.AGTestCaseResult.objects.validate_and_create( ag_test_case=self.ag_test_case1, ag_test_suite_result=suite_result) self.ag_test_case2_incorrect_result = ( ag_models.AGTestCaseResult.objects.validate_and_create( ag_test_case=self.ag_test_case2, ag_test_suite_result=suite_result) ) self.ag_test_case1_cmd = obj_build.make_full_ag_test_command( self.ag_test_case1, first_failed_test_normal_fdbk_config=( ag_models.NewAGTestCommandFeedbackConfig.max_fdbk_config()) ) self.total_points_possible = (self.ag_test_case1_cmd.points_for_correct_return_code + self.ag_test_case1_cmd.points_for_correct_stdout + self.ag_test_case1_cmd.points_for_correct_stderr) self.ag_test_case2_cmd = obj_build.make_full_ag_test_command( self.ag_test_case2, first_failed_test_normal_fdbk_config=( ag_models.NewAGTestCommandFeedbackConfig.max_fdbk_config()) ) self.case1_cmd_res = obj_build.make_correct_ag_test_command_result( self.ag_test_case1_cmd, ag_test_case_result=self.ag_test_case1_correct_result) self.case2_cmd_res = obj_build.make_incorrect_ag_test_command_result( self.ag_test_case2_cmd, ag_test_case_result=self.ag_test_case2_incorrect_result) case1_max_fdbk = get_case_fdbk( self.ag_test_case1_correct_result, ag_models.FeedbackCategory.max) self.assertEqual(self.total_points_possible, case1_max_fdbk.total_points) self.assertEqual(self.total_points_possible, case1_max_fdbk.total_points_possible) case2_max_fdbk = get_case_fdbk( self.ag_test_case2_incorrect_result, ag_models.FeedbackCategory.max) self.assertEqual(0, case2_max_fdbk.total_points) self.assertEqual(self.total_points_possible, case2_max_fdbk.total_points_possible)
def test_one_ag_suite_one_non_deferred_student_suite_one_deferred_student_suite(self, *args): ag_suite = obj_build.make_ag_test_suite(self.project) ag_case = obj_build.make_ag_test_case(ag_suite) print_to_stdout_and_stderr = "bash -c 'printf hello; printf whoops >&2'" ag_cmd = obj_build.make_full_ag_test_command(ag_case, cmd=print_to_stdout_and_stderr) student_suite = ag_models.StudentTestSuite.objects.validate_and_create( name='mnkfoae', project=self.project) deferred_student_suite = ag_models.StudentTestSuite.objects.validate_and_create( name='deferryyyy', project=self.project, deferred=True) tasks.grade_submission(self.submission.pk) cmd_result = ag_models.AGTestCommandResult.objects.get( ag_test_command=ag_cmd, ag_test_case_result__ag_test_suite_result__submission=self.submission) student_suite_result = ag_models.StudentTestSuiteResult.objects.get( submission=self.submission, student_test_suite=student_suite) deferred_student_suite_result = ag_models.StudentTestSuiteResult.objects.get( submission=self.submission, student_test_suite=deferred_student_suite)
def test_points_awarded_and_deducted(self, *args): cmd = obj_build.make_full_ag_test_command( self.ag_test_case, set_arbitrary_points=False, set_arbitrary_expected_vals=False, cmd='printf hello', expected_return_code=ag_models.ExpectedReturnCode.nonzero, expected_stdout_source=ag_models.ExpectedOutputSource.text, expected_stdout_text='hello', deduction_for_wrong_return_code=-1, points_for_correct_stdout=3) tasks.grade_submission(self.submission.pk) self.submission.refresh_from_db() res = ag_models.AGTestCommandResult.objects.get(ag_test_command=cmd) self.assertTrue(res.stdout_correct) self.assertFalse(res.return_code_correct) self.assertEqual( 2, get_submission_fdbk(self.submission, ag_models.FeedbackCategory.max).total_points) self.assertEqual( 3, get_submission_fdbk( self.submission, ag_models.FeedbackCategory.max).total_points_possible)
def test_diff_ignore_case_whitespace_changes_and_blank_lines(self, *args): cmd = obj_build.make_full_ag_test_command( self.ag_test_case, set_arbitrary_points=False, set_arbitrary_expected_vals=False, cmd= """bash -c 'printf "HELLO world\n\n\n"; printf "lol WUT\n\n" >&2'""", expected_stdout_source=ag_models.ExpectedOutputSource.text, expected_stdout_text='hello world\n', expected_stderr_source=ag_models.ExpectedOutputSource.text, expected_stderr_text='lol wut\n', points_for_correct_stdout=4, points_for_correct_stderr=2, ignore_case=True, ignore_whitespace_changes=True, ignore_blank_lines=True) tasks.grade_submission(self.submission.pk) self.submission.refresh_from_db() res = ag_models.AGTestCommandResult.objects.get(ag_test_command=cmd) self.assertTrue(res.stdout_correct) self.assertTrue(res.stderr_correct) self.assertEqual( 6, get_submission_fdbk(self.submission, ag_models.FeedbackCategory.max).total_points)
def setUp(self): super().setUp() self.maxDiff = None self.project = obj_build.make_project( # Future closing_time closing_time=timezone.now() + datetime.timedelta(days=1)) self.course = self.project.course self.ag_test_suite = obj_build.make_ag_test_suite(self.project) self.ag_test_case = obj_build.make_ag_test_case(self.ag_test_suite) self.ag_test_cmd = obj_build.make_full_ag_test_command( self.ag_test_case) self.student_test_suite = obj_build.make_student_test_suite( self.project) self.client = APIClient() self.base_url = reverse('all-ultimate-submission-results', kwargs={'project_pk': self.project.pk}) # For use by self._make_group_with_submissions only self._num_groups = 0 # This is to make sure we use the right group queryset other_project = obj_build.make_project() other_group = obj_build.make_group(project=other_project) other_submission = obj_build.make_finished_submission(other_group)
def setUp(self): super().setUp() self.maxDiff = None submission = obj_build.make_submission() project = submission.group.project self.ag_test_suite = ag_models.AGTestSuite.objects.validate_and_create( name='kajsdhf', project=project, setup_suite_cmd_name='asdlkjfa;skldjf;aksdf' ) # type: ag_models.AGTestSuite self.ag_test_case1 = ag_models.AGTestCase.objects.validate_and_create( name='aksdbva', ag_test_suite=self.ag_test_suite) # type: ag_models.AGTestCase self.ag_test_case2 = ag_models.AGTestCase.objects.validate_and_create( name='ndkaadjhfa', ag_test_suite=self.ag_test_suite, ) # type: ag_models.AGTestCase self.ag_test_cmd1 = obj_build.make_full_ag_test_command( self.ag_test_case1, set_arbitrary_points=False, points_for_correct_return_code=4) self.ag_test_cmd2 = obj_build.make_full_ag_test_command( self.ag_test_case2, set_arbitrary_points=False, points_for_correct_return_code=5) self.total_points = 9 self.ag_test_suite_result = ag_models.AGTestSuiteResult.objects.validate_and_create( submission=submission, ag_test_suite=self.ag_test_suite ) # type: ag_models.AGTestSuiteResult self.ag_test_case_result1 = ag_models.AGTestCaseResult.objects.validate_and_create( ag_test_case=self.ag_test_case1, ag_test_suite_result=self.ag_test_suite_result ) # type: ag_models.AGTestCaseResult self.ag_test_case_result2 = ag_models.AGTestCaseResult.objects.validate_and_create( ag_test_case=self.ag_test_case2, ag_test_suite_result=self.ag_test_suite_result ) # type: ag_models.AGTestCaseResult self.cmd_result1 = obj_build.make_correct_ag_test_command_result( self.ag_test_cmd1, self.ag_test_case_result1) self.cmd_result2 = obj_build.make_correct_ag_test_command_result( self.ag_test_cmd2, self.ag_test_case_result2)
def setUp(self): super().setUp() self.maxDiff = None self.client = APIClient() self.project = obj_build.make_project( ultimate_submission_policy=ag_models.UltimateSubmissionPolicy. most_recent, ) self.url = reverse('project-ultimate-submission-scores', kwargs={'pk': self.project.pk}) self.admin = obj_build.make_admin_user(self.project.course) self.ag_test_suite = obj_build.make_ag_test_suite(project=self.project) self.ag_test_case = obj_build.make_ag_test_case( ag_test_suite=self.ag_test_suite) self.ag_test_cmd = obj_build.make_full_ag_test_command( ag_test_case=self.ag_test_case) self.student_group = obj_build.make_group(project=self.project, num_members=2) self.student_submission = obj_build.make_finished_submission( self.student_group) self.student_result = obj_build.make_incorrect_ag_test_command_result( ag_test_command=self.ag_test_cmd, submission=self.student_submission) self.student_submission = update_denormalized_ag_test_results( self.student_submission.pk) self.student_result_fdbk = SubmissionResultFeedback( self.student_submission, ag_models.FeedbackCategory.max, AGTestPreLoader(self.project)) self.assertEqual(0, self.student_result_fdbk.total_points) self.assertNotEqual(0, self.student_result_fdbk.total_points_possible) self.staff_group = obj_build.make_group( project=self.project, members_role=obj_build.UserRole.admin) self.staff_submission = obj_build.make_finished_submission( self.staff_group) self.staff_result = obj_build.make_correct_ag_test_command_result( ag_test_command=self.ag_test_cmd, submission=self.staff_submission) self.staff_submission = update_denormalized_ag_test_results( self.staff_submission.pk) self.staff_result_fdbk = SubmissionResultFeedback( self.staff_submission, ag_models.FeedbackCategory.max, AGTestPreLoader(self.project)) self.assertNotEqual(0, self.staff_result_fdbk.total_points) self.assertNotEqual(0, self.staff_result_fdbk.total_points_possible) # Make sure we use the right queryset other_project = obj_build.make_project(course=self.project.course) other_group = obj_build.make_group(project=other_project) other_submission = obj_build.make_finished_submission(other_group)
def test_wrong_expected_return_code_nonzero(self, *args): cmd = obj_build.make_full_ag_test_command( self.ag_test_case, cmd='bash -c "exit 0"', expected_return_code=ag_models.ExpectedReturnCode.nonzero) tasks.grade_submission(self.submission.pk) res = ag_models.AGTestCommandResult.objects.get(ag_test_command=cmd) self.assertFalse(res.return_code_correct)
def test_stdin_source_setup_stderr(self, *args): cmd = obj_build.make_full_ag_test_command( self.ag_test_case, cmd='cat', stdin_source=ag_models.StdinSource.setup_stderr) tasks.grade_submission(self.submission.pk) res = ag_models.AGTestCommandResult.objects.get(ag_test_command=cmd) self.assertEqual(self.setup_stderr, open(res.stdout_filename).read())
def test_multiple_suites_cases_and_cmds(self, *args): suite1 = obj_build.make_ag_test_suite(self.project) case1 = obj_build.make_ag_test_case(suite1) case2 = obj_build.make_ag_test_case(suite1) suite2 = obj_build.make_ag_test_suite(self.project) case3 = obj_build.make_ag_test_case(suite2) case4 = obj_build.make_ag_test_case(suite2) print_to_stdout_and_stderr = "bash -c 'printf hello; printf whoops >&2'" for case in case1, case2, case3, case4: for i in range(2): obj_build.make_full_ag_test_command( ag_test_case=case, cmd=print_to_stdout_and_stderr, set_arbitrary_points=False, set_arbitrary_expected_vals=False, points_for_correct_return_code=4, points_for_correct_stdout=1, points_for_correct_stderr=1, expected_return_code=ag_models.ExpectedReturnCode.zero, expected_stdout_source=ag_models.ExpectedOutputSource.text, expected_stdout_text="hello", expected_stderr_source=ag_models.ExpectedOutputSource.text, expected_stderr_text="whoops") tasks.grade_submission(self.submission.pk) self.submission.refresh_from_db() cmd_results = ag_models.AGTestCommandResult.objects.filter( ag_test_case_result__ag_test_suite_result__submission=self.submission) for res in cmd_results: self.assertEqual(0, res.return_code) self.assertEqual('hello', open(res.stdout_filename).read()) self.assertEqual('whoops', open(res.stderr_filename).read()) self.assertTrue(res.stdout_correct) self.assertTrue(res.stderr_correct) self.assertEqual( 48, get_submission_fdbk(self.submission, ag_models.FeedbackCategory.max).total_points) self.assertEqual(ag_models.Submission.GradingStatus.finished_grading, self.submission.status)
def test_wrong_expected_stderr_text(self, *args): cmd = obj_build.make_full_ag_test_command( self.ag_test_case, cmd='bash -c "printf nopers >&2"', expected_stderr_source=ag_models.ExpectedOutputSource.text, expected_stderr_text='hello') tasks.grade_submission(self.submission.pk) res = ag_models.AGTestCommandResult.objects.get(ag_test_command=cmd) self.assertFalse(res.stderr_correct)
def test_network_access_allowed_in_suite(self, *args): suite1 = obj_build.make_ag_test_suite(self.project, allow_network_access=True) case1 = obj_build.make_ag_test_case(suite1) cmd = obj_build.make_full_ag_test_command( case1, cmd='ping -c 2 www.google.com', expected_return_code=ag_models.ExpectedReturnCode.zero) tasks.grade_submission(self.submission.pk) res = ag_models.AGTestCommandResult.objects.get(ag_test_command=cmd) self.assertTrue(res.return_code_correct)
def test_correct_expected_stdout_text(self, *args): cmd = obj_build.make_full_ag_test_command( self.ag_test_case, cmd='printf "hello"', expected_stdout_source=ag_models.ExpectedOutputSource.text, expected_stdout_text='hello') tasks.grade_submission(self.submission.pk) res = ag_models.AGTestCommandResult.objects.get(ag_test_command=cmd) self.assertTrue(res.stdout_correct)
def test_program_times_out(self, *args): cmd = obj_build.make_full_ag_test_command( self.ag_test_case, set_arbitrary_points=False, set_arbitrary_expected_vals=False, cmd=self.timeout_cmd, time_limit=1) tasks.grade_submission(self.submission.pk) res = ag_models.AGTestCommandResult.objects.get(ag_test_command=cmd) self.assertTrue(res.timed_out)
def setUp(self): super().setUp() submission = obj_build.make_submission() project = submission.group.project suite = ag_models.AGTestSuite.objects.validate_and_create( name='kajsdhf', project=project) self.ag_test_case = ag_models.AGTestCase.objects.validate_and_create( name='aksdbva', ag_test_suite=suite ) # type: ag_models.AGTestCase suite_result = ag_models.AGTestSuiteResult.objects.validate_and_create( submission=submission, ag_test_suite=suite) self.ag_test_case_result = ag_models.AGTestCaseResult.objects.validate_and_create( ag_test_case=self.ag_test_case, ag_test_suite_result=suite_result ) # type: ag_models.AGTestCaseResult self.ag_test_cmd1 = obj_build.make_full_ag_test_command( self.ag_test_case, set_arbitrary_points=False) self.ag_test_cmd2 = obj_build.make_full_ag_test_command( self.ag_test_case, set_arbitrary_points=False)
def test_wrong_expected_stderr_instructor_file(self, *args): instructor_file = ag_models.InstructorFile.objects.validate_and_create( project=self.project, file_obj=SimpleUploadedFile('filey.txt', b'waluigi')) cmd = obj_build.make_full_ag_test_command( self.ag_test_case, cmd='bash -c "printf norp >&2"', expected_stderr_source=ag_models.ExpectedOutputSource. instructor_file, expected_stderr_instructor_file=instructor_file) tasks.grade_submission(self.submission.pk) res = ag_models.AGTestCommandResult.objects.get(ag_test_command=cmd) self.assertFalse(res.stderr_correct)
def test_stdin_source_instructor_file(self, *args): text = ',vnaejfal;skjdf;lakjsdfklajsl;dkjf;' instructor_file = ag_models.InstructorFile.objects.validate_and_create( project=self.project, file_obj=SimpleUploadedFile('filey.txt', text.encode())) cmd = obj_build.make_full_ag_test_command( self.ag_test_case, cmd='cat', stdin_source=ag_models.StdinSource.instructor_file, stdin_instructor_file=instructor_file) tasks.grade_submission(self.submission.pk) res = ag_models.AGTestCommandResult.objects.get(ag_test_command=cmd) self.assertEqual(text, open(res.stdout_filename).read())
def test_program_prints_non_unicode_chars(self, *args): cmd = obj_build.make_full_ag_test_command( self.ag_test_case, set_arbitrary_points=False, set_arbitrary_expected_vals=False, cmd='python3 ' + self.non_utf_file.name) tasks.grade_submission(self.submission.pk) res = ag_models.AGTestCommandResult.objects.get(ag_test_command=cmd) self.assertEqual(0, res.return_code) self.assertEqual(self.non_utf_bytes, open(res.stdout_filename, 'rb').read()) self.assertEqual(self.non_utf_bytes, open(res.stderr_filename, 'rb').read())
def test_program_prints_a_lot_of_output(self, *args): cmd = obj_build.make_full_ag_test_command( self.ag_test_case, set_arbitrary_points=False, set_arbitrary_expected_vals=False, cmd='python3 ' + self.too_much_output_file.name, time_limit=30) tasks.grade_submission(self.submission.pk) res = ag_models.AGTestCommandResult.objects.get(ag_test_command=cmd) self.assertEqual(0, res.return_code) self.assertFalse(res.timed_out) self.assertTrue(res.stdout_truncated) self.assertTrue(res.stderr_truncated) self.assertEqual(constants.MAX_OUTPUT_LENGTH, os.path.getsize(res.stdout_filename)) self.assertEqual(constants.MAX_OUTPUT_LENGTH, os.path.getsize(res.stderr_filename))
def setUp(self): super().setUp() self.maxDiff = None self.project = obj_build.make_project( # Future closing_time closing_time=timezone.now() + datetime.timedelta(days=1)) self.course = self.project.course self.ag_test_suite = obj_build.make_ag_test_suite(self.project) self.ag_test_case = obj_build.make_ag_test_case(self.ag_test_suite) self.ag_test_cmd = obj_build.make_full_ag_test_command( self.ag_test_case) self.student_test_suite = obj_build.make_student_test_suite( self.project) self.ag_test_preloader = AGTestPreLoader(self.project)
def setUp(self): super().setUp() project_filename = 'filey.txt' self.retcode_points = 42 self.cmd = obj_build.make_full_ag_test_command( set_arbitrary_expected_vals=False, set_arbitrary_points=False, cmd='touch {}'.format(project_filename), expected_return_code=ag_models.ExpectedReturnCode.zero, points_for_correct_return_code=self.retcode_points) self.ag_suite = self.cmd.ag_test_case.ag_test_suite self.project = self.ag_suite.project self.project_file = ag_models.InstructorFile.objects.validate_and_create( project=self.project, file_obj=SimpleUploadedFile(project_filename, b'asdkfasdjkf')) self.group = obj_build.make_group(project=self.project) self.ag_suite.instructor_files_needed.add(self.project_file) self.submission = obj_build.make_submission(group=self.group)
def test_serialize(self): ag_test = ag_models.AGTestCase.objects.validate_and_create( name='a;sdklfjsdas;dkf', ag_test_suite=self.ag_suite) # type: ag_models.AGTestCase cmd = obj_build.make_full_ag_test_command(ag_test) test_dict = ag_test.to_dict() expected_keys = [ 'pk', 'name', 'last_modified', 'ag_test_suite', 'ag_test_commands', 'normal_fdbk_config', 'ultimate_submission_fdbk_config', 'past_limit_submission_fdbk_config', 'staff_viewer_fdbk_config', ] self.assertCountEqual(expected_keys, test_dict.keys()) self.assertSequenceEqual([cmd.to_dict()], test_dict['ag_test_commands']) self.assertIsInstance(test_dict['normal_fdbk_config'], dict) self.assertIsInstance(test_dict['ultimate_submission_fdbk_config'], dict) self.assertIsInstance(test_dict['past_limit_submission_fdbk_config'], dict) self.assertIsInstance(test_dict['staff_viewer_fdbk_config'], dict) update_dict = copy.deepcopy(test_dict) update_dict.pop('pk') update_dict.pop('last_modified') update_dict.pop('ag_test_commands') ag_test.validate_and_update(**update_dict)
def setUp(self): super().setUp() submission = obj_build.make_submission() self.project = submission.group.project suite = ag_models.AGTestSuite.objects.validate_and_create( name='kajsdhf', project=self.project) self.ag_test_case = ag_models.AGTestCase.objects.validate_and_create( name='aksdbva', ag_test_suite=suite) suite_result = ag_models.AGTestSuiteResult.objects.validate_and_create( submission=submission, ag_test_suite=suite) self.ag_test_case_result = ag_models.AGTestCaseResult.objects.validate_and_create( ag_test_case=self.ag_test_case, ag_test_suite_result=suite_result) self.ag_test_command = obj_build.make_full_ag_test_command( self.ag_test_case, first_failed_test_normal_fdbk_config={ 'return_code_fdbk_level': ag_models.ValueFeedbackLevel.correct_or_incorrect, 'stdout_fdbk_level': ag_models.ValueFeedbackLevel.expected_and_actual, }) self.ag_test_loader = AGTestPreLoader(self.project)
def setUp(self): super().setUp() submission = obj_build.make_submission() self.project = submission.group.project suite = ag_models.AGTestSuite.objects.validate_and_create( name='kajsdhf', project=self.project) self.ag_test_case = ag_models.AGTestCase.objects.validate_and_create( name='aksdbva', ag_test_suite=suite) suite_result = ag_models.AGTestSuiteResult.objects.validate_and_create( submission=submission, ag_test_suite=suite) self.ag_test_case_result = ag_models.AGTestCaseResult.objects.validate_and_create( ag_test_case=self.ag_test_case, ag_test_suite_result=suite_result) # Set normal feedback to max self.ag_test_command = obj_build.make_full_ag_test_command( self.ag_test_case, normal_fdbk_config={ 'return_code_fdbk_level': ag_models.ValueFeedbackLevel.get_max(), 'stdout_fdbk_level': ag_models.ValueFeedbackLevel.get_max(), 'stderr_fdbk_level': ag_models.ValueFeedbackLevel.get_max(), 'show_points': True, 'show_actual_return_code': True, 'show_actual_stdout': True, 'show_actual_stderr': True, 'show_whether_timed_out': True }) self.max_points_possible = ( self.ag_test_command.points_for_correct_return_code + self.ag_test_command.points_for_correct_stdout + self.ag_test_command.points_for_correct_stderr) self.min_points_possible = ( self.ag_test_command.deduction_for_wrong_return_code + self.ag_test_command.deduction_for_wrong_stdout + self.ag_test_command.deduction_for_wrong_stderr)
def setUp(self): super().setUp() self.ag_test_cmd = obj_build.make_full_ag_test_command() self.course = self.ag_test_cmd.ag_test_case.ag_test_suite.project.course self.client = APIClient() self.url = reverse('ag-test-command-detail', kwargs={'pk': self.ag_test_cmd.pk})
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 test_serialize(self): ag_test_command = obj_build.make_full_ag_test_command() self.do_basic_serialize_test(ag_test_command, ag_serializers.AGTestCommandSerializer)