Skip to content

Commit 7b2fb1f

Browse files
committed
server: implement 'permanently failed' state
This states that at least one request did not meet the requiremenets for the ordered handlers. Eg. we waited for a GET /example request to be the *first* request, but the client sent a GET /foobar request, then we should pull the handbrake and stop serving further requests. The idea behing this is to avoid the situation having the 2nd ordered expectation pass while the 1st failed.
1 parent ef79506 commit 7b2fb1f

3 files changed

Lines changed: 15 additions & 4 deletions

File tree

pytest_httpserver/httpserver.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,13 @@ def __init__(self, host="localhost", port=4000):
126126
self.ordered_handlers = []
127127
self.oneshot_handlers = RequestHandlerList()
128128
self.handlers = RequestHandlerList()
129+
self.permanently_failed = False
129130

130131
def clear(self):
131132
self.clear_assertions()
132133
self.clear_log()
133134
self.clear_all_handlers()
135+
self.permanently_failed = False
134136

135137
def clear_assertions(self):
136138
self.assertions = []
@@ -152,7 +154,7 @@ def url_for(self, suffix: str):
152154
def create_matcher(self, *args, **kwargs):
153155
return RequestMatcher(*args, **kwargs)
154156

155-
def expect_oneshot_request(self, uri, method="GET", data=None, data_encoding="utf-8", headers=None, ordered=False):
157+
def expect_oneshot_request(self, uri, method="GET", data=None, data_encoding="utf-8", headers=None, *, ordered=False):
156158
matcher = self.create_matcher(uri, method=method, data=data, data_encoding=data_encoding, headers=headers)
157159
request_handler = RequestHandler(matcher)
158160
if ordered:
@@ -221,13 +223,20 @@ def respond_nohandler(self, request: Request):
221223
self.add_assertion(text + self.format_matchers())
222224
return Response("No handler found for this request", 500)
223225

226+
def respond_permanent_failure(self):
227+
self.add_assertion("All requests will be permanently failed due failed ordered handler")
228+
return Response("No handler found for this request", 500)
229+
224230
def dispatch(self, request):
231+
if self.permanently_failed:
232+
return self.respond_permanent_failure()
233+
225234
handler = None
226235
if self.ordered_handlers:
227236
handler = self.ordered_handlers[0]
228237
if not handler.matcher.match(request):
238+
self.permanently_failed = True
229239
response = self.respond_nohandler(request)
230-
self.ordered_handlers.pop(0)
231240
return response
232241

233242
self.ordered_handlers.pop(0)

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
setup(
99
name="pytest_httpserver",
10-
version="0.2",
10+
version="0.1",
1111
url="https://www.github.com/csernazs/pytest-httpserver",
1212
packages=find_packages(),
1313
author="Zsolt Cserna",

tests/test_oneshot.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,12 @@ def test_ordered_invalid_order(httpserver: HTTPServer):
5858
assert len(httpserver.ordered_handlers) == 2
5959

6060
# these would not pass as the order is different
61+
# this mark the whole thing 'permanently failed' so no further requests must pass
6162
response = requests.get(httpserver.url_for("/foobaz"))
6263
assert response.status_code == 500
6364

6465
response = requests.get(httpserver.url_for("/foobar"))
6566
assert response.status_code == 500
6667

67-
assert len(httpserver.ordered_handlers) == 0
68+
# as no ordered handlers are triggered yet, these must be intact..
69+
assert len(httpserver.ordered_handlers) == 2

0 commit comments

Comments
 (0)