From bfed12fc6f1bbd2cab97f74a6c9aa0e0faaef7b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Abrah=C3=A3o?= Date: Fri, 20 Sep 2024 15:10:10 +0200 Subject: [PATCH] Add rule registration by uid (#40) Signed-off-by: patrickpa --- qc_baselib/result.py | 29 +++++++++++ tests/test_result.py | 113 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+) diff --git a/qc_baselib/result.py b/qc_baselib/result.py index c4fe214..fd9630b 100644 --- a/qc_baselib/result.py +++ b/qc_baselib/result.py @@ -391,6 +391,35 @@ def register_rule( return rule.rule_uid + def register_rule_by_uid( + self, + checker_bundle_name: str, + checker_id: str, + rule_uid: str, + ) -> None: + """ + Rule uid will be registered to checker. + + Rule uid needs to follow the proper schema, more information at: + https://github.com/asam-ev/qc-framework/blob/main/doc/manual/rule_uid_schema.md + """ + + splitted_uid = rule_uid.split(":") + + if len(splitted_uid) < 4: + raise RuntimeError( + f"Invalid rule uid: {rule_uid}. The uid should be composed by 4 entities separated by ':'." + ) + + self.register_rule( + checker_bundle_name=checker_bundle_name, + checker_id=checker_id, + emanating_entity=splitted_uid[0], + standard=splitted_uid[1], + definition_setting=splitted_uid[2], + rule_full_name=splitted_uid[3], + ) + def register_issue( self, checker_bundle_name: str, diff --git a/tests/test_result.py b/tests/test_result.py index 46be697..efea55c 100644 --- a/tests/test_result.py +++ b/tests/test_result.py @@ -1375,3 +1375,116 @@ def test_registering_checker_param_twice() -> None: f"Param with name {param_name} is already registered to checker {checker_id} on bundle {bundle_name}" in str(exc_info.value) ) + + +def test_result_register_rule_by_uid() -> None: + result = Result() + + result.register_checker_bundle( + name="TestBundle", + build_date="2024-05-31", + description="Example checker bundle", + version="0.0.1", + summary="Tested example checkers.", + ) + + result.register_checker( + checker_bundle_name="TestBundle", + checker_id="TestChecker", + description="Test checker", + summary="Executed evaluation.", + ) + + result.register_rule_by_uid( + checker_bundle_name="TestBundle", + checker_id="TestChecker", + rule_uid="test.com:qc:1.0.0:qwerty.qwerty", + ) + + bundle = result._get_checker_bundle(checker_bundle_name="TestBundle") + + checker = result._get_checker(bundle=bundle, checker_id="TestChecker") + + rules = checker.addressed_rule + + assert len(rules) == 1 + assert rules[0].rule_uid == "test.com:qc:1.0.0:qwerty.qwerty" + + +def test_create_rule_id_validation() -> None: + result = Result() + + result.register_checker_bundle( + name="TestBundle", + build_date="2024-05-31", + description="Example checker bundle", + version="0.0.1", + summary="Tested example checkers", + ) + + result.register_checker( + checker_bundle_name="TestBundle", + checker_id="TestChecker", + description="Test checker", + summary="Executed evaluation", + ) + + with pytest.raises( + RuntimeError, + match=r"Invalid rule uid: .*", + ) as exc_info: + result.register_rule_by_uid( + checker_bundle_name="TestBundle", + checker_id="TestChecker", + rule_uid="test.com:qc:1.0.0", + ) + + with pytest.raises( + RuntimeError, + match=r"Invalid rule uid: .*", + ) as exc_info: + result.register_rule_by_uid( + checker_bundle_name="TestBundle", + checker_id="TestChecker", + rule_uid="", + ) + + with pytest.raises( + ValidationError, + match=r".*\nemanating_entity\n.* String should match pattern .*", + ) as exc_info: + result.register_rule_by_uid( + checker_bundle_name="TestBundle", + checker_id="TestChecker", + rule_uid=":qc:1.0.0:qwerty.qwerty", + ) + + with pytest.raises( + ValidationError, + match=r".*\nstandard\n.* String should match pattern .*", + ) as exc_info: + result.register_rule_by_uid( + checker_bundle_name="TestBundle", + checker_id="TestChecker", + rule_uid="test.com::1.0.0:qwerty.qwerty", + ) + + with pytest.raises( + ValidationError, + match=r".*\ndefinition_setting\n.* String should match pattern .*", + ) as exc_info: + result.register_rule_by_uid( + checker_bundle_name="TestBundle", + checker_id="TestChecker", + rule_uid="test.com:qc::qwerty.qwerty", + ) + + with pytest.raises( + ValidationError, + match=r".*\nrule_full_name\n.* String should match pattern .*", + ) as exc_info: + result.register_rule_by_uid( + checker_bundle_name="TestBundle", + checker_id="TestChecker", + rule_uid="test.com:qc:1.0.0:", + )