From f559d1b27a096c585bd81f32f6472039c9ce5e03 Mon Sep 17 00:00:00 2001 From: chrfwow Date: Tue, 21 Jan 2025 15:11:10 +0100 Subject: [PATCH] feat: Update test harness (add assertions) #1467 (#415) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update test harness (add assertions) #1467 Signed-off-by: christian.lutnik * fixup! Update test harness (add assertions) #1467 Signed-off-by: christian.lutnik * fixup! Update test harness (add assertions) #1467 Signed-off-by: christian.lutnik * fixup! Update test harness (add assertions) #1467 Signed-off-by: christian.lutnik * fixup! Update test harness (add assertions) #1467 Signed-off-by: christian.lutnik * fixup! Update test harness (add assertions) #1467 Signed-off-by: christian.lutnik * fixup! Update test harness (add assertions) #1467 Signed-off-by: christian.lutnik --------- Signed-off-by: christian.lutnik Co-authored-by: Anton GrĂ¼bel --- .gitmodules | 3 ++ tests/features/data.py | 12 +++++++ tests/features/steps/flag_steps.py | 22 +++++++++++++ tests/features/steps/metadata_steps.py | 43 ++++++++++++++++++++++++++ 4 files changed, 80 insertions(+) create mode 100644 tests/features/steps/flag_steps.py create mode 100644 tests/features/steps/metadata_steps.py diff --git a/.gitmodules b/.gitmodules index 61d2eb45..643f35ec 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "test-harness"] path = test-harness url = https://github.com/open-feature/test-harness.git +[submodule "spec"] + path = spec + url = https://github.com/open-feature/spec.git diff --git a/tests/features/data.py b/tests/features/data.py index 0c84d14d..0ef36627 100644 --- a/tests/features/data.py +++ b/tests/features/data.py @@ -69,4 +69,16 @@ def context_func(flag: InMemoryFlag, evaluation_context: EvaluationContext): variants={"one": "uno", "two": "dos"}, default_variant="one", ), + "metadata-flag": InMemoryFlag( + state=InMemoryFlag.State.ENABLED, + default_variant="on", + variants={"on": True, "off": False}, + context_evaluator=None, + flag_metadata={ + "string": "1.0.2", + "integer": 2, + "float": 0.1, + "boolean": True, + }, + ), } diff --git a/tests/features/steps/flag_steps.py b/tests/features/steps/flag_steps.py new file mode 100644 index 00000000..574d6791 --- /dev/null +++ b/tests/features/steps/flag_steps.py @@ -0,0 +1,22 @@ +from behave import given, when + + +@given('a {flag_type}-flag with key "{flag_key}" and a default value "{default_value}"') +def step_impl_flag(context, flag_type: str, flag_key, default_value): + context.flag = (flag_type, flag_key, default_value) + + +@when("the flag was evaluated with details") +def step_impl_evaluation(context): + client = context.client + flag_type, key, default_value = context.flag + if flag_type.lower() == "string": + context.evaluation = client.get_string_details(key, default_value) + elif flag_type.lower() == "boolean": + context.evaluation = client.get_boolean_details(key, default_value) + elif flag_type.lower() == "object": + context.evaluation = client.get_object_details(key, default_value) + elif flag_type.lower() == "float": + context.evaluation = client.get_float_details(key, default_value) + elif flag_type.lower() == "integer": + context.evaluation = client.get_integer_details(key, default_value) diff --git a/tests/features/steps/metadata_steps.py b/tests/features/steps/metadata_steps.py new file mode 100644 index 00000000..0154a9f0 --- /dev/null +++ b/tests/features/steps/metadata_steps.py @@ -0,0 +1,43 @@ +from behave import given, then + +from openfeature.api import get_client, set_provider +from openfeature.provider.in_memory_provider import InMemoryProvider +from tests.features.data import IN_MEMORY_FLAGS + + +@given("a stable provider") +def step_impl_stable_provider(context): + set_provider(InMemoryProvider(IN_MEMORY_FLAGS)) + context.client = get_client() + + +@then('the resolved metadata value "{key}" should be "{value}"') +def step_impl_check_metadata(context, key, value): + assert context.evaluation.flag_metadata[key] == value + + +@then("the resolved metadata is empty") +def step_impl_empty_metadata(context): + assert not context.evaluation.flag_metadata + + +@then("the resolved metadata should contain") +def step_impl_metadata_contains(context): + for row in context.table: + key, metadata_type, value = row + + assert context.evaluation.flag_metadata[ + key + ] == convert_value_from_metadata_type(value, metadata_type) + + +def convert_value_from_metadata_type(value, metadata_type): + if value == "None": + return None + if metadata_type.lower() == "boolean": + return bool(value) + elif metadata_type.lower() == "integer": + return int(value) + elif metadata_type.lower() == "float": + return float(value) + return value