def test_runtime_debug_false(self, mock_log_auth_header):
        """
        Test `log_authorization_header` is not called when runtime.debug is False
        """
        self.xblock.runtime.debug = False
        self.xblock.result_service_handler(make_request('', 'GET'))

        assert not mock_log_auth_header.called
    def test_parse_suffix_raises_error(self, mock_parse_suffix):
        """
        Test 404 response returned when the user id cannot be parsed from the request path suffix
        """
        mock_parse_suffix.side_effect = LtiError()
        response = self.xblock.result_service_handler(make_request('', 'GET'))

        self.assertEqual(response.status_code, 404)
    def test_bad_request_method(self, mock_parse_suffix):
        """
        Test 404 response returned when the request contains an unsupported method
        """
        mock_parse_suffix.return_value = FAKE_USER_ID
        response = self.xblock.result_service_handler(make_request('', 'POST'))

        self.assertEqual(response.status_code, 404)
    def test_bad_request_method(self, mock_parse_suffix):
        """
        Test 404 response returned when the request contains an unsupported method
        """
        mock_parse_suffix.return_value = FAKE_USER_ID
        response = self.xblock.result_service_handler(make_request('', 'POST'))

        self.assertEqual(response.status_code, 404)
    def test_parse_suffix_raises_error(self, mock_parse_suffix):
        """
        Test 404 response returned when the user id cannot be parsed from the request path suffix
        """
        mock_parse_suffix.side_effect = LtiError()
        response = self.xblock.result_service_handler(make_request('', 'GET'))

        self.assertEqual(response.status_code, 404)
    def test_runtime_debug_false(self, mock_log_auth_header):
        """
        Test `log_authorization_header` is not called when runtime.debug is False
        """
        self.xblock.runtime.debug = False
        self.xblock.result_service_handler(make_request('', 'GET'))

        assert not mock_log_auth_header.called
    def test_verify_headers_raises_error(self, mock_parse_suffix, mock_verify_result_headers):
        """
        Test 401 response returned when `verify_result_headers` raises LtiError
        """
        mock_parse_suffix.return_value = FAKE_USER_ID
        mock_verify_result_headers.side_effect = LtiError()
        response = self.xblock.result_service_handler(make_request('', 'GET'))

        self.assertEqual(response.status_code, 401)
    def test_verify_result_headers_valid(self):
        """
        Test True is returned if request is valid
        """
        request = make_request('')
        request.environ['CONTENT_TYPE'] = LtiConsumer.CONTENT_TYPE_RESULT_JSON
        response = self.lti_consumer.verify_result_headers(request)

        self.assertTrue(response)
    def test_bad_user_id(self, mock_parse_suffix):
        """
        Test 404 response returned when a user cannot be found
        """
        mock_parse_suffix.return_value = FAKE_USER_ID
        self.xblock.runtime.get_real_user.return_value = None
        response = self.xblock.result_service_handler(make_request('', 'GET'))

        self.assertEqual(response.status_code, 404)
    def test_verify_result_headers_verify_content_type_false(self):
        """
        Test content type check skipped if `verify_content_type` is False
        """
        request = make_request('')
        request.environ['CONTENT_TYPE'] = LtiConsumer.CONTENT_TYPE_RESULT_JSON
        response = self.lti_consumer.verify_result_headers(request, False)

        self.assertTrue(response)
    def test_verify_result_headers_valid(self):
        """
        Test True is returned if request is valid
        """
        request = make_request('')
        request.environ['CONTENT_TYPE'] = LtiConsumer.CONTENT_TYPE_RESULT_JSON
        response = self.lti_consumer.verify_result_headers(request)

        self.assertTrue(response)
    def test_verify_result_headers_verify_content_type_false(self):
        """
        Test content type check skipped if `verify_content_type` is False
        """
        request = make_request('')
        request.environ['CONTENT_TYPE'] = LtiConsumer.CONTENT_TYPE_RESULT_JSON
        response = self.lti_consumer.verify_result_headers(request, False)

        self.assertTrue(response)
    def test_bad_user_id(self, mock_parse_suffix):
        """
        Test 404 response returned when a user cannot be found
        """
        mock_parse_suffix.return_value = FAKE_USER_ID
        self.xblock.runtime.get_real_user.return_value = None
        response = self.xblock.result_service_handler(make_request('', 'GET'))

        self.assertEqual(response.status_code, 404)
    def test_verify_result_headers_verify_content_type_true(self, mock_log):
        """
        Test wrong content type raises exception if `verify_content_type` is True
        """
        request = make_request('')

        with self.assertRaises(LtiError):
            self.lti_consumer.verify_result_headers(request)
            self.assertTrue(mock_log.called)
    def test_get_result_raises_error(self, mock_parse_suffix, mock_get_result):
        """
        Test 404 response returned when the LtiConsumer result service handler methods raise an exception
        """
        mock_parse_suffix.return_value = FAKE_USER_ID
        mock_get_result.side_effect = LtiError()
        response = self.xblock.result_service_handler(make_request('', 'GET'))

        self.assertEqual(response.status_code, 404)
    def test_unsupported_action(self):
        """
        Test unsupported action returns unsupported response
        """
        request = make_request('')
        response = self.outcome_servce.handle_request(request)

        self.assertIn('unsupported', response)
        self.assertIn('Target does not support the requested operation.', response)
    def test_unsupported_action(self):
        """
        Test unsupported action returns unsupported response
        """
        request = make_request('')
        response = self.outcome_servce.handle_request(request)

        self.assertIn('unsupported', response)
        self.assertIn('Target does not support the requested operation.', response)
    def test_verify_result_headers_verify_content_type_true(self, mock_log):
        """
        Test wrong content type raises exception if `verify_content_type` is True
        """
        request = make_request('')

        with self.assertRaises(LtiError):
            self.lti_consumer.verify_result_headers(request)
            self.assertTrue(mock_log.called)
Exemple #19
0
    def test_verify_headers_raises_error(self, mock_parse_suffix, mock_verify_result_headers):
        """
        Test 401 response returned when `verify_result_headers` raises LtiError
        """
        mock_parse_suffix.return_value = FAKE_USER_ID
        mock_verify_result_headers.side_effect = LtiError()
        response = self.xblock.result_service_handler(make_request('', 'GET'))

        self.assertEqual(response.status_code, 401)
    def test_get_result_raises_error(self, mock_parse_suffix, mock_get_result):
        """
        Test 404 response returned when the LtiConsumer result service handler methods raise an exception
        """
        mock_parse_suffix.return_value = FAKE_USER_ID
        mock_get_result.side_effect = LtiError()
        response = self.xblock.result_service_handler(make_request('', 'GET'))

        self.assertEqual(response.status_code, 404)
    def test_handle_request_called(self, mock_get_signed_lti_parameters):
        """
        Test LtiConsumer.get_signed_lti_parameters is called and a 200 HTML response is returned
        """
        request = make_request('', 'GET')
        response = self.xblock.lti_launch_handler(request)

        assert mock_get_signed_lti_parameters.called
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.content_type, 'text/html')
    def test_handle_request_called(self, mock_handle_request):
        """
        Test OutcomeService.handle_request is called and a 200 XML response is returned
        """
        request = make_request('', 'POST')
        response = self.xblock.outcome_service_handler(request)

        assert mock_handle_request.called
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.content_type, 'application/xml')
    def test_runtime_debug_true(self, mock_lti_provider_key_secret, mock_log_auth_header):
        """
        Test `log_authorization_header` is called when runtime.debug is True
        """
        mock_lti_provider_key_secret.__get__ = Mock(return_value=(self.lti_provider_key, self.lti_provider_secret))
        self.xblock.runtime.debug = True
        request = make_request('', 'GET')
        self.xblock.result_service_handler(request)

        mock_log_auth_header.assert_called_with(request, self.lti_provider_key, self.lti_provider_secret)
    def test_user_not_found(self):
        """
        Test user not found returns failure response
        """
        request = make_request('')
        self.xblock.runtime.get_real_user.return_value = None
        response = self.outcome_servce.handle_request(request)

        self.assertIn('failure', response)
        self.assertIn('User not found', response)
    def test_xml_parse_lti_error(self, mock_parse):
        """
        Test XML parsing LtiError returns failure response
        """
        request = make_request('')

        mock_parse.side_effect = LtiError
        response = self.outcome_servce.handle_request(request)
        self.assertIn('failure', response)
        self.assertIn('Request body XML parsing error', response)
    def test_grade_past_due(self):
        """
        Test late grade returns failure response
        """
        request = make_request('')
        self.xblock.accept_grades_past_due = False
        response = self.outcome_servce.handle_request(request)

        self.assertIn('failure', response)
        self.assertIn('Grade is past due', response)
    def test_delete_result_called(self, mock_parse_suffix, mock_delete_result):
        """
        Test 200 response and LtiConsumer.delete_result is called on a DELETE request
        """
        mock_parse_suffix.return_value = FAKE_USER_ID
        mock_delete_result.return_value = {}
        response = self.xblock.result_service_handler(make_request('', 'DELETE'))

        assert mock_delete_result.called
        self.assertEqual(response.status_code, 200)
    def test_verify_result_headers_value_error(self, mock_log):
        """
        Test exception raised if request header verification raises error
        """
        request = make_request('')
        request.environ['CONTENT_TYPE'] = LtiConsumer.CONTENT_TYPE_RESULT_JSON

        with self.assertRaises(LtiError):
            self.lti_consumer.verify_result_headers(request)
            self.assertTrue(mock_log.called)
    def test_accept_grades_past_due_false_and_is_past_due_true(self, mock_is_past_due):
        """
        Test 404 response returned when `accept_grades_past_due` is False
        and `is_past_due` is True
        """
        mock_is_past_due.__get__ = Mock(return_value=True)
        self.xblock.accept_grades_past_due = False
        response = self.xblock.result_service_handler(make_request('', 'GET'))

        self.assertEqual(response.status_code, 404)
    def test_verify_result_headers_value_error(self, mock_log):
        """
        Test exception raised if request header verification raises error
        """
        request = make_request('')
        request.environ['CONTENT_TYPE'] = LtiConsumer.CONTENT_TYPE_RESULT_JSON

        with self.assertRaises(LtiError):
            self.lti_consumer.verify_result_headers(request)
            self.assertTrue(mock_log.called)
    def test_xml_parse_lti_error(self, mock_parse):
        """
        Test XML parsing LtiError returns failure response
        """
        request = make_request('')

        mock_parse.side_effect = LtiError
        response = self.outcome_servce.handle_request(request)
        self.assertIn('failure', response)
        self.assertIn('Request body XML parsing error', response)
    def test_put_result_called(self, mock_parse_suffix, mock_put_result):
        """
        Test 200 response and LtiConsumer.put_result is called on a PUT request
        """
        mock_parse_suffix.return_value = FAKE_USER_ID
        mock_put_result.return_value = {}
        response = self.xblock.result_service_handler(make_request('', 'PUT'))

        assert mock_put_result.called
        self.assertEqual(response.status_code, 200)
    def test_handle_request_called(self, mock_handle_request):
        """
        Test OutcomeService.handle_request is called and a 200 XML response is returned
        """
        request = make_request('', 'POST')
        response = self.xblock.outcome_service_handler(request)

        assert mock_handle_request.called
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.content_type, 'application/xml')
    def test_user_not_found(self):
        """
        Test user not found returns failure response
        """
        request = make_request('')
        self.xblock.runtime.get_real_user.return_value = None
        response = self.outcome_servce.handle_request(request)

        self.assertIn('failure', response)
        self.assertIn('User not found', response)
Exemple #35
0
    def test_accept_grades_past_due_false_and_is_past_due_true(self, mock_is_past_due):
        """
        Test 404 response returned when `accept_grades_past_due` is False
        and `is_past_due` is True
        """
        mock_is_past_due.__get__ = Mock(return_value=True)
        self.xblock.accept_grades_past_due = False
        response = self.xblock.result_service_handler(make_request('', 'GET'))

        self.assertEqual(response.status_code, 404)
    def test_handle_request_called(self, mock_get_signed_lti_parameters):
        """
        Test LtiConsumer.get_signed_lti_parameters is called and a 200 HTML response is returned
        """
        request = make_request('', 'GET')
        response = self.xblock.lti_launch_handler(request)

        assert mock_get_signed_lti_parameters.called
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.content_type, 'text/html')
Exemple #37
0
    def test_runtime_debug_true(self, mock_lti_provider_key_secret, mock_log_auth_header):
        """
        Test `log_authorization_header` is called when runtime.debug is True
        """
        mock_lti_provider_key_secret.__get__ = Mock(return_value=(self.lti_provider_key, self.lti_provider_secret))
        self.xblock.runtime.debug = True
        request = make_request('', 'GET')
        self.xblock.result_service_handler(request)

        mock_log_auth_header.assert_called_with(request, self.lti_provider_key, self.lti_provider_secret)
    def test_grade_past_due(self):
        """
        Test late grade returns failure response
        """
        request = make_request('')
        self.xblock.accept_grades_past_due = False
        response = self.outcome_servce.handle_request(request)

        self.assertIn('failure', response)
        self.assertIn('Grade is past due', response)
    def test_invalid_signature(self, mock_verify):
        """
        Test invalid oauth signature returns failure response
        """
        request = make_request('')

        mock_verify.side_effect = ValueError
        self.assertIn('failure', self.outcome_servce.handle_request(request))

        mock_verify.side_effect = LtiError
        self.assertIn('failure', self.outcome_servce.handle_request(request))
    def test_accept_grades_past_due_true_and_is_past_due_true(self, mock_is_past_due, mock_parse_suffix,
                                                              mock_get_result):
        """
        Test 200 response returned when `accept_grades_past_due` is True and `is_past_due` is True
        """
        mock_is_past_due.__get__ = Mock(return_value=True)
        mock_parse_suffix.return_value = FAKE_USER_ID
        mock_get_result.return_value = {}
        response = self.xblock.result_service_handler(make_request('', 'GET'))

        self.assertEqual(response.status_code, 200)
    def test_accept_grades_past_due_true_and_is_past_due_true(
            self, mock_is_past_due, mock_parse_suffix, mock_get_result):
        """
        Test 200 response returned when `accept_grades_past_due` is True and `is_past_due` is True
        """
        mock_is_past_due.__get__ = Mock(return_value=True)
        mock_parse_suffix.return_value = FAKE_USER_ID
        mock_get_result.return_value = {}
        response = self.xblock.result_service_handler(make_request('', 'GET'))

        self.assertEqual(response.status_code, 200)
    def test_invalid_signature(self, mock_verify):
        """
        Test invalid oauth signature returns failure response
        """
        request = make_request('')

        mock_verify.side_effect = ValueError
        self.assertIn('failure', self.outcome_servce.handle_request(request))

        mock_verify.side_effect = LtiError
        self.assertIn('failure', self.outcome_servce.handle_request(request))
    def test_lti_error_not_raises_type_error(self, mock_parse):
        """
        Test XML parsing LtiError exception doesn't raise TypeError exception
        while escaping the request body.
        """
        request = make_request('test_string')

        mock_parse.side_effect = LtiError
        response = self.outcome_servce.handle_request(request)
        self.assertNotIn('TypeError', response)
        self.assertNotIn('a bytes-like object is required', response)
        self.assertIn('Request body XML parsing error', response)
Exemple #44
0
    def test_verify_result_headers_no_outcome_service_url(self, mock_log):
        """
        Test exception raised if no outcome_service_url is set
        """
        request = make_request('')
        request.environ[
            'CONTENT_TYPE'] = LtiConsumer1p1.CONTENT_TYPE_RESULT_JSON

        with self.assertRaises(ValueError):
            self.lti_consumer.verify_result_headers(request)

        assert mock_log.error.called
Exemple #45
0
    def test_verify_result_headers_value_error(self, mock_log):
        """
        Test exception raised if request header verification raises error
        """
        request = make_request('')
        request.environ[
            'CONTENT_TYPE'] = LtiConsumer1p1.CONTENT_TYPE_RESULT_JSON

        self.lti_consumer.set_outcome_service_url('outcome_service_url')
        with self.assertRaises(Lti1p1Error):
            self.lti_consumer.verify_result_headers(request)

        assert mock_log.error.called
    def test_handle_replace_result_success(self):
        """
        Test replace result request returns with success indicator
        """
        request = make_request('')
        values = {
            'code': 'success',
            'description': 'Score for  is now 0.5',
            'msg_id': '',
            'response': '<replaceResultResponse/>'
        }

        self.assertEqual(
            self.outcome_servce.handle_request(request).strip(),
            RESPONSE_BODY_TEMPLATE.format(**values).strip())
    def test_handle_replace_result_success(self):
        """
        Test replace result request returns with success indicator
        """
        request = make_request('')
        values = {
            'code': 'success',
            'description': 'Score for  is now 0.5',
            'msg_id': '',
            'response': '<replaceResultResponse/>'
        }

        self.assertEqual(
            self.outcome_servce.handle_request(request).strip(),
            RESPONSE_BODY_TEMPLATE.format(**values).strip()
        )
 def test_valid_signature(self):
     """
     Test True is returned when the request signature is valid
     """
     self.assertTrue(
         verify_oauth_body_signature(make_request(''), 'test', 'secret'))
 def test_log_auth_header(self, mock_log):
     """
     Test that log.debug is called
     """
     log_authorization_header(make_request(''), 'test', 'secret')
     self.assertTrue(mock_log.debug.called)
 def test_missing_oauth_body_hash(self):
     """
     Test exception is raised when the request signature is missing oauth_body_hash
     """
     with self.assertRaises(LtiError):
         verify_oauth_body_signature(make_request(''), 'test', 'secret')
 def test_missing_oauth_body_hash(self):
     """
     Test exception is raised when the request signature is missing oauth_body_hash
     """
     with self.assertRaises(LtiError):
         verify_oauth_body_signature(make_request(''), 'test', 'secret')
 def test_invalid_signature(self):
     """
     Test exception is raised when the request signature is invalid
     """
     with self.assertRaises(Lti1p1Error):
         verify_oauth_body_signature(make_request(''), 'test', 'secret')
 def test_log_auth_header(self, mock_log):
     """
     Test that log.debug is called
     """
     log_authorization_header(make_request(''), 'test', 'secret')
     self.assertTrue(mock_log.debug.called)
 def test_valid_signature(self):
     """
     Test True is returned when the request signature is valid
     """
     self.assertTrue(verify_oauth_body_signature(make_request(''), 'test', 'secret'))