Dynamic callback mock is not called when there were matching already used static responses.
alex-kowalczyk opened this issue · 4 comments
Adding a callback mock for an URL which matched previously to any static response mock has no effect.
Seems that pytext-httpx chooses to use last (even already used) static response, even though there is an unused callback mock waiting to be picked.
This is counter-intuitive and incompatible at least with aioresponses.
@pytest.mark.asyncio
async def test_callback_order(httpx_mock: HTTPXMock):
async with httpx.AsyncClient() as client:
httpx_mock.add_response(url='http://localhost/api', json={'response': 'first'})
assert 'first' == (await client.get('http://localhost/api')).json()['response']
httpx_mock.add_response(url='http://localhost/api', json={'response': 'second'})
assert 'second' == (await client.get('http://localhost/api')).json()['response']
def _callback(req: httpx.Request):
return httpx.Response(status_code=200, json={'response': 'third'})
httpx_mock.add_callback(_callback, url='http://localhost/api')
assert 'third' == (await client.get('http://localhost/api')).json()['response']
The result:
> assert 'third' == (await client.get('http://localhost/api')).json()['response']
E AssertionError: assert 'third' == 'second'
E - second
E + third
Hello @alex-kowalczyk ,
I was not planning on someone using both response and callbacks matching the same URL in the same test function. Your use case is valid of course. I will see what I can do to fix this.
Thanks again for reporting.
Release 0.18.0 is now available on pypi and should fix your issue.
@Colin-b , I confirm 0.18.0 solves the issue. This was a lightning fast fix!
Glad to hear :) Note that in your sample you are using matching on url when registering responses and callbacks. This is not mandatory (if you are coming from aioresponses, where it might be a requirement)