Skip to content

Commit b86c90b

Browse files
committed
pytest_httpserver: make things better
Fix bugs, mostly...
1 parent db12c9c commit b86c90b

2 files changed

Lines changed: 83 additions & 17 deletions

File tree

pytest_httpserver/httpserver.py

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11

22
import threading
33
import json
4-
import signal
5-
import collections
4+
import time
65

76
from werkzeug.wrappers import Request, Response
8-
from werkzeug.serving import run_simple, make_server
7+
from werkzeug.serving import make_server
98

109
URI_DEFAULT = ""
1110
METHOD_ALL = "__ALL"
@@ -27,8 +26,16 @@ def __init__(self, uri, method="GET", data=None, data_encoding="utf-8", headers=
2726

2827
self.data = data
2928

29+
def __repr__(self):
30+
class_name = self.__class__.__name__
31+
retval = "<{} ".format(class_name)
32+
retval += "uri={uri!r} method={method!r} query_string={query_string!r} headers={headers!r} data={data!r}>".format_map(self.__dict__)
33+
return retval
34+
3035
def match_data(self, request):
31-
return request.data != self.data
36+
if self.data is None:
37+
return True
38+
return request.data == self.data
3239

3340
def difference(self, request: Request):
3441
retval = []
@@ -57,10 +64,10 @@ def difference(self, request: Request):
5764
return retval
5865

5966
def match(self, request: Request):
60-
if self.difference(request):
61-
return False
62-
else:
63-
return True
67+
difference = self.difference(request)
68+
if difference:
69+
print(difference)
70+
return not difference
6471

6572

6673
class NoHandlerError(Exception):
@@ -100,13 +107,13 @@ def match(self, request):
100107
for requesthandler in self:
101108
if requesthandler.matcher.match(request):
102109
return requesthandler
110+
return None
103111

104112

105113
class Server:
106114
def __init__(self, host="localhost", port=4000):
107115
self.host = host
108116
self.port = port
109-
self.handlers = {}
110117
self.assertions = []
111118
self.server = None
112119
self.server_thread = None
@@ -130,7 +137,7 @@ def create_matcher(self, *args, **kwargs):
130137
return RequestMatcher(*args, **kwargs)
131138

132139
def expect_oneshot_request(self, uri, method="GET", data=None, data_encoding="utf-8", headers=None, ordered=False):
133-
matcher = self.create_matcher(uri, method="GET", data=None, data_encoding="utf-8", headers=None)
140+
matcher = self.create_matcher(uri, method=method, data=data, data_encoding=data_encoding, headers=headers)
134141
request_handler = RequestHandler(matcher)
135142
if ordered:
136143
self.ordered_handlers.append(request_handler)
@@ -139,8 +146,8 @@ def expect_oneshot_request(self, uri, method="GET", data=None, data_encoding="ut
139146

140147
return request_handler
141148

142-
def expect_request(self, uri, method="GET", data=None, data_encoding="utf-8", headers=None):
143-
matcher = self.create_matcher(uri, method="GET", data=None, data_encoding="utf-8", headers=None)
149+
def expect_request(self, uri, method="GET", data=None, data_encoding="utf-8", headers=None) -> RequestHandler:
150+
matcher = self.create_matcher(uri, method=method, data=data, data_encoding=data_encoding, headers=headers)
144151
request_handler = RequestHandler(matcher)
145152
self.handlers.append(request_handler)
146153
return request_handler
@@ -154,7 +161,10 @@ def start(self):
154161
self.server_thread.start()
155162

156163
def stop(self):
164+
t1 = time.time()
157165
self.server.shutdown()
166+
print(time.time() - t1)
167+
158168
self.server_thread.join()
159169
self.server = None
160170
self.server_thread = None
@@ -166,8 +176,29 @@ def check_assertions(self):
166176
if self.assertions:
167177
raise AssertionError(self.assertions.pop(0))
168178

179+
def format_nohandler_assertion(self, request):
180+
def format_handlers(handlers):
181+
if handlers:
182+
return [" {!r}".format(handler.matcher) for handler in handlers]
183+
else:
184+
return [" none"]
185+
186+
lines = []
187+
lines.append("No handler found for request {!r}.".format(request))
188+
lines.append("")
189+
lines.append("Ordered matchers:")
190+
lines.extend(format_handlers(self.ordered_handlers))
191+
lines.append("")
192+
lines.append("Oneshot matchers:")
193+
lines.extend(format_handlers(self.oneshot_handlers))
194+
lines.append("")
195+
lines.append("Persistent matchers:")
196+
lines.extend(format_handlers(self.handlers))
197+
198+
return "\n".join(lines)
199+
169200
def respond_nohandler(self, request: Request):
170-
self.add_assertion("No handler found for request {!r}".format(request))
201+
self.add_assertion(self.format_nohandler_assertion(request))
171202
return Response("No handler found for this request", 500)
172203

173204
def dispatch(self, request):

tests/test_server.py

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,51 @@
11

2-
from pytest_httpserver.httpserver import Server
3-
42
import requests
53
import pytest
4+
import coverage
5+
6+
7+
from pytest_httpserver.httpserver import Server
8+
from werkzeug.wrappers import Response
9+
10+
JSON_STRING = '{"foo": "bar"}'
611

712

8-
def test_expected_request(server):
13+
def test_expected_request_json(server: Server):
914
server.expect_request("/foobar").respond_with_json({"foo": "bar"})
1015
assert requests.get(server.url_for("/foobar")).json() == {'foo': 'bar'}
1116

1217

18+
def test_expected_request_data(server: Server):
19+
server.expect_request("/foobar").respond_with_data(JSON_STRING)
20+
assert requests.get(server.url_for("/foobar")).json() == {'foo': 'bar'}
21+
22+
23+
def test_expected_request_handler(server: Server):
24+
server.expect_request("/foobar").respond_with_handler(lambda request: JSON_STRING)
25+
assert requests.get(server.url_for("/foobar")).json() == {'foo': 'bar'}
26+
27+
28+
def test_expected_request_response(server: Server):
29+
server.expect_request("/foobar").respond_with_response(Response(JSON_STRING))
30+
assert requests.get(server.url_for("/foobar")).json() == {'foo': 'bar'}
31+
32+
33+
def test_expected_request_response_as_string(server: Server):
34+
server.expect_request("/foobar").respond_with_response(JSON_STRING)
35+
assert requests.get(server.url_for("/foobar")).json() == {'foo': 'bar'}
36+
37+
38+
def test_request_post(server: Server):
39+
server.expect_request("/foobar", data='{"request": "example"}', method="POST").respond_with_data("example_response")
40+
response = requests.post(server.url_for("/foobar"), json={"request": "example"})
41+
print(server.log[0])
42+
server.check_assertions()
43+
assert response.text == "example_response"
44+
assert response.status_code == 200
45+
46+
1347
def test_unexpected_request(server: Server):
1448
server.expect_request("/foobar").respond_with_json({"foo": "bar"})
1549
requests.get(server.url_for("/nonexists"))
16-
server.check_assertions()
50+
with pytest.raises(AssertionError):
51+
server.check_assertions()

0 commit comments

Comments
 (0)