Example #1
0
 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)
Example #2
0
 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)
Example #3
0
 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)
Example #4
0
 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, {})
Example #5
0
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)
Example #6
0
 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)
Example #7
0
 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)