def test_add_mock_no_data(): schema = {"$ref": "#/components/schemas/item"} components = { "schemas": { "item": { "type": "object", "required": ["foo", "baz"], "x-hmt-id-path": "itemId", "properties": { "foo": {"type": "number"}, "bar": {"type": "string"}, "itemId": {"type": "string"}, }, } } } spec = spec_dict( path="/items/{id}", response_schema=schema, components=components, method="get" ) spec["paths"]["/items/{id}"]["x-hmt-entity"] = "item" spec["paths"]["/items/{id}"]["get"]["x-hmt-operation"] = "read" spec = convert_to_OpenAPIObject(spec) store = MockDataStore() store.add_mock(OpenAPISpecification(spec, "items")) assert 0 == len(store["items"].item) store["items"].item.insert({"foo": 10, "bar": "val", "itemId": "id123"}) assert 1 == len(store["items"].item) assert "val" == store["items"].item["id123"]["bar"]
def test_clear(): store = MockDataStore() store.add_mock(OpenAPISpecification(spec(), "pokemon")) store.add_mock(OpenAPISpecification(spec(), "another")) store["pokemon"]["x"] = "foo" store["another"]["y"] = "bar" assert "foo" == store["pokemon"]["x"] assert "bar" == store["another"]["y"] store.clear() assert store["pokemon"].get("x") is None assert store["another"].get("y") is None
class MockServer: def __init__( self, port, specs, scope: Optional[Scope] = None, callback_dir=None, admin_port=None, routing=PathRouting(), log_dir: Optional[str] = None, ): self._admin_port = admin_port self._port = port self._specs = specs self._routing = routing self._scope = scope or Scope() self._log = Log(self._scope, NoSink() if log_dir is None else FileSink(log_dir)) self._mock_data_store = MockDataStore() self._rest_middleware_manager = RestMiddlewareManager(self._mock_data_store) self._callback_manager = callback_manager if callback_dir is not None: callback_manager.load(callback_dir) for spec in specs: self._mock_data_store.add_mock(spec) self._request_processor = RequestProcessor( self._specs, self._mock_data_store, self._callback_manager, self._rest_middleware_manager, ) def run(self) -> None: if self._admin_port: start_admin( port=self._admin_port, scope=self._scope, mock_data_store=self._mock_data_store, rest_middleware_manager=self._rest_middleware_manager, ) app = Application( [ ( r"/.*", MockServerView, dict( request_processor=self._request_processor, router=self._routing, http_log=self._log, ), ) ] ) http_server = HTTPServer(app) http_server.listen(self._port) self.log_startup() IOLoop.current().start() def log_startup(self) -> None: for spec in self._specs: if not spec.api.servers: continue for path, path_item in spec.api.paths.items(): for method in [ "get", "put", "post", "delete", "options", "head", "patch", "trace", ]: if getattr(path_item, method): logger.info( "- " + method.upper().ljust(7) + f" http://localhost:{self._port}/" + spec.api.servers[0].url + path ) logger.info("HMT is running")