From 08f8d412a103e98706cc873e7c66a2962c934934 Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <a.schlemmer@indiscale.com>
Date: Thu, 14 Nov 2024 12:32:10 +0100
Subject: [PATCH] TST(converters): unit test for new match_properties feature
 in DictElementConverter

---
 unittests/test_converters.py | 51 +++++++++++++++++++++++++++++++++++-
 1 file changed, 50 insertions(+), 1 deletion(-)

diff --git a/unittests/test_converters.py b/unittests/test_converters.py
index 6c7db6ed..12285e46 100644
--- a/unittests/test_converters.py
+++ b/unittests/test_converters.py
@@ -35,7 +35,6 @@ from pathlib import Path
 import linkahead as db
 import pytest
 import yaml
-
 from caoscrawler.converters import (Converter, ConverterValidationError,
                                     DateElementConverter, DictElementConverter,
                                     DictIntegerElementConverter,
@@ -1021,3 +1020,53 @@ def test_properties_from_dict_nested(converter_registry):
     # The "old" DictConverter should have added the additional property:
     assert myrec.get_property("additional_from_other") is not None
     assert myrec.get_property("additional_from_other").value == "other"
+
+
+def test_dict_match_properties(converter_registry):
+
+    root_dict_element = DictElement("RootDict", {
+        "prop_a": "value",
+        "prop_b": "25",
+        "prop_c": 24
+    })
+
+    def_dict = {
+        "RootElt": {
+            # Root dictionary
+            "type": "DictElement",
+            "match_properties": {
+                "prop_a": "(?P<a>.*)$",
+                "prop_[^ac]": "(?P<b>.*)$",
+                "prop_c": "(?P<c>.*)$",
+            },
+            "records": {
+                # Define top-level, use below in subtrees
+                "MyRec": {
+                    "prop_a": "$a",
+                    "prop_b": "$b",
+                    "$a": "$c"
+                }
+            }}}
+    records = scan_structure_elements(root_dict_element, def_dict, converter_registry)
+    assert len(records) == 1
+    record = records[0]
+    assert record.get_property("prop_a").value == "value"
+    assert record.get_property("prop_b").value == "25"
+    assert record.get_property("value").value == "24"  # Note the type change here
+
+    root_dict_element = DictElement("RootDict", {
+        "prop_a": "value",
+        "prop_b": "25",
+        # Property missing
+    })
+
+    records = scan_structure_elements(root_dict_element, def_dict, converter_registry)
+    assert len(records) == 0
+
+    with pytest.raises(RuntimeError, match="Multiple properties match the same match_properties entry."):
+        root_dict_element = DictElement("RootDict", {
+            "prop_a": "value",
+            "prop_b": "25",
+            "prop_d": 24  # duplicate matches
+        })
+        records = scan_structure_elements(root_dict_element, def_dict, converter_registry)
-- 
GitLab