示例#1
0
    def test_call_with_existing_session(self, mock_get_adapted_session):
        service = mock.Mock()
        service.get_hosts.return_value = ['http://host1.biz']
        service.required_headers = {}

        endpoint = mock.Mock()
        endpoint.required_headers = {}
        endpoint.get_formatted_path.return_value = '/foo/'
        del endpoint.stub_response

        mock_logger = mock.Mock()
        mock_response = mock.Mock()
        mock_response.history = []

        session = mock.Mock()
        session.send.return_value = mock_response

        ServiceCaller.call(
            service,
            endpoint,
            session=session,
            logger=mock_logger,
        )

        assert not mock_get_adapted_session.called
        assert not session.close.called
示例#2
0
    def test_build_request_object_passes_arguments_to_request_constructor(
            self, mock_get_required_headers, mock_request_constructor):
        session = mock.Mock()

        service = mock.Mock()
        service.get_hosts.return_value = ["http://host1.biz"]

        endpoint = mock.Mock()
        endpoint.default_method = "POST"
        endpoint.get_formatted_path.return_value = "/foo"
        endpoint.required_headers = {"header": "value"}
        endpoint.default_params = {}
        endpoint.required_params = set()

        params = {"baz": "qux"}
        endpoint.get_merged_params.return_value = params
        data = "I am a data"
        json = {"raw": "data"}
        headers = {"Accept": "stuff"}
        cookies = {"chocolate-chip": "yes"}
        auth = mock.Mock()

        mock_get_required_headers.return_value = {"header": "value"}
        expected_headers = {}
        expected_headers.update(headers)
        expected_headers.update(endpoint.required_headers)

        with mock.patch.object(session,
                               "prepare_request") as mock_prepare_request:
            ServiceCaller.build_request_object(
                session,
                service,
                endpoint,
                params=params,
                data=data,
                json=json,
                headers=headers,
                cookies=cookies,
                auth=auth,
                foo="bar",
            )

            mock_request_constructor.assert_called_once_with(
                url="http://host1.biz/foo",
                method=endpoint.default_method,
                headers=expected_headers,
                cookies=cookies,
                params=params,
                data=data,
                json=json,
                auth=auth,
            )

            assert 1 == mock_prepare_request.call_count
示例#3
0
    def test_build_request_object_passes_arguments_to_request_constructor(
            self, mock_get_required_headers, mock_request_constructor):
        session = mock.Mock()

        service = mock.Mock()
        service.get_hosts.return_value = ['http://host1.biz']

        endpoint = mock.Mock()
        endpoint.default_method = 'POST'
        endpoint.get_formatted_path.return_value = '/foo'
        endpoint.required_headers = {'header': 'value'}
        endpoint.default_params = {}
        endpoint.required_params = set()

        params = {'baz': 'qux'}
        endpoint.get_merged_params.return_value = params
        data = 'I am a data'
        json = {'raw': 'data'}
        headers = {'Accept': 'stuff'}
        cookies = {'chocolate-chip': 'yes'}
        auth = mock.Mock()

        mock_get_required_headers.return_value = {'header': 'value'}
        expected_headers = {}
        expected_headers.update(headers)
        expected_headers.update(endpoint.required_headers)

        with mock.patch.object(session,
                               'prepare_request') as mock_prepare_request:
            ServiceCaller.build_request_object(
                session,
                service,
                endpoint,
                params=params,
                data=data,
                json=json,
                headers=headers,
                cookies=cookies,
                auth=auth,
                foo='bar',
            )

            mock_request_constructor.assert_called_once_with(
                url='http://host1.biz/foo',
                method=endpoint.default_method,
                headers=expected_headers,
                cookies=cookies,
                params=params,
                data=data,
                json=json,
                auth=auth,
            )

            assert 1 == mock_prepare_request.call_count
示例#4
0
    def test_legacy_endpoint_usage_with_instantiated_service(
            self, MockSession, mock_timeout, service):
        service.foo = apiron.Endpoint(path="/foo/")
        instantiated_service = service()

        mock_logger = mock.Mock()
        request = mock.Mock()
        request.url = "http://host1.biz/foo/"

        ServiceCaller.call(instantiated_service,
                           instantiated_service.foo,
                           timeout_spec=mock_timeout,
                           logger=mock_logger)
示例#5
0
    def test_call_stub_dynamic_params(self, MockSession, MockAdapter,
                                      mock_build_request_object,
                                      mock_get_adapted_session, mock_timeout):
        """
        Test getting a response for a ``StubEndpoint`` using a dynamic response with parameters
        """
        service = mock.Mock()
        service.get_hosts.return_value = ['http://host1.biz']

        stub_endpoint = mock.Mock()

        def stub_response(**kwargs):
            response_map = {
                'param_value': 'correct',
                'default': 'incorrect',
            }
            data_key = kwargs['params'].setdefault('param_key', 'default')
            return response_map[data_key]

        stub_endpoint.stub_response = stub_response

        actual_response = ServiceCaller.call(
            service, stub_endpoint, params={'param_key': 'param_value'})

        expected_response = 'correct'

        assert expected_response == actual_response
示例#6
0
 def test_get_required_headers(self):
     service = mock.Mock()
     service.required_headers = {'one': 'two'}
     endpoint = mock.Mock()
     endpoint.required_headers = {'foo': 'bar'}
     expected_headers = {}
     expected_headers.update(service.required_headers)
     expected_headers.update(endpoint.required_headers)
     assert expected_headers == ServiceCaller.get_required_headers(
         service, endpoint)
示例#7
0
 def test_get_required_headers(self):
     service = mock.Mock()
     service.required_headers = {"one": "two"}
     endpoint = mock.Mock()
     endpoint.required_headers = {"foo": "bar"}
     expected_headers = {}
     expected_headers.update(service.required_headers)
     expected_headers.update(endpoint.required_headers)
     assert expected_headers == ServiceCaller.get_required_headers(
         service, endpoint)
示例#8
0
    def test_call_with_explicit_encoding(self):
        service = mock.Mock()
        service.get_hosts.return_value = ["http://host1.biz"]
        service.required_headers = {}

        endpoint = mock.Mock()
        endpoint.required_headers = {}
        endpoint.get_formatted_path.return_value = "/foo/"
        del endpoint.stub_response

        mock_logger = mock.Mock()
        mock_response = mock.Mock()
        mock_response.history = []

        session = mock.Mock()
        session.send.return_value = mock_response

        ServiceCaller.call(service,
                           endpoint,
                           session=session,
                           logger=mock_logger,
                           encoding="FAKE-CODEC")

        assert "FAKE-CODEC" == mock_response.encoding
示例#9
0
    def test_call_stub(self, MockSession, MockAdapter,
                       mock_build_request_object, mock_get_adapted_session,
                       mock_timeout):
        """
        Test getting a response for a ``StubEndpoint``
        """
        service = mock.Mock()
        service.get_hosts.return_value = ["http://host1.biz"]

        stub_endpoint = mock.Mock()
        stub_endpoint.stub_response = {"stub": "response"}

        actual_response = ServiceCaller.call(service, stub_endpoint)

        expected_response = {"stub": "response"}

        assert expected_response == actual_response
示例#10
0
    def test_call_stub_dynamic(self, MockSession, MockAdapter,
                               mock_build_request_object,
                               mock_get_adapted_session, mock_timeout):
        """
        Test getting a response for a ``StubEndpoint`` using a dynamic response
        """
        service = mock.Mock()
        service.get_hosts.return_value = ["http://host1.biz"]

        stub_endpoint = mock.Mock()

        def stub_response(**kwargs):
            return "stub response"

        stub_endpoint.stub_response = stub_response

        actual_response = ServiceCaller.call(service, stub_endpoint)

        expected_response = "stub response"

        assert expected_response == actual_response
示例#11
0
    def test_call_stub_dynamic_params(self, MockSession, MockAdapter,
                                      mock_build_request_object,
                                      mock_get_adapted_session, mock_timeout):
        """
        Test getting a response for a ``StubEndpoint`` using a dynamic response with parameters
        """
        service = mock.Mock()
        service.get_hosts.return_value = ["http://host1.biz"]

        stub_endpoint = mock.Mock()

        def stub_response(**kwargs):
            response_map = {"param_value": "correct", "default": "incorrect"}
            data_key = kwargs["params"].setdefault("param_key", "default")
            return response_map[data_key]

        stub_endpoint.stub_response = stub_response

        actual_response = ServiceCaller.call(
            service, stub_endpoint, params={"param_key": "param_value"})

        expected_response = "correct"

        assert expected_response == actual_response
示例#12
0
def test_build_url(host, path, url):
    assert url == ServiceCaller.build_url(host, path)
示例#13
0
 def test_choose_host_raises_exception(self):
     service = mock.Mock()
     service.get_hosts.return_value = []
     with pytest.raises(NoHostsAvailableException):
         ServiceCaller.choose_host(service)
示例#14
0
    def test_build_request_object_raises_no_host_exception(self):
        service = mock.Mock()
        service.get_hosts.return_value = []

        with pytest.raises(NoHostsAvailableException):
            ServiceCaller.build_request_object(None, service, None)
示例#15
0
 def test_choose_host(self):
     hosts = ['foo', 'bar', 'baz']
     service = mock.Mock()
     service.get_hosts.return_value = hosts
     assert ServiceCaller.choose_host(service) in hosts
示例#16
0
    def test_call(self, MockSession, MockAdapter, mock_build_request_object,
                  mock_get_adapted_session, mock_timeout):
        service = mock.Mock()
        service.get_hosts.return_value = ["http://host1.biz"]

        endpoint = mock.Mock()
        endpoint.default_method = "GET"
        endpoint.get_formatted_path.return_value = "/foo/"
        endpoint.required_headers = {}
        endpoint.streaming = True
        del endpoint.stub_response

        request = mock.Mock()
        request.url = "http://host1.biz/foo/"
        mock_build_request_object.return_value = request

        mock_logger = mock.Mock()

        mock_response = mock.Mock()
        mock_response.status_code = 200
        mock_response.url = "http://host1.biz/foo/"
        mock_response.history = []

        mock_session = MockSession()
        mock_session.send.return_value = mock_response
        mock_get_adapted_session.return_value = mock_session

        ServiceCaller.call(service,
                           endpoint,
                           timeout_spec=mock_timeout,
                           logger=mock_logger)

        mock_get_adapted_session.assert_called_once_with(MockAdapter())
        mock_session.send.assert_called_once_with(
            request,
            timeout=(mock_timeout.connection_timeout,
                     mock_timeout.read_timeout),
            stream=endpoint.streaming,
            allow_redirects=True,
        )

        mock_logger.info.assert_any_call("GET http://host1.biz/foo/")
        mock_logger.info.assert_any_call("200 http://host1.biz/foo/")

        endpoint.default_method = "POST"
        request.method = "POST"

        ServiceCaller.call(service,
                           endpoint,
                           session=mock_session,
                           timeout_spec=mock_timeout,
                           logger=mock_logger)

        mock_session.send.assert_any_call(
            request,
            timeout=(mock_timeout.connection_timeout,
                     mock_timeout.read_timeout),
            stream=endpoint.streaming,
            allow_redirects=True,
        )

        mock_logger.info.assert_any_call("GET http://host1.biz/foo/")
        mock_logger.info.assert_any_call("200 http://host1.biz/foo/")

        request.method = "PUT"

        ServiceCaller.call(service,
                           endpoint,
                           method="PUT",
                           session=mock_session,
                           timeout_spec=mock_timeout,
                           logger=mock_logger)

        mock_session.send.assert_any_call(
            request,
            timeout=(mock_timeout.connection_timeout,
                     mock_timeout.read_timeout),
            stream=endpoint.streaming,
            allow_redirects=True,
        )
示例#17
0
 def test_get_adapted_session(self, mock_session):
     adapter = mock.Mock()
     adapted_session = ServiceCaller.get_adapted_session(adapter)
     assert adapter == adapted_session.get_adapter("http://foo.com")
     assert adapter == adapted_session.get_adapter("https://foo.com")
示例#18
0
 def test_choose_host(self):
     hosts = ["foo", "bar", "baz"]
     service = mock.Mock()
     service.get_hosts.return_value = hosts
     assert ServiceCaller.choose_host(service) in hosts