@@ -0,0 +1,62 @@
|
||||
import logging
|
||||
from multiprocessing import Process
|
||||
from time import sleep
|
||||
|
||||
import uvicorn
|
||||
from fastapi import FastAPI
|
||||
|
||||
|
||||
class MockServer:
|
||||
""" Core application to test. """
|
||||
|
||||
def __init__(self, endpoints: list[dict]):
|
||||
"""
|
||||
|
||||
:param endpoints:
|
||||
:type endpoints: list of {path: '', response:''}
|
||||
"""
|
||||
self.api = FastAPI()
|
||||
|
||||
def raise_exception(ex):
|
||||
raise ex
|
||||
|
||||
# register endpoints
|
||||
for endpoint in endpoints:
|
||||
method = endpoint["method"] if "method" in endpoint else "get"
|
||||
if method == "post":
|
||||
if "exception" in endpoint:
|
||||
self.api.post(endpoint["path"])(lambda: raise_exception(endpoint["exception"]))
|
||||
else:
|
||||
self.api.post(endpoint["path"])(lambda: endpoint["response"])
|
||||
else:
|
||||
self.api.get(endpoint["path"])(lambda: endpoint["response"])
|
||||
|
||||
# register shutdown
|
||||
self.api.on_event("shutdown")(self.close)
|
||||
|
||||
# create the process
|
||||
self.proc = Process(target=uvicorn.run,
|
||||
args=(self.api,),
|
||||
kwargs={
|
||||
"host": "127.0.0.1",
|
||||
"port": 5000,
|
||||
"log_level": "info"},
|
||||
daemon=True)
|
||||
|
||||
async def close(self):
|
||||
""" Gracefull shutdown. """
|
||||
logging.warning("Shutting down the app.")
|
||||
|
||||
def start_server(self):
|
||||
self.proc.start()
|
||||
sleep(0.1)
|
||||
|
||||
def stop_server(self):
|
||||
self.proc.terminate()
|
||||
|
||||
def __enter__(self):
|
||||
self.start_server()
|
||||
return self
|
||||
|
||||
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||
self.stop_server()
|
||||
Reference in New Issue
Block a user