Skip to content

Commit

Permalink
Merge pull request #18 from macisamuele/maci-add-connection-error-sup…
Browse files Browse the repository at this point in the history
…port-and-bravado-integration-tests

Add connection error support and bravado integration tests
  • Loading branch information
macisamuele committed Jun 29, 2018
2 parents 24a303e + 88fb8f0 commit 25a1d9b
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 2 deletions.
3 changes: 3 additions & 0 deletions bravado_asyncio/future_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import time
from typing import Optional

import aiohttp.client_exceptions
from bravado.http_future import FutureAdapter as BaseFutureAdapter

from bravado_asyncio.definitions import AsyncioResponse
Expand All @@ -13,6 +14,7 @@ class FutureAdapter(BaseFutureAdapter):
a normal Python function, and we expect future to be from the concurrent.futures module."""

timeout_errors = (concurrent.futures.TimeoutError,)
connection_errors = (aiohttp.ClientConnectionError,)

def __init__(self, future: concurrent.futures.Future) -> None:
self.future = future
Expand All @@ -31,6 +33,7 @@ class AsyncioFutureAdapter(BaseFutureAdapter):
a coroutine, and we expect future to be awaitable."""

timeout_errors = (asyncio.TimeoutError,)
connection_errors = (aiohttp.ClientConnectionError,)

def __init__(self, future: asyncio.Future) -> None:
self.future = future
Expand Down
7 changes: 6 additions & 1 deletion bravado_asyncio/http_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from bravado_core.operation import Operation
from bravado_core.schema import is_list_like
from multidict import MultiDict
from yelp_bytes import from_bytes

from bravado_asyncio.definitions import RunMode
from bravado_asyncio.future_adapter import AsyncioFutureAdapter
Expand Down Expand Up @@ -142,7 +143,11 @@ def request(
url=request_params.get('url'),
params=params,
data=data,
headers=request_params.get('headers'),
headers={
# Convert not string headers to string
k: from_bytes(v) if isinstance(v, bytes) else str(v)
for k, v in request_params.get('headers', {}).items()
},
skip_auto_headers=skip_auto_headers,
timeout=timeout,
)
Expand Down
3 changes: 2 additions & 1 deletion requirements-dev.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
aiobravado
bottle
bravado-core>=4.11.0
bravado>=9.2.0
bravado[testing]>=10.1.0
coverage
ephemeral_port_reserve
mock
Expand Down
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
],
install_requires=[
'bravado>=10.0.0',
'yelp-bytes',
],
extras_require={
# as recommended by aiohttp, see http://aiohttp.readthedocs.io/en/stable/#library-installation
Expand Down
29 changes: 29 additions & 0 deletions tests/integration/bravado_integration_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import aiohttp.client_exceptions
from bravado.testing.integration_test import IntegrationTestsBaseClass
from bravado.testing.integration_test import ROUTE_1_RESPONSE

from bravado_asyncio.future_adapter import FutureAdapter
from bravado_asyncio.http_client import AsyncioClient


class TestServerBravadoAsyncioClient(IntegrationTestsBaseClass):

http_client_type = AsyncioClient
http_future_adapter_type = FutureAdapter
connection_errors_exceptions = {
aiohttp.ClientConnectionError(),
}

def cancel_http_future(self, http_future):
http_future.future.future.cancel()

def test_bytes_header(self, swagger_http_server):
# TODO: integrate this test into bravado integration tests suite
response = self.http_client.request({
'method': 'GET',
'headers': {'byte-header': b'1'},
'url': '{server_address}/1'.format(server_address=swagger_http_server),
'params': {},
}).result(timeout=1)

assert response.text == self.encode_expected_response(ROUTE_1_RESPONSE)

0 comments on commit 25a1d9b

Please sign in to comment.