def test_request_parser_attaches_right_error_to_each_parsed_request(self): request_string = json.dumps({}) requests, is_batch_mode = JSONRPC20Serializer.parse_request(request_string) assert len(requests) method, params, request_id, error = requests[0] assert request_id is None assert isinstance(error, errors.RPCInvalidRequest) request_string = json.dumps([{}]) requests, is_batch_mode = JSONRPC20Serializer.parse_request(request_string) assert len(requests) method, params, request_id, error = requests[0] assert request_id is None assert isinstance(error, errors.RPCInvalidRequest) request_data = self.get_base_request_object(notification=False) request_data.pop('jsonrpc') request_string = json.dumps(request_data) requests, is_batch_mode = JSONRPC20Serializer.parse_request(request_string) assert len(requests) method, params, request_id, error = requests[0] assert request_id == request_data['id'] assert isinstance(error, errors.RPCInvalidRequest) request_data = self.get_base_request_object(notification=False) request_data.pop('method') request_string = json.dumps(request_data) requests, is_batch_mode = JSONRPC20Serializer.parse_request(request_string) assert len(requests) method, params, request_id, error = requests[0] assert request_id == request_data['id'] assert isinstance(error, errors.RPCInvalidRequest)
def test_request_parser_complains_about_deformed_request_json(self): request_string = json.dumps("blah") + '}' with self.assertRaises(errors.RPCParseError): requests, is_batch_mode = JSONRPC20Serializer.parse_request(request_string) request_string = json.dumps("blah") with self.assertRaises(errors.RPCInvalidRequest): requests, is_batch_mode = JSONRPC20Serializer.parse_request(request_string) request_string = json.dumps([]) with self.assertRaises(errors.RPCInvalidRequest): requests, is_batch_mode = JSONRPC20Serializer.parse_request(request_string)
def test_request_parser_detect_batch(self): """JSON-RPC v3 requests may come in "batch" mode - multiple request objects wrapped into an array. To respond to these correctly we need to retain the knowledge of the request coming in as "batch" """ request_string = json.dumps([self.get_base_request_object()]) requests, is_batch_mode = JSONRPC20Serializer.parse_request(request_string) assert is_batch_mode request_string = json.dumps(self.get_base_request_object()) requests, is_batch_mode = JSONRPC20Serializer.parse_request(request_string) assert not is_batch_mode
def test_process_requests_with_errors(self): request1 = JSONRPC20Serializer.assemble_request( 'blow_up', (2, 3) ) request2 = JSONRPC20Serializer.assemble_request( 'adder', (4, 3) ) requests, is_batch_mode = JSONRPC20Serializer.parse_request( JSONRPC20Serializer.json_dumps([request1, request2]) ) responses = self.app.process_requests(requests) assert len(responses) == 2 response_json = responses[0] assert 'error' in response_json assert set(response_json['error'].keys()) == {'code', 'message', 'data'} assert response_json['error']['message'] == 'Blowing up on command' # actual .message from the raised error assert response_json['id'] == request1['id'] response_json = responses[1] assert 'error' not in response_json assert response_json['id'] == request2['id'] assert response_json['result'] == 7
def test_request_parser_complains_about_deformed_request_json(self): request_string = json.dumps("blah") + '}' with self.assertRaises(errors.RPCParseError): requests, is_batch_mode = JSONRPC20Serializer.parse_request( request_string) request_string = json.dumps("blah") with self.assertRaises(errors.RPCInvalidRequest): requests, is_batch_mode = JSONRPC20Serializer.parse_request( request_string) request_string = json.dumps([]) with self.assertRaises(errors.RPCInvalidRequest): requests, is_batch_mode = JSONRPC20Serializer.parse_request( request_string)
def test_process_requests(self): request1 = JSONRPC20Serializer.assemble_request('adder', (2, 3)) request2 = JSONRPC20Serializer.assemble_request('adder', (4, 3)) request3 = JSONRPC20Serializer.assemble_request( 'adder' # note: no args. 'adder' can take it. JSONRpc app must too ) assert len({request1['id'], request2['id'], request3['id']}) == 3 requests, is_batch_mode = JSONRPC20Serializer.parse_request( JSONRPC20Serializer.json_dumps([request1, request2, request3])) responses = self.app.process_requests(requests) assert len(responses) == 3 response_json = responses[0] assert 'error' not in response_json assert response_json['id'] == request1['id'] assert response_json['result'] == 5 response_json = responses[1] assert 'error' not in response_json assert response_json['id'] == request2['id'] assert response_json['result'] == 7 response_json = responses[2] assert 'error' not in response_json assert response_json['id'] == request3['id'] assert response_json['result'] == 0
def test_process_requests_with_errors(self): request1 = JSONRPC20Serializer.assemble_request( 'blow_up', (2, 3) ) request2 = JSONRPC20Serializer.assemble_request( 'adder', (4, 3) ) requests, is_batch_mode = JSONRPC20Serializer.parse_request( JSONRPC20Serializer.json_dumps([request1, request2]) ) responses = self.app.process_requests(requests) assert len(responses) == 2 response_json = responses[0] assert 'error' in response_json assert set(response_json['error'].keys()) == {'code', 'message', 'data'} assert response_json['error']['message'] == 'Blowing up on command' # actual .message from the raised error assert response_json['id'] == request1['id'] response_json = responses[1] assert 'error' not in response_json assert response_json['id'] == request2['id'] assert response_json['result'] == 7
def test_process_requests(self): request1 = JSONRPC20Serializer.assemble_request( 'adder', (2, 3) ) request2 = JSONRPC20Serializer.assemble_request( 'adder', (4, 3) ) requests, is_batch_mode = JSONRPC20Serializer.parse_request( json.dumps([request1, request2]) ) responses = self.app.process_requests(requests) assert len(responses) == 2 response_json = responses[0] assert 'error' not in response_json assert response_json['id'] == request2['id'] assert response_json['result'] == 5 response_json = responses[1] assert 'error' not in response_json assert response_json['id'] == request2['id'] assert response_json['result'] == 7
def test_request_parser_detect_batch(self): """JSON-RPC v3 requests may come in "batch" mode - multiple request objects wrapped into an array. To respond to these correctly we need to retain the knowledge of the request coming in as "batch" """ request_string = json.dumps([self.get_base_request_object()]) requests, is_batch_mode = JSONRPC20Serializer.parse_request( request_string) assert is_batch_mode request_string = json.dumps(self.get_base_request_object()) requests, is_batch_mode = JSONRPC20Serializer.parse_request( request_string) assert not is_batch_mode
def test_request_parser_complains_about_poor_params(self): request_data = self.get_base_request_object(params="asdf", notification=False) request_string = json.dumps(request_data) requests, is_batch_mode = JSONRPC20Serializer.parse_request(request_string) assert len(requests) method, params, request_id, error = requests[0] assert request_id == request_data['id'] assert isinstance(error, errors.RPCInvalidMethodParams)
def test_request_parser_complains_about_poor_params(self): request_data = self.get_base_request_object(params="asdf", notification=False) request_string = json.dumps(request_data) requests, is_batch_mode = JSONRPC20Serializer.parse_request( request_string) assert len(requests) method, params, request_id, error = requests[0] assert request_id == request_data['id'] assert isinstance(error, errors.RPCInvalidMethodParams)
def test_request_parser_success_non_batch(self): request_data1 = self.get_base_request_object(notification=False) requests, is_batch_mode = JSONRPC20Serializer.parse_request(json.dumps(request_data1)) assert len(requests) assert not is_batch_mode method, params, request_id, error = requests[0] assert not error assert request_id and request_id == request_data1['id'] assert params and params == request_data1['params'] assert method and method == request_data1['method']
def test_request_parser_success_non_batch(self): request_data1 = self.get_base_request_object(notification=False) requests, is_batch_mode = JSONRPC20Serializer.parse_request( json.dumps(request_data1)) assert len(requests) assert not is_batch_mode method, params, request_id, error = requests[0] assert not error assert request_id and request_id == request_data1['id'] assert params and params == request_data1['params'] assert method and method == request_data1['method']
def test_request_parser_attaches_right_error_to_each_parsed_request(self): request_string = json.dumps({}) requests, is_batch_mode = JSONRPC20Serializer.parse_request( request_string) assert len(requests) method, params, request_id, error = requests[0] assert request_id is None assert isinstance(error, errors.RPCInvalidRequest) request_string = json.dumps([{}]) requests, is_batch_mode = JSONRPC20Serializer.parse_request( request_string) assert len(requests) method, params, request_id, error = requests[0] assert request_id is None assert isinstance(error, errors.RPCInvalidRequest) request_data = self.get_base_request_object(notification=False) request_data.pop('jsonrpc') request_string = json.dumps(request_data) requests, is_batch_mode = JSONRPC20Serializer.parse_request( request_string) assert len(requests) method, params, request_id, error = requests[0] assert request_id == request_data['id'] assert isinstance(error, errors.RPCInvalidRequest) request_data = self.get_base_request_object(notification=False) request_data.pop('method') request_string = json.dumps(request_data) requests, is_batch_mode = JSONRPC20Serializer.parse_request( request_string) assert len(requests) method, params, request_id, error = requests[0] assert request_id == request_data['id'] assert isinstance(error, errors.RPCInvalidRequest)
def test_process_requests(self): request1 = JSONRPC20Serializer.assemble_request( 'adder', (2, 3) ) request2 = JSONRPC20Serializer.assemble_request( 'adder', (4, 3) ) request3 = JSONRPC20Serializer.assemble_request( 'adder' # note: no args. 'adder' can take it. JSONRpc app must too ) assert len({request1['id'], request2['id'], request3['id']}) == 3 requests, is_batch_mode = JSONRPC20Serializer.parse_request( JSONRPC20Serializer.json_dumps([request1, request2, request3]) ) responses = self.app.process_requests(requests) assert len(responses) == 3 response_json = responses[0] assert 'error' not in response_json assert response_json['id'] == request1['id'] assert response_json['result'] == 5 response_json = responses[1] assert 'error' not in response_json assert response_json['id'] == request2['id'] assert response_json['result'] == 7 response_json = responses[2] assert 'error' not in response_json assert response_json['id'] == request3['id'] assert response_json['result'] == 0