csernazs / pytest-httpserver

Http server for pytest to test http clients
MIT License
209 stars 27 forks source link

Stackable expectations #46

Open csernazs opened 3 years ago

csernazs commented 3 years ago

In many cases, the parameters for expect_request() is very long, especially when multiple headers are specified or the request have a long data or json in its body. In such case the expect_request() call can be very long. If it bothers the developer, it needs to be shortened, for example by moving the literals to variables and then specifying the variables for the expect_request() call. In some cases, there are common expectations specified for each request, such as the content-type header is set to application/json.

It would be great to somehow bake a command, similar to the sh package's bake method.

So, it would look like:


server = httpserver.bake(headers={"content-type": "application/json"}) # and probably other common kwargs
server.expect_request("/foo", json={"foo": "bar"}).respond_with_json({"foo": "bar"})

Here, the bake is similar to the functools.partial function so it creates a new httpserver-like object whose defaults are changed.

funkyfuture commented 1 year ago

i wonder whether this could be realized on the fixture level, so that the definition of these common properties happens in the conftest.py.

csernazs commented 1 year ago

I think this could be done easily: conftest.py:

@pytest.fixture()
def myserver(httpserver):
    return httpserver.bake(headers={"content-type": "application/json"})

test_foo.py:

def test_foo(myserver):
    server.expect_request("/foo", json={"foo": "bar"}).respond_with_json({"foo": "bar"})

At the moment it is just an idea, it is not implemented yet.