Beispiel #1
0
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"]
Beispiel #2
0
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
Beispiel #3
0
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")