Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for httpx > 0.17.x #40

Closed
fabaff opened this issue Apr 27, 2021 · 3 comments · Fixed by #41
Closed

Support for httpx > 0.17.x #40

fabaff opened this issue Apr 27, 2021 · 3 comments · Fixed by #41
Assignees
Labels
enhancement New feature or request

Comments

@fabaff
Copy link

fabaff commented Apr 27, 2021

httpx released a new version. Currently the httpx is limited to 0.17.*.

It would be nice if pytest-httpx is updated.

Thanks

@Colin-b Colin-b self-assigned this Apr 27, 2021
@Colin-b Colin-b added the enhancement New feature or request label Apr 27, 2021
@Colin-b Colin-b linked a pull request Apr 27, 2021 that will close this issue
@Colin-b
Copy link
Owner

Colin-b commented Apr 27, 2021

Thanks for reporting.

pytest-httpx 0.12.0 now requires httpx==0.18.*

@Colin-b Colin-b closed this as completed Apr 27, 2021
@mweinelt
Copy link

mweinelt commented May 4, 2021

Trying to run the tests for PyRMVtransport with httpx==0.18.0 and pytest-httpx==0.12.0 and I'm running into the following incompatibility still:

============================= test session starts ==============================
platform linux -- Python 3.8.9, pytest-6.2.3, py-1.10.0, pluggy-0.13.1
rootdir: /build/source
plugins: asyncio-0.14.0, httpx-0.12.0
collected 15 items

tests/test_bugs.py ..                                                    [ 13%]
tests/test_rmvtransport.py ..xxxx.xx..xF                                 [100%]

=================================== FAILURES ===================================
___________________________ test__query_rmv_api_fail ___________________________

httpx_mock = <pytest_httpx._httpx_mock.HTTPXMock object at 0x7ffff5773670>

    @pytest.mark.asyncio
    @pytest.mark.xfail(raises=RMVtransportError)
    async def test__query_rmv_api_fail(httpx_mock):
        """Test failing station search."""

        def raise_timeout(request, ext: dict):
            raise httpx.ReadTimeout(
                f"Unable to read within {ext['timeout']}", request=request
            )

        httpx_mock.add_callback(raise_timeout)

        with pytest.raises(httpx.ReadTimeout):
            rmv = RMVtransport(timeout=0.005)

            url = f"https://{URL}{URL_SEARCH_PATH}"
>           await rmv._query_rmv_api(url)

tests/test_rmvtransport.py:219:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
RMVtransport/rmvtransport.py:153: in _query_rmv_api
    response = await client.get(url)
/nix/store/a869sns3k418f310cs94qm3qw1178mib-python3.8-httpx-0.18.0/lib/python3.8/site-packages/httpx/_client.py:1662: in get
    return await self.request(
/nix/store/a869sns3k418f310cs94qm3qw1178mib-python3.8-httpx-0.18.0/lib/python3.8/site-packages/httpx/_client.py:1426: in request
    response = await self.send(
/nix/store/a869sns3k418f310cs94qm3qw1178mib-python3.8-httpx-0.18.0/lib/python3.8/site-packages/httpx/_client.py:1511: in send
    response = await self._send_handling_auth(
/nix/store/a869sns3k418f310cs94qm3qw1178mib-python3.8-httpx-0.18.0/lib/python3.8/site-packages/httpx/_client.py:1546: in _send_handling_auth
    response = await self._send_handling_redirects(
/nix/store/a869sns3k418f310cs94qm3qw1178mib-python3.8-httpx-0.18.0/lib/python3.8/site-packages/httpx/_client.py:1580: in _send_handling_redirects
    response = await self._send_single_request(request, timeout)
/nix/store/a869sns3k418f310cs94qm3qw1178mib-python3.8-httpx-0.18.0/lib/python3.8/site-packages/httpx/_client.py:1621: in _send_single_request
    ) = await transport.handle_async_request(
/nix/store/d4zi55m70c468pnybqlykych3s5mgzl0-python3.8-pytest-httpx-0.12.0/lib/python3.8/site-packages/pytest_httpx/_httpx_mock.py:335: in handle_async_request
    return self.mock._handle_request(*args, **kwargs)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <pytest_httpx._httpx_mock.HTTPXMock object at 0x7ffff5773670>
method = b'GET'
url = (b'https', b'www.rmv.de', None, b'/auskunft/bin/jp/ajax-getstop.exe/dn')
headers = [(b'Host', b'www.rmv.de'), (b'Accept', b'*/*'), (b'Accept-Encoding', b'gzip, deflate, br'), (b'Connection', b'keep-alive'), (b'User-Agent', b'python-httpx/0.18.0')]
stream = <httpx.ByteStream object at 0x7ffff5b6aca0>
extensions = {'timeout': {'connect': 5.0, 'pool': 5.0, 'read': 5.0, 'write': 5.0}}

    def _handle_request(
        self,
        method: bytes,
        url: URL,
        headers: Headers = None,
        stream: Union[httpcore.SyncByteStream, httpcore.AsyncByteStream] = None,
        extensions: dict = None,
    ) -> Response:
        request = to_request(method, url, headers, stream)
        self._requests.append(request)

        response = self._get_response(request)
        if response:
            return response

        callback = self._get_callback(request)
        if callback:
>           return callback(request=request, extensions=extensions)
E           TypeError: raise_timeout() got an unexpected keyword argument 'extensions'

/nix/store/d4zi55m70c468pnybqlykych3s5mgzl0-python3.8-pytest-httpx-0.12.0/lib/python3.8/site-packages/pytest_httpx/_httpx_mock.py:179: TypeError
=========================== short test summary info ============================
FAILED tests/test_rmvtransport.py::test__query_rmv_api_fail - TypeError: rais...
==================== 1 failed, 7 passed, 7 xfailed in 0.70s ====================

@Colin-b
Copy link
Owner

Colin-b commented May 4, 2021

Yes, as stated in changelog you have to rename ext parameter into extensions. This information is of course also available in the documentation.

So your test case should be modified:

@pytest.mark.asyncio
@pytest.mark.xfail(raises=RMVtransportError)
async def test__query_rmv_api_fail(httpx_mock):
    """Test failing station search."""

    def raise_timeout(request, extensions: dict):
        raise httpx.ReadTimeout(
            f"Unable to read within {extensions['timeout']}", request=request
        )

    httpx_mock.add_callback(raise_timeout)

    with pytest.raises(httpx.ReadTimeout):
        rmv = RMVtransport(timeout=0.005)

        url = f"https://{URL}{URL_SEARCH_PATH}"
        await rmv._query_rmv_api(url)

Note that what you are mocking is actually the exact behavior of the mock by default, you should be able to modify your test this way and have the same behavior:

@pytest.mark.asyncio
@pytest.mark.xfail(raises=RMVtransportError)
async def test__query_rmv_api_fail(httpx_mock):
    """Test failing station search."""
    with pytest.raises(httpx.ReadTimeout):
        rmv = RMVtransport(timeout=0.005)

        url = f"https://{URL}{URL_SEARCH_PATH}"
        await rmv._query_rmv_api(url)

Best Regards

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants