Add a testing helper for serving HTTP locally.

This commit is contained in:
Eric Snow 2018-01-11 20:04:36 +00:00
parent 7981cc1f9e
commit 137f671ee4
2 changed files with 61 additions and 0 deletions

View file

61
tests/helpers/http.py Normal file
View file

@ -0,0 +1,61 @@
import http.server
import threading
class Server:
"""Wraps an http.server.HTTPServer in a thread."""
def __init__(self, handler, host='', port=8000):
self.handler = handler
self._addr = (host, port)
self._server = None
self._thread = None
@property
def address(self):
host, port = self._addr
if host == '':
host = 'localhost'
return '{}:{}'.format(host, port)
def start(self):
if self._server is not None:
raise RuntimeError('already started')
self._server = http.server.HTTPServer(self._addr, self.handler)
self._thread = threading.Thread(
target=lambda: self._server.serve_forever())
self._thread.start()
def stop(self):
if self._server is None:
raise RuntimeError('not running')
self._server.shutdown()
self._thread.join()
self._server.server_close()
self._thread = None
self._server = None
def __enter__(self):
self.start()
return self
def __exit__(self, *args):
self.stop()
def json_file_handler(data):
"""Return an HTTP handler that always serves the given JSON bytes."""
class HTTPHandler(http.server.BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-Type', b'application/json')
self.send_header('Content-Length',
str(len(data)).encode('ascii'))
self.end_headers()
self.wfile.write(data)
def log_message(self, *args, **kwargs):
pass
return HTTPHandler