diff --git a/.gitignore b/.gitignore index 7c904e59..0727b2f4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ *.pyc .tox .cache +.pytest_cache/ build/ dist/ *.egg/ diff --git a/.travis.yml b/.travis.yml index 0e432701..169ee5a5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,6 +16,8 @@ env: matrix: allow_failures: - env: TOX_SUFFIX="boto3" + - env: TOX_SUFFIX="aiohttp" + python: "pypy3.5-5.9.0" exclude: # Only run flakes on a single Python 2.x and a single 3.x - env: TOX_SUFFIX="flakes" diff --git a/tests/integration/aiohttp_utils.py b/tests/integration/aiohttp_utils.py index 991877b1..4fdf63e0 100644 --- a/tests/integration/aiohttp_utils.py +++ b/tests/integration/aiohttp_utils.py @@ -1,15 +1,23 @@ +# flake8: noqa import asyncio + import aiohttp @asyncio.coroutine -def aiohttp_request(loop, method, url, output='text', **kwargs): - with aiohttp.ClientSession(loop=loop) as session: - response = yield from session.request(method, url, **kwargs) # NOQA: E999 - if output == 'text': - content = yield from response.text() # NOQA: E999 - elif output == 'json': - content = yield from response.json() # NOQA: E999 - elif output == 'raw': - content = yield from response.read() # NOQA: E999 - return response, content +def aiohttp_request(loop, method, url, output='text', encoding='utf-8', **kwargs): + session = aiohttp.ClientSession(loop=loop) + response_ctx = session.request(method, url, **kwargs) + + response = yield from response_ctx.__aenter__() + if output == 'text': + content = yield from response.text() + elif output == 'json': + content = yield from response.json(encoding=encoding) + elif output == 'raw': + content = yield from response.read() + + response_ctx._resp.close() + yield from session.close() + + return response, content diff --git a/tests/integration/async_def.py b/tests/integration/async_def.py deleted file mode 100644 index 96cab1da..00000000 --- a/tests/integration/async_def.py +++ /dev/null @@ -1,13 +0,0 @@ -import aiohttp -import pytest -import vcr - - -@vcr.use_cassette() -@pytest.mark.asyncio -async def test_http(): # noqa: E999 - async with aiohttp.ClientSession() as session: - url = 'https://httpbin.org/get' - params = {'ham': 'spam'} - resp = await session.get(url, params=params) # noqa: E999 - assert (await resp.json())['args'] == {'ham': 'spam'} # noqa: E999 diff --git a/tests/integration/test_aiohttp.py b/tests/integration/test_aiohttp.py index bccd4e67..db619849 100644 --- a/tests/integration/test_aiohttp.py +++ b/tests/integration/test_aiohttp.py @@ -1,19 +1,12 @@ +import contextlib + import pytest +asyncio = pytest.importorskip("asyncio") aiohttp = pytest.importorskip("aiohttp") -import asyncio # noqa: E402 -import contextlib # noqa: E402 - -import pytest # noqa: E402 import vcr # noqa: E402 - from .aiohttp_utils import aiohttp_request # noqa: E402 -try: - from .async_def import test_http # noqa: F401 -except SyntaxError: - pass - def run_in_loop(fn): with contextlib.closing(asyncio.new_event_loop()) as loop: @@ -78,11 +71,13 @@ def test_text(tmpdir, scheme): def test_json(tmpdir, scheme): url = scheme + '://httpbin.org/get' + headers = {'Content-Type': 'application/json'} + with vcr.use_cassette(str(tmpdir.join('json.yaml'))): - _, response_json = get(url, output='json') + _, response_json = get(url, output='json', headers=headers) with vcr.use_cassette(str(tmpdir.join('json.yaml'))) as cassette: - _, cassette_response_json = get(url, output='json') + _, cassette_response_json = get(url, output='json', headers=headers) assert cassette_response_json == response_json assert cassette.play_count == 1 @@ -112,24 +107,28 @@ def test_post(tmpdir, scheme): def test_params(tmpdir, scheme): url = scheme + '://httpbin.org/get' + headers = {'Content-Type': 'application/json'} params = {'a': 1, 'b': False, 'c': 'c'} + with vcr.use_cassette(str(tmpdir.join('get.yaml'))) as cassette: - _, response_json = get(url, output='json', params=params) + _, response_json = get(url, output='json', params=params, headers=headers) with vcr.use_cassette(str(tmpdir.join('get.yaml'))) as cassette: - _, cassette_response_json = get(url, output='json', params=params) + _, cassette_response_json = get(url, output='json', params=params, headers=headers) assert cassette_response_json == response_json assert cassette.play_count == 1 def test_params_same_url_distinct_params(tmpdir, scheme): url = scheme + '://httpbin.org/get' + headers = {'Content-Type': 'application/json'} params = {'a': 1, 'b': False, 'c': 'c'} + with vcr.use_cassette(str(tmpdir.join('get.yaml'))) as cassette: - _, response_json = get(url, output='json', params=params) + _, response_json = get(url, output='json', params=params, headers=headers) with vcr.use_cassette(str(tmpdir.join('get.yaml'))) as cassette: - _, cassette_response_json = get(url, output='json', params=params) + _, cassette_response_json = get(url, output='json', params=params, headers=headers) assert cassette_response_json == response_json assert cassette.play_count == 1 diff --git a/tests/integration/test_requests.py b/tests/integration/test_requests.py index 6e1511d8..f970c952 100644 --- a/tests/integration/test_requests.py +++ b/tests/integration/test_requests.py @@ -116,8 +116,8 @@ def test_post_chunked_binary(tmpdir, httpbin): assert req1 == req2 -@pytest.mark.xfail('sys.version_info >= (3, 6)', strict=True, raises=ConnectionError) -@pytest.mark.xfail((3, 5) < sys.version_info < (3, 6) and +@pytest.mark.xskip('sys.version_info >= (3, 6)', strict=True, raises=ConnectionError) +@pytest.mark.xskip((3, 5) < sys.version_info < (3, 6) and platform.python_implementation() == 'CPython', reason='Fails on CPython 3.5') def test_post_chunked_binary_secure(tmpdir, httpbin_secure): diff --git a/tox.ini b/tox.ini index 44f803db..b72d43b2 100644 --- a/tox.ini +++ b/tox.ini @@ -25,7 +25,7 @@ deps = {py27,py35,py36,pypy}-tornado4: pytest-tornado {py27,py35,py36}-tornado4: pycurl boto3: boto3 - aiohttp: aiohttp<3 + aiohttp: aiohttp aiohttp: pytest-asyncio [flake8] diff --git a/vcr/stubs/aiohttp_stubs/__init__.py b/vcr/stubs/aiohttp_stubs/__init__.py index 79ce06c1..7b2837d3 100644 --- a/vcr/stubs/aiohttp_stubs/__init__.py +++ b/vcr/stubs/aiohttp_stubs/__init__.py @@ -12,6 +12,20 @@ class MockClientResponse(ClientResponse): + def __init__(self, method, url): + super().__init__( + method=method, + url=url, + writer=None, + continue100=None, + timer=None, + request_info=None, + auto_decompress=None, + traces=None, + loop=asyncio.get_event_loop(), + session=None, + ) + # TODO: get encoding from header @asyncio.coroutine def json(self, *, encoding='utf-8', loads=json.loads): # NOQA: E999