def test_metadata_always_exists_for_json(self): # ResponseMetadata is used for more than just the request id. It # should always get populated, even if the request doesn't seem to # have an id. parser = parsers.JSONParser() response = b'{"Str": "mystring"}' headers = {} output_shape = model.StructureShape( 'OutputShape', { 'type': 'structure', 'members': { 'Str': { 'shape': 'StringType', } } }, model.ShapeResolver({'StringType': { 'type': 'string' }})) parsed = parser.parse( { 'body': response, 'headers': headers, 'status_code': 200 }, output_shape) expected = { 'Str': 'mystring', 'ResponseMetadata': { 'HTTPStatusCode': 200, 'HTTPHeaders': headers } } self.assertEqual(parsed, expected)
def test_response_no_initial_event_stream(self): parser = parsers.JSONParser() output_shape = model.StructureShape( 'OutputShape', { 'type': 'structure', 'members': { 'Payload': { 'shape': 'Payload' } } }, model.ShapeResolver({ 'Payload': { 'type': 'structure', 'members': [], 'eventstream': True } })) with self.assertRaises(parsers.ResponseParserError): response_dict = { 'status_code': 200, 'headers': {}, 'body': RawResponse(b''), 'context': { 'operation_name': 'TestOperation' } } parser.parse(response_dict, output_shape)
def test_response_metadata_on_json_request(self): parser = parsers.JSONParser() response = b'{"Str": "mystring"}' headers = {'x-amzn-requestid': 'request-id'} output_shape = model.StructureShape( 'OutputShape', { 'type': 'structure', 'members': { 'Str': { 'shape': 'StringType', } } }, model.ShapeResolver({'StringType': { 'type': 'string' }})) parsed = parser.parse( { 'body': response, 'headers': headers, 'status_code': 200 }, output_shape) # Note that the response metadata is normalized to match the query # protocol, even though this is not how it appears in the output. self.assertEqual( parsed, { 'Str': 'mystring', 'ResponseMetadata': { 'RequestId': 'request-id', 'HTTPStatusCode': 200, 'HTTPHeaders': headers } })
def test_empty_json_response(self): headers = {'x-amzn-requestid': 'request-id'} # Output shape of None represents no output shape in the model. output_shape = None parser = parsers.JSONParser() parsed = parser.parse( {'body': b'', 'headers': headers, 'status_code': 200}, output_shape) self.assertEqual( parsed, {'ResponseMetadata': {'RequestId': 'request-id', 'HTTPStatusCode': 200, 'HTTPHeaders': headers}})
def test_can_parse_float_timestamps(self): # The type "timestamp" can come back as both an integer or as a float. # We need to make sure we handle the case where the timestamp comes # back as a float. It might make sense to move this to protocol tests. output_shape = model.Shape(shape_name='datetime', shape_model={'type': 'timestamp'}) parser = parsers.JSONParser() timestamp_as_float = b'1407538750.49' expected_parsed = datetime.datetime( 2014, 8, 8, 22, 59, 10, 490000, tzinfo=tzutc()) parsed = parser.parse( {'body': timestamp_as_float, 'headers': [], 'status_code': 200}, output_shape) self.assertEqual(parsed, expected_parsed)
def test_response_metadata_errors_alternate_form_json_protocol(self): # Sometimes there is no '#' in the __type. We need to be # able to parse this error message as well. parser = parsers.JSONParser() response = { "body": b""" {"__type":"ValidationException", "message":"this is a message"} """, "status_code": 400, "headers": { "x-amzn-requestid": "request-id" } } parsed = parser.parse(response, None) self.assertIn('Error', parsed) self.assertEqual(parsed['Error']['Message'], 'this is a message') self.assertEqual(parsed['Error']['Code'], 'ValidationException')
def test_response_metadata_errors_for_json_protocol(self): parser = parsers.JSONParser() response = { "body": b""" {"__type":"amazon.foo.validate#ValidationException", "message":"this is a message"} """, "status_code": 400, "headers": { "x-amzn-requestid": "request-id" } } parsed = parser.parse(response, None) # Even (especially) on an error condition, the # ResponseMetadata should be populated. self.assertIn('ResponseMetadata', parsed) self.assertEqual(parsed['ResponseMetadata']['RequestId'], 'request-id') self.assertIn('Error', parsed) self.assertEqual(parsed['Error']['Message'], 'this is a message') self.assertEqual(parsed['Error']['Code'], 'ValidationException')
def create_parser(self): return parsers.JSONParser()