pytest_httpx icon indicating copy to clipboard operation
pytest_httpx copied to clipboard

How to mock and test request with content passed as byte iterator

Open adamko147 opened this issue 1 year ago • 0 comments

Hello team,

I have httpx code that passes content to request using byte iterator. When trying the test code using pytest_httpx and match_content on mocked request, I get assertion error and the aiter_bytes is never called. Here's what I'm trying...

import httpx
import pytest


async def aiter_bytes():
    yield b"h"
    yield b"e"
    yield b"l"
    yield b"l"
    yield b"o"


@pytest.mark.asyncio
async def test_httpx_get(httpx_mock):
    httpx_mock.add_response(method="PUT", url="http://put", content=b"world", match_content=b"hello")
    async with httpx.AsyncClient() as client:
        res = await client.put("http://put", content=aiter_bytes())
        assert res.text == "world"

and the exception when runnning the test

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <Request('PUT', 'http://put')>

    def read(self) -> bytes:
        """
        Read and return the request content.
        """
        if not hasattr(self, "_content"):
>           assert isinstance(self.stream, typing.Iterable)
E           AssertionError

When I remove the match_content parameter, the test passes, but the aiter_bytes is never called. Is there anything I'm missing? I'm not sure whether this is pytest_httpx or httpx issue, although when I run the code without pytest in real program, it works and sends the data properly.

Thank you, Adam

adamko147 avatar Aug 19 '24 04:08 adamko147