def test_build_identifier_from_invalid_source_type(self): identifiers = [Parameter(target='Id', source='invalid')] parent = mock.Mock() params = {} response = {'Container': {'Frobs': []}} with pytest.raises(NotImplementedError): build_identifiers(identifiers, parent, params, response)
def test_build_identifier_from_invalid_source_type(self): identifier_defs = [{ 'target': 'Id', 'sourceType': 'invalid', 'source': 'abc' }] parent = mock.Mock() params = {} response = {'Container': {'Frobs': []}} with self.assertRaises(NotImplementedError): build_identifiers(identifier_defs, parent, params, response)
def test_build_identifier_from_invalid_source_type(self): identifiers = [Parameter(target='Id', source='invalid')] parent = mock.Mock() params = {} response = { 'Container': { 'Frobs': [] } } with self.assertRaises(NotImplementedError): build_identifiers(identifiers, parent, params, response)
def test_build_identifier_from_parent_identifier(self): identifiers = [Parameter(target='Id', source='identifier', name='Id')] parent = mock.Mock() parent.id = 'identifier' params = {} response = {'Container': {'Frobs': []}} values = build_identifiers(identifiers, parent, params, response) # Verify identifier loaded from responsePath scalar set assert values[0][1] == 'identifier'
def test_build_identifier_from_parent_identifier(self): identifiers = [Parameter(target='Id', source='identifier', name='Id')] parent = mock.Mock() parent.id = 'identifier' params = {} response = {'Container': {'Frobs': []}} values = build_identifiers(identifiers, parent, params, response) self.assertEqual(values[0][1], 'identifier', 'Identifier loaded from parent identifier not set')
def test_build_identifier_from_parent_data_member(self): identifiers = [Parameter(target='Id', source='data', path='Member')] parent = mock.Mock() parent.meta = ResourceMeta('test', data={'Member': 'data-member'}) params = {} response = {'Container': {'Frobs': []}} values = build_identifiers(identifiers, parent, params, response) self.assertEqual(values[0][1], 'data-member', 'Identifier loaded from parent data member not set')
def test_build_identifier_from_parent_data_member(self): identifiers = [Parameter(target='Id', source='data', path='Member')] parent = mock.Mock() parent.meta = ResourceMeta('test', data={'Member': 'data-member'}) params = {} response = {'Container': {'Frobs': []}} values = build_identifiers(identifiers, parent, params, response) # Verify identifier loaded from responsePath scalar set assert values[0][1] == 'data-member'
def test_build_identifier_from_req_param(self): identifiers = [ Parameter(target='Id', source='requestParameter', path='Param') ] parent = mock.Mock() params = {'Param': 'request-param'} response = {'Container': {'Frobs': []}} values = build_identifiers(identifiers, parent, params, response) # Verify identifier loaded from responsePath scalar set assert values[0][1] == 'request-param'
def test_build_identifier_from_req_param(self): identifiers = [ Parameter(target='Id', source='requestParameter', path='Param') ] parent = mock.Mock() params = {'Param': 'request-param'} response = {'Container': {'Frobs': []}} values = build_identifiers(identifiers, parent, params, response) self.assertEqual(values[0][1], 'request-param', 'Identifier loaded from request parameter not set')
def test_build_identifier_from_res_path_scalar(self): identifiers = [ Parameter(target='Id', source='response', path='Container.Frob.Id') ] parent = mock.Mock() params = {} response = {'Container': {'Frob': {'Id': 'response-path'}}} values = build_identifiers(identifiers, parent, params, response) # Verify identifier loaded from responsePath scalar set assert values[0][1] == 'response-path'
def test_build_identifier_from_req_param(self): identifier_defs = [{ 'target': 'Id', 'sourceType': 'requestParameter', 'source': 'Param' }] parent = mock.Mock() params = {'Param': 'request-param'} response = {'Container': {'Frobs': []}} values = build_identifiers(identifier_defs, parent, params, response) self.assertEqual(values['id'], 'request-param', 'Identifier loaded from request parameter not set')
def test_build_identifier_from_res_path_list(self): identifier_defs = [{ 'target': 'Id', 'sourceType': 'responsePath', 'source': 'Container.Frobs[].Id' }] parent = mock.Mock() params = {} response = {'Container': {'Frobs': [{'Id': 'response-path'}]}} values = build_identifiers(identifier_defs, parent, params, response) self.assertEqual(values['id'], ['response-path'], 'Identifier loaded from responsePath list not set')
def test_build_identifier_from_res_path_list(self): identifiers = [ Parameter(target='Id', source='response', path='Container.Frobs[].Id') ] parent = mock.Mock() params = {} response = {'Container': {'Frobs': [{'Id': 'response-path'}]}} values = build_identifiers(identifiers, parent, params, response) self.assertEqual(values[0][1], ['response-path'], 'Identifier loaded from responsePath list not set')
def test_build_identifier_from_parent_data_member(self): identifier_defs = [{ 'target': 'Id', 'sourceType': 'dataMember', 'source': 'Member' }] parent = mock.Mock() parent.member = 'data-member' params = {} response = {'Container': {'Frobs': []}} values = build_identifiers(identifier_defs, parent, params, response) self.assertEqual(values['id'], 'data-member', 'Identifier loaded from parent data member not set')
def test_build_identifier_from_parent_identifier(self): identifiers = [Parameter(target='Id', source='identifier', name='Id')] parent = mock.Mock() parent.id = 'identifier' params = {} response = { 'Container': { 'Frobs': [] } } values = build_identifiers(identifiers, parent, params, response) self.assertEqual(values[0][1], 'identifier', 'Identifier loaded from parent identifier not set')
def test_build_identifier_from_parent_data_member(self): identifiers = [Parameter(target='Id', source_type='dataMember', source='Member')] parent = mock.Mock() parent.member = 'data-member' params = {} response = { 'Container': { 'Frobs': [] } } values = build_identifiers(identifiers, parent, params, response) self.assertEqual(values['id'], 'data-member', 'Identifier loaded from parent data member not set')
def test_build_identifier_from_res_path_scalar(self): identifiers = [Parameter(target='Id', source='response', path='Container.Frob.Id')] parent = mock.Mock() params = {} response = { 'Container': { 'Frob': { 'Id': 'response-path' } } } values = build_identifiers(identifiers, parent, params, response) self.assertEqual(values[0][1], 'response-path', 'Identifier loaded from responsePath scalar not set')
def test_build_identifier_from_req_param(self): identifiers = [Parameter(target='Id', source='requestParameter', path='Param')] parent = mock.Mock() params = { 'Param': 'request-param' } response = { 'Container': { 'Frobs': [] } } values = build_identifiers(identifiers, parent, params, response) self.assertEqual(values[0][1], 'request-param', 'Identifier loaded from request parameter not set')
def test_build_identifier_from_parent_data_member(self): identifiers = [Parameter(target='Id', source='data', path='Member')] parent = mock.Mock() parent.meta = ResourceMeta('test', data={ 'Member': 'data-member' }) params = {} response = { 'Container': { 'Frobs': [] } } values = build_identifiers(identifiers, parent, params, response) self.assertEqual(values[0][1], 'data-member', 'Identifier loaded from parent data member not set')
def test_build_identifier_from_res_path_list(self): identifiers = [Parameter(target='Id', source_type='responsePath', source='Container.Frobs[].Id')] parent = mock.Mock() params = {} response = { 'Container': { 'Frobs': [ { 'Id': 'response-path' } ] } } values = build_identifiers(identifiers, parent, params, response) self.assertEqual(values['id'], ['response-path'], 'Identifier loaded from responsePath list not set')
async def __call__(self, parent, params, response): """ :type parent: ServiceResource :param parent: The resource instance to which this action is attached. :type params: dict :param params: Request parameters sent to the service. :type response: dict :param response: Low-level operation response. """ resource_name = self.resource_model.type json_definition = self.service_context.resource_json_definitions.get( resource_name) # Load the new resource class that will result from this action. resource_cls = await self.factory.load_from_definition( resource_name=resource_name, single_resource_json_definition=json_definition, service_context=self.service_context) raw_response = response search_response = None # Anytime a path is defined, it means the response contains the # resource's attributes, so resource_data gets set here. It # eventually ends up in resource.meta.data, which is where # the attribute properties look for data. if self.search_path: search_response = jmespath.search(self.search_path, raw_response) # First, we parse all the identifiers, then create the individual # response resources using them. Any identifiers that are lists # will have one item consumed from the front of the list for each # resource that is instantiated. Items which are not a list will # be set as the same value on each new resource instance. identifiers = dict( build_identifiers(self.resource_model.identifiers, parent, params, raw_response)) # If any of the identifiers is a list, then the response is plural plural = [v for v in identifiers.values() if isinstance(v, list)] if plural: response = [] # The number of items in an identifier that is a list will # determine how many resource instances to create. for i in range(len(plural[0])): # Response item data is *only* available if a search path # was given. This prevents accidentally loading unrelated # data that may be in the response. response_item = None if search_response: response_item = search_response[i] response.append( self.handle_response_item(resource_cls, parent, identifiers, response_item)) elif all_not_none(identifiers.values()): # All identifiers must always exist, otherwise the resource # cannot be instantiated. response = self.handle_response_item(resource_cls, parent, identifiers, search_response) else: # The response should be empty, but that may mean an # empty dict, list, or None based on whether we make # a remote service call and what shape it is expected # to return. response = None if self.operation_name is not None: # A remote service call was made, so try and determine # its shape. response = build_empty_response( self.search_path, self.operation_name, self.service_context.service_model) return response