Skip to content

Commit ba3da32

Browse files
committed
server: make ordered tests work
Write the tests for ordered tests, and then fix the bugs. :I
1 parent 4980613 commit ba3da32

2 files changed

Lines changed: 78 additions & 8 deletions

File tree

pytest_httpserver/httpserver.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -222,19 +222,25 @@ def respond_nohandler(self, request: Request):
222222
return Response("No handler found for this request", 500)
223223

224224
def dispatch(self, request):
225+
handler = None
225226
if self.ordered_handlers:
226-
handler = self.ordered_handlers.pop()
227+
handler = self.ordered_handlers[0]
227228
if not handler.matcher.match(request):
228-
return self.respond_nohandler(request)
229+
response = self.respond_nohandler(request)
230+
self.ordered_handlers.pop(0)
231+
return response
229232

230-
handler = self.oneshot_handlers.match(request)
231-
if handler:
232-
self.oneshot_handlers.remove(handler)
233-
else:
234-
handler = self.handlers.match(request)
233+
self.ordered_handlers.pop(0)
235234

236235
if not handler:
237-
return self.respond_nohandler(request)
236+
handler = self.oneshot_handlers.match(request)
237+
if handler:
238+
self.oneshot_handlers.remove(handler)
239+
else:
240+
handler = self.handlers.match(request)
241+
242+
if not handler:
243+
return self.respond_nohandler(request)
238244

239245
response = handler.respond(request)
240246

tests/test_server.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,67 @@ def test_server_cleared_for_each_test(httpserver: HTTPServer):
6161
def test_server_with_statement():
6262
with HTTPServer(port=4001):
6363
pass
64+
65+
66+
def test_oneshot(httpserver: HTTPServer):
67+
httpserver.expect_oneshot_request("/foobar").respond_with_data("OK foobar")
68+
httpserver.expect_oneshot_request("/foobaz").respond_with_data("OK foobaz")
69+
70+
assert len(httpserver.oneshot_handlers) == 2
71+
72+
# first requests should pass
73+
response = requests.get(httpserver.url_for("/foobaz"))
74+
httpserver.check_assertions()
75+
assert response.status_code == 200
76+
assert response.text == "OK foobaz"
77+
78+
response = requests.get(httpserver.url_for("/foobar"))
79+
httpserver.check_assertions()
80+
assert response.status_code == 200
81+
assert response.text == "OK foobar"
82+
83+
assert len(httpserver.oneshot_handlers) == 0
84+
85+
# second requests should fail due to 'oneshot' type
86+
assert requests.get(httpserver.url_for("/foobar")).status_code == 500
87+
assert requests.get(httpserver.url_for("/foobaz")).status_code == 500
88+
89+
90+
def test_ordered_ok(httpserver: HTTPServer):
91+
httpserver.expect_oneshot_request("/foobar", ordered=True).respond_with_data("OK foobar")
92+
httpserver.expect_oneshot_request("/foobaz", ordered=True).respond_with_data("OK foobaz")
93+
94+
assert len(httpserver.ordered_handlers) == 2
95+
96+
# first requests should pass
97+
response = requests.get(httpserver.url_for("/foobar"))
98+
httpserver.check_assertions()
99+
assert response.status_code == 200
100+
assert response.text == "OK foobar"
101+
102+
response = requests.get(httpserver.url_for("/foobaz"))
103+
httpserver.check_assertions()
104+
assert response.status_code == 200
105+
assert response.text == "OK foobaz"
106+
107+
assert len(httpserver.ordered_handlers) == 0
108+
109+
# second requests should fail due to 'oneshot' type
110+
assert requests.get(httpserver.url_for("/foobar")).status_code == 500
111+
assert requests.get(httpserver.url_for("/foobaz")).status_code == 500
112+
113+
114+
def test_ordered_invalid_order(httpserver: HTTPServer):
115+
httpserver.expect_oneshot_request("/foobar", ordered=True).respond_with_data("OK foobar")
116+
httpserver.expect_oneshot_request("/foobaz", ordered=True).respond_with_data("OK foobaz")
117+
118+
assert len(httpserver.ordered_handlers) == 2
119+
120+
# these would not pass as the order is different
121+
response = requests.get(httpserver.url_for("/foobaz"))
122+
assert response.status_code == 500
123+
124+
response = requests.get(httpserver.url_for("/foobar"))
125+
assert response.status_code == 500
126+
127+
assert len(httpserver.ordered_handlers) == 0

0 commit comments

Comments
 (0)