Beispiel #1
0
    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)
Beispiel #2
0
    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)
Beispiel #3
0
    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)
Beispiel #4
0
    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'
Beispiel #5
0
    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')
Beispiel #6
0
    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')
Beispiel #7
0
    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'
Beispiel #8
0
    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'
Beispiel #9
0
    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')
Beispiel #10
0
    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'
Beispiel #11
0
    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')
Beispiel #12
0
    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')
Beispiel #13
0
    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')
Beispiel #14
0
    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')
Beispiel #15
0
    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')
Beispiel #16
0
    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')
Beispiel #17
0
    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')
Beispiel #18
0
    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')
Beispiel #19
0
    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')
Beispiel #20
0
    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')
Beispiel #21
0
    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