From 8aca085fadf65f638dd160e361a1394a8f507dcb Mon Sep 17 00:00:00 2001
From: Fabian Schindler <fabian.schindler.strauss@gmail.com>
Date: Thu, 28 Jul 2022 12:04:25 +0200
Subject: [PATCH] Fixing test setup

---
 tests/test_config.py      |  99 +++++++++++++++++++++++++++
 tests/test_registrar.py   | 136 ++++++++++++++++++++++++--------------
 tests/test_source.py      |  28 ++++++++
 tests/testapp/backends.py |  25 ++++---
 4 files changed, 229 insertions(+), 59 deletions(-)
 create mode 100644 tests/test_config.py
 create mode 100644 tests/test_source.py

diff --git a/tests/test_config.py b/tests/test_config.py
new file mode 100644
index 0000000..4052460
--- /dev/null
+++ b/tests/test_config.py
@@ -0,0 +1,99 @@
+# pylint: skip-file
+
+from textwrap import dedent
+from io import StringIO
+
+import pytest
+
+from registrar.config import (
+    BackendConfig, HandlerConfig, HandlersConfig, RegistrarConfig, RouteConfig,
+    RouteMode
+)
+
+
+@pytest.fixture
+def config_simple():
+    return StringIO(
+        dedent("""
+            routes:
+              items:
+                path: registrar.route.stac.ItemRoute
+                queue: register
+                output_queue: next_queue
+                backends:
+                  - path: registrar.backend.eoxserver.EOxServerItemBackend
+                    kwargs:
+                      instance_base_path: /some/dir
+                      instance_name: name
+
+                handlers:
+                  pre:
+                    - path: some.pre.handler
+                  post:
+                    - path: some.post.handler
+                  error:
+                    - path: some.error.handler
+
+              collections:
+                path: registrar.route.stac.CollectionRoute
+                queue: register-collections
+                backends:
+                  - path: registrar.backend.eoxserver.CollectionBackend
+
+              path:
+                path: registrar.route.path.PathRoute
+                queue: register-paths
+                backends:
+                  - path: some.path.backend
+
+            sources: []
+        """)
+    )
+
+
+def test_config(config_simple):
+    expected = RegistrarConfig(
+        {
+            "items": RouteConfig(
+                "registrar.route.stac.ItemRoute",
+                "register",
+                default_mode=RouteMode.REGISTER,
+                output_queue="next_queue",
+                backends=[
+                    BackendConfig(
+                        "registrar.backend.eoxserver.EOxServerItemBackend",
+                        args=[],
+                        kwargs={
+                            "instance_base_path": "/some/dir",
+                            "instance_name": "name"
+                        },
+                    )
+                ],
+                handlers=HandlersConfig(
+                    [HandlerConfig("some.pre.handler")],
+                    [HandlerConfig("some.post.handler")],
+                    [HandlerConfig("some.error.handler")],
+                )
+            ),
+            "collections": RouteConfig(
+                "registrar.route.stac.CollectionRoute",
+                "register-collections",
+                backends=[
+                    BackendConfig(
+                        "registrar.backend.eoxserver.CollectionBackend",
+                    )
+                ]
+            ),
+            "path": RouteConfig(
+                "registrar.route.path.PathRoute",
+                "register-paths",
+                backends=[
+                    BackendConfig(
+                        "some.path.backend",
+                    )
+                ]
+            )
+        },
+        []
+    )
+    assert expected == RegistrarConfig.from_file(config_simple)
diff --git a/tests/test_registrar.py b/tests/test_registrar.py
index a4f852c..a8b6f14 100644
--- a/tests/test_registrar.py
+++ b/tests/test_registrar.py
@@ -1,7 +1,8 @@
 import pytest
 
+from registrar.config import BackendConfig, HandlerConfig, HandlersConfig, RegistrarConfig, RouteConfig, RouteMode, SourceConfig
 from registrar.backend import get_backends
-from registrar.registrar import register_item, register_path
+from registrar.registrar import register
 
 from testapp.backends import MyItemBackend, MyPathBackend
 from testapp import handlers
@@ -24,45 +25,64 @@ TEST_ITEM = """{
 }"""
 
 
-def test_get_backends():
-    config = {
-        "sources": [
-            {
-                "name": "my-local-source",
-                "type": "local",
-                "kwargs": {"root_directory": "/opt/data"},
-            }
-        ],
-        "backends": [
-            {"path": "testapp.backends.MyItemBackend", "kwargs": {"exists": True}}
-        ],
-    }
+# def test_get_backends():
+#     config = {
+#         "sources": [
+#             {
+#                 "name": "my-local-source",
+#                 "type": "local",
+#                 "kwargs": {"root_directory": "/opt/data"},
+#             }
+#         ],
+#         "backends": [
+#             {"path": "testapp.backends.MyItemBackend", "kwargs": {"exists": True}}
+#         ],
+#     }
 
-    backends = get_backends(config)
-    assert len(backends) == 1
-    assert isinstance(backends[0], MyItemBackend)
-    assert backends[0].exists
+#     backends = get_backends(config)
+#     assert len(backends) == 1
+#     assert isinstance(backends[0], MyItemBackend)
+#     assert backends[0].exists
 
 
 def test_register_item(mocker):
-    mocker.patch("testapp.backends.MyItemBackend.item_exists")
-    mocker.patch("testapp.backends.MyItemBackend.register_item")
-    config = {
-        "sources": [
-            {
-                "name": "my-local-source",
-                "type": "local",
-                "kwargs": {"root_directory": "/opt/data"},
-            }
-        ],
-        "backends": [
-            {"path": "testapp.backends.MyItemBackend", "kwargs": {"exists": True}}
-        ],
-    }
-    register_item(config, TEST_ITEM, True)
+    mocker.patch("testapp.backends.MyItemBackend.exists")
+    mocker.patch("testapp.backends.MyItemBackend.register")
 
-    MyItemBackend.item_exists.assert_called_once()
-    MyItemBackend.register_item.assert_called_once()
+    config = RegistrarConfig(
+        {
+            "items": RouteConfig(
+                "registrar.route.stac.ItemRoute",
+                "register",
+                replace=True,
+                backends=[
+                    BackendConfig(
+                        "testapp.backends.MyItemBackend",
+                        args=[],
+                        kwargs={
+                            "exists": True
+                        },
+                    )
+                ],
+                # handlers=HandlersConfig(
+                #     [HandlerConfig("some.pre.handler")],
+                #     [HandlerConfig("some.post.handler")],
+                #     [HandlerConfig("some.error.handler")],
+                # )
+            ),
+        },
+        [
+            SourceConfig(
+                type="local",
+                name="my-local-source",
+                kwargs={"root_directory": "/opt/data"},
+            )
+        ]
+    )
+    register(config.routes["items"], config.sources, TEST_ITEM)
+
+    MyItemBackend.exists.assert_called_once()
+    MyItemBackend.register.assert_called_once()
 
 
 def test_handlers(mocker):
@@ -70,18 +90,36 @@ def test_handlers(mocker):
     mocker.patch("testapp.handlers.post_handler.__call__")
     mocker.patch("testapp.handlers.error_handler.__call__")
 
-    config = {
-        "sources": [
-            {
-                "name": "my-local-source",
-                "type": "local",
-                "kwargs": {"root_directory": "/opt/data"},
-            }
-        ],
-        "backends": [],
-        "pre_handlers": [{"path": "testapp.handlers.pre_handler"}],
-        "post_handlers": [{"path": "testapp.handlers.post_handler"}],
-        "error_handlers": [{"path": "testapp.handlers.error_handler"}],
-    }
-    register_item(config, TEST_ITEM, False)
+    config = RegistrarConfig(
+        {
+            "items": RouteConfig(
+                "registrar.route.stac.ItemRoute",
+                "register",
+                replace=True,
+                backends=[
+                    BackendConfig(
+                        "testapp.backends.MyItemBackend",
+                        args=[],
+                        kwargs={
+                            "exists": True
+                        },
+                    )
+                ],
+                handlers=HandlersConfig(
+                    [HandlerConfig("testapp.handlers.pre_handler")],
+                    [HandlerConfig("testapp.handlers.post_handler")],
+                    [HandlerConfig("testapp.handlers.error_handler")],
+                )
+            ),
+        },
+        [
+            SourceConfig(
+                type="local",
+                name="my-local-source",
+                kwargs={"root_directory": "/opt/data"},
+            )
+        ]
+    )
+    register(config.routes["items"], config.sources, TEST_ITEM)
     handlers.pre_handler.__call__.assert_called_once()
+    handlers.post_handler.__call__.assert_called_once()
diff --git a/tests/test_source.py b/tests/test_source.py
new file mode 100644
index 0000000..862a787
--- /dev/null
+++ b/tests/test_source.py
@@ -0,0 +1,28 @@
+from registrar.source import get_source, S3Source
+from registrar.config import SourceConfig
+
+
+def test_get_source():
+    expected = S3Source("mys3", "bucket", endpoint_url="http://some.endpoint")
+    result = get_source([
+        SourceConfig(
+            "s3",
+            name="mys3",
+            filter=".*",
+            kwargs={
+                "endpoint_url": "http://some.endpoint",
+                "bucket_name": "bucket",
+            }
+        )
+    ], [
+        "test/path"
+    ])
+
+    assert expected.name == result.name
+    assert expected.bucket_name == result.bucket_name
+    assert expected.secret_access_key == result.secret_access_key
+    assert expected.access_key_id == result.access_key_id
+    assert expected.endpoint_url == result.endpoint_url
+    assert expected.strip_bucket == result.strip_bucket
+    assert expected.region_name == result.region_name
+    assert expected.public == result.public
diff --git a/tests/testapp/backends.py b/tests/testapp/backends.py
index 0111f90..082e08d 100644
--- a/tests/testapp/backends.py
+++ b/tests/testapp/backends.py
@@ -1,33 +1,38 @@
 from typing import Optional
 
 from pystac import Item
-from registrar.backend.abc import PathBackend, ItemBackend
+from registrar.abc import Backend
 from registrar.source import Source
 
 
-class MyPathBackend(PathBackend):
+class MyPathBackend(Backend[str]):
     def __init__(self, exists: False):
         self.exists = exists
 
-    def path_exists(self, source: Optional[Source], path: str) -> bool:
+    def exists(self, source: Optional[Source], path: str) -> bool:
         return self.exists
 
-    def register_path(self, source: Optional[Source], path: str, replace: bool):
+    def register(self, source: Optional[Source], path: str, replace: bool):
         ...
 
-    def deregister_path(self, source: Optional[Source], path: str) -> Optional[str]:
+    def deregister(self, source: Optional[Source], path: str) -> Optional[str]:
         return path
 
+    def deregister_identifier(self, identifier: str) -> Optional[str]:
+        return identifier
 
-class MyItemBackend(ItemBackend):
+class MyItemBackend(Backend[Item]):
     def __init__(self, exists: False):
-        self.exists = exists
+        self._exists = exists
 
-    def item_exists(self, source: Optional[Source], item: "Item") -> bool:
-        return self.exists
+    def exists(self, source: Optional[Source], item: "Item") -> bool:
+        return self._exists
 
-    def register_item(self, source: Optional[Source], item: "Item", replace: bool):
+    def register(self, source: Optional[Source], item: "Item", replace: bool):
         ...
 
+    def deregister(self, source: Optional[Source], path: str) -> Optional[str]:
+        return path
+
     def deregister_identifier(self, identifier: str) -> Optional[str]:
         return identifier
-- 
GitLab