def test_json_decode(self): responses.add( responses.GET, self.lms_url, status=422, body='this is 422', ) with self.assertRaises(ValidationError): get_course_run_grades(self.program_uuid, self.course_id)
def test_get_grades_bad_input(self): responses.add( responses.GET, self.lms_url, status=200, json={ 'next': None, 'results': self.bad_input }, ) with self.assertRaises(ValidationError): get_course_run_grades(self.program_uuid, self.course_id)
def test_get_grades(self, status_1, status_2, expected_successes, expected_failures): responses.add( responses.GET, self.lms_url, status=status_1, json={ 'next': self.lms_url + "?cursor=xxx", 'results': self.good_input_1 }, ) responses.add( responses.GET, self.lms_url, status=status_2, json={ 'next': None, 'results': self.good_input_2 }, ) any_successes, any_failures, grades = get_course_run_grades( self.program_uuid, self.course_id) self.assertCountEqual(grades, self.good_output) self.assertEqual(any_successes, expected_successes) self.assertEqual(any_failures, expected_failures)
def test_no_data(self): responses.add( responses.GET, self.lms_url, status=204, json={ 'next': None, 'results': [] }, ) any_successes, any_failures, grades = get_course_run_grades( self.program_uuid, self.course_id) self.assertFalse(any_successes) self.assertFalse(any_failures) self.assertEqual(grades, {})
def get_course_run_grades(self, job_id, user_id, file_format, program_key, internal_course_key): """ A user task that reads course run grade data from the LMS, and writes it to a JSON- or CSV-formatted result file. """ program = _get_program(job_id, program_key) if not program: return try: any_successes, any_failures, grades = data.get_course_run_grades( program.discovery_uuid, internal_course_key, ) except HTTPError as err: post_job_failure( job_id, "HTTP error {} when getting grades at {}".format( err.response.status_code, err.request.url ), ) return except ValidationError as err: post_job_failure( job_id, "Invalid grade data from LMS: {}".format(err), ) return if any_successes and any_failures: code_str = str(GradeReadStatus.MULTI_STATUS.value) elif not any_successes and not any_failures: code_str = str(GradeReadStatus.NO_CONTENT.value) elif any_successes: code_str = str(GradeReadStatus.OK.value) else: code_str = str(GradeReadStatus.UNPROCESSABLE_ENTITY.value) if file_format == 'json': serialized = json.dumps(grades, indent=4) elif file_format == 'csv': serialized = serialize_course_run_grades_to_csv(grades) else: raise ValueError('Invalid file_format: {}'.format(file_format)) post_job_success(job_id, serialized, file_format, text=code_str)
def test_get_enrollments_404(self): responses.add(responses.GET, self.lms_url, status=404) with self.assertRaisesRegex(HTTPError, '404 Client Error: Not Found'): # pylint: disable=deprecated-method get_course_run_grades(self.program_uuid, self.course_id)
def test_get_enrollments_500(self): responses.add(responses.GET, self.lms_url, status=500) with self.assertRaises(HTTPError): get_course_run_grades(self.program_uuid, self.course_id)