From 99f06f3ada4d8a426a392b7055177ac0cc8d3641 Mon Sep 17 00:00:00 2001 From: "christian.lutnik" Date: Mon, 13 Jan 2025 13:25:41 +0100 Subject: [PATCH 1/7] Update test harness (add assertions) #1467 Signed-off-by: christian.lutnik --- tests/features/data.py | 7 +++++++ tests/features/steps/flag_steps.py | 32 ++++++++++++++++++++++++++++++ tests/features/steps/steps.py | 3 +++ 3 files changed, 42 insertions(+) create mode 100644 tests/features/steps/flag_steps.py diff --git a/tests/features/data.py b/tests/features/data.py index 0c84d14d..079fc39e 100644 --- a/tests/features/data.py +++ b/tests/features/data.py @@ -69,4 +69,11 @@ 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={"version": "1.0.2", "flagSetId": 2} + ), } diff --git a/tests/features/steps/flag_steps.py b/tests/features/steps/flag_steps.py new file mode 100644 index 00000000..df7b8141 --- /dev/null +++ b/tests/features/steps/flag_steps.py @@ -0,0 +1,32 @@ +from behave import given, then, when + + +@given('a {flag_type}-flag with key "{flag_key}" and a default value "{default_value}"') +def step_impl(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(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) + + +@then('the resolved metadata value "{key}" should be "{value}"') +def step_impl(context, key, value): + assert context.evaluation.metadata[key] == value + + +@then("the resolved metadata is empty") +def step_impl(context): + assert context.evaluation.metadata \ No newline at end of file diff --git a/tests/features/steps/steps.py b/tests/features/steps/steps.py index ff517dfa..3234e392 100644 --- a/tests/features/steps/steps.py +++ b/tests/features/steps/steps.py @@ -1,4 +1,5 @@ # flake8: noqa: F811 +import typing from behave import given, then, when @@ -10,6 +11,7 @@ from openfeature.provider.in_memory_provider import InMemoryProvider from tests.features.data import IN_MEMORY_FLAGS + # Common step definitions @@ -341,3 +343,4 @@ def parse_any(value): if value.isdigit(): return int(value) return value + From 40928e4427798caf5ad19b729a210d5eeacac494 Mon Sep 17 00:00:00 2001 From: "christian.lutnik" Date: Tue, 21 Jan 2025 13:47:36 +0100 Subject: [PATCH 2/7] fixup! Update test harness (add assertions) #1467 Signed-off-by: christian.lutnik --- .gitmodules | 3 +++ tests/features/steps/flag_steps.py | 10 --------- tests/features/steps/metadata_steps.py | 29 ++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 10 deletions(-) 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/steps/flag_steps.py b/tests/features/steps/flag_steps.py index df7b8141..34bd0c44 100644 --- a/tests/features/steps/flag_steps.py +++ b/tests/features/steps/flag_steps.py @@ -20,13 +20,3 @@ def step_impl(context): context.evaluation = client.get_float_details(key, default_value) elif flag_type.lower() == "integer": context.evaluation = client.get_integer_details(key, default_value) - - -@then('the resolved metadata value "{key}" should be "{value}"') -def step_impl(context, key, value): - assert context.evaluation.metadata[key] == value - - -@then("the resolved metadata is empty") -def step_impl(context): - assert context.evaluation.metadata \ No newline at end of file diff --git a/tests/features/steps/metadata_steps.py b/tests/features/steps/metadata_steps.py new file mode 100644 index 00000000..8d8859b0 --- /dev/null +++ b/tests/features/steps/metadata_steps.py @@ -0,0 +1,29 @@ +from behave import given, then, when + +from openfeature.api import get_client, set_provider +from openfeature.client import OpenFeatureClient +from openfeature.evaluation_context import EvaluationContext +from openfeature.exception import ErrorCode +from openfeature.flag_evaluation import FlagEvaluationDetails, Reason +from openfeature.provider.in_memory_provider import InMemoryProvider +from tests.features.data import IN_MEMORY_FLAGS + +@given("a stable provider") +def step_impl(context): + set_provider(InMemoryProvider(IN_MEMORY_FLAGS)) + context.client = get_client() + +@then('the resolved metadata value "{key}" should be "{value}"') +def step_impl(context, key, value): + assert context.evaluation.metadata[key] == value + + + +@then("the resolved metadata is empty") +def step_impl(context): + assert context.evaluation.metadata + + +@then("the resolved metadata should contain") +def step_impl(context): + From 7b04959a31b08f10004be9702e181642e94679d1 Mon Sep 17 00:00:00 2001 From: "christian.lutnik" Date: Tue, 21 Jan 2025 13:59:41 +0100 Subject: [PATCH 3/7] fixup! Update test harness (add assertions) #1467 Signed-off-by: christian.lutnik --- tests/features/data.py | 7 +++++- tests/features/steps/flag_steps.py | 2 +- tests/features/steps/metadata_steps.py | 30 ++++++++++++++++++-------- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/tests/features/data.py b/tests/features/data.py index 079fc39e..df750f27 100644 --- a/tests/features/data.py +++ b/tests/features/data.py @@ -74,6 +74,11 @@ def context_func(flag: InMemoryFlag, evaluation_context: EvaluationContext): default_variant="on", variants={"on": True, "off": False}, context_evaluator=None, - flag_metadata={"version": "1.0.2", "flagSetId": 2} + 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 index 34bd0c44..0eadc2a6 100644 --- a/tests/features/steps/flag_steps.py +++ b/tests/features/steps/flag_steps.py @@ -1,4 +1,4 @@ -from behave import given, then, when +from behave import given, when @given('a {flag_type}-flag with key "{flag_key}" and a default value "{default_value}"') diff --git a/tests/features/steps/metadata_steps.py b/tests/features/steps/metadata_steps.py index 8d8859b0..26cb96e0 100644 --- a/tests/features/steps/metadata_steps.py +++ b/tests/features/steps/metadata_steps.py @@ -1,29 +1,41 @@ -from behave import given, then, when +from behave import given, then from openfeature.api import get_client, set_provider -from openfeature.client import OpenFeatureClient -from openfeature.evaluation_context import EvaluationContext -from openfeature.exception import ErrorCode -from openfeature.flag_evaluation import FlagEvaluationDetails, Reason from openfeature.provider.in_memory_provider import InMemoryProvider from tests.features.data import IN_MEMORY_FLAGS + @given("a stable provider") def step_impl(context): set_provider(InMemoryProvider(IN_MEMORY_FLAGS)) context.client = get_client() + @then('the resolved metadata value "{key}" should be "{value}"') def step_impl(context, key, value): - assert context.evaluation.metadata[key] == value - + assert context.evaluation.flag_metadata[key] == value @then("the resolved metadata is empty") def step_impl(context): - assert context.evaluation.metadata + assert not context.evaluation.flag_metadata @then("the resolved metadata should contain") def step_impl(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 From 74e983b4b83cdacc7b517bf91c36fe286bab5c0c Mon Sep 17 00:00:00 2001 From: "christian.lutnik" Date: Tue, 21 Jan 2025 14:04:45 +0100 Subject: [PATCH 4/7] fixup! Update test harness (add assertions) #1467 Signed-off-by: christian.lutnik --- tests/features/steps/steps.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/features/steps/steps.py b/tests/features/steps/steps.py index 3234e392..ff517dfa 100644 --- a/tests/features/steps/steps.py +++ b/tests/features/steps/steps.py @@ -1,5 +1,4 @@ # flake8: noqa: F811 -import typing from behave import given, then, when @@ -11,7 +10,6 @@ from openfeature.provider.in_memory_provider import InMemoryProvider from tests.features.data import IN_MEMORY_FLAGS - # Common step definitions @@ -343,4 +341,3 @@ def parse_any(value): if value.isdigit(): return int(value) return value - From 699bf53b92226de2227024e50f24b2672389f304 Mon Sep 17 00:00:00 2001 From: "christian.lutnik" Date: Tue, 21 Jan 2025 14:17:56 +0100 Subject: [PATCH 5/7] fixup! Update test harness (add assertions) #1467 Signed-off-by: christian.lutnik --- tests/features/data.py | 2 +- tests/features/steps/flag_steps.py | 4 ++-- tests/features/steps/metadata_steps.py | 18 ++++++++++-------- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/tests/features/data.py b/tests/features/data.py index df750f27..0ef36627 100644 --- a/tests/features/data.py +++ b/tests/features/data.py @@ -79,6 +79,6 @@ def context_func(flag: InMemoryFlag, evaluation_context: EvaluationContext): "integer": 2, "float": 0.1, "boolean": True, - } + }, ), } diff --git a/tests/features/steps/flag_steps.py b/tests/features/steps/flag_steps.py index 0eadc2a6..574d6791 100644 --- a/tests/features/steps/flag_steps.py +++ b/tests/features/steps/flag_steps.py @@ -2,12 +2,12 @@ @given('a {flag_type}-flag with key "{flag_key}" and a default value "{default_value}"') -def step_impl(context, flag_type: str, flag_key, 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(context): +def step_impl_evaluation(context): client = context.client flag_type, key, default_value = context.flag if flag_type.lower() == "string": diff --git a/tests/features/steps/metadata_steps.py b/tests/features/steps/metadata_steps.py index 26cb96e0..48509cb8 100644 --- a/tests/features/steps/metadata_steps.py +++ b/tests/features/steps/metadata_steps.py @@ -6,36 +6,38 @@ @given("a stable provider") -def step_impl(context): +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(context, key, 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(context): +def step_impl_empty_metadata(context): assert not context.evaluation.flag_metadata @then("the resolved metadata should contain") -def step_impl(context): +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) + 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': + if metadata_type.lower() == "boolean": return bool(value) - elif metadata_type.lower() == 'integer': + elif metadata_type.lower() == "integer": return int(value) - elif metadata_type.lower() == 'float': + elif metadata_type.lower() == "float": return float(value) return value From fdfa3496755ffd0da368834df3900879251d60d1 Mon Sep 17 00:00:00 2001 From: "christian.lutnik" Date: Tue, 21 Jan 2025 14:30:49 +0100 Subject: [PATCH 6/7] fixup! Update test harness (add assertions) #1467 Signed-off-by: christian.lutnik --- tests/features/steps/metadata_steps.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/features/steps/metadata_steps.py b/tests/features/steps/metadata_steps.py index 48509cb8..53c26d06 100644 --- a/tests/features/steps/metadata_steps.py +++ b/tests/features/steps/metadata_steps.py @@ -27,8 +27,8 @@ def step_impl_metadata_contains(context): key, metadata_type, value = row assert context.evaluation.flag_metadata[ - key - ] == convert_value_from_metadata_type(value, metadata_type) + key + ] == convert_value_from_metadata_type(value, metadata_type) def convert_value_from_metadata_type(value, metadata_type): From facf841c5d2b6c737e179f9a748a520adc1ec9f9 Mon Sep 17 00:00:00 2001 From: "christian.lutnik" Date: Tue, 21 Jan 2025 14:34:21 +0100 Subject: [PATCH 7/7] fixup! Update test harness (add assertions) #1467 Signed-off-by: christian.lutnik --- tests/features/steps/metadata_steps.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/features/steps/metadata_steps.py b/tests/features/steps/metadata_steps.py index 53c26d06..0154a9f0 100644 --- a/tests/features/steps/metadata_steps.py +++ b/tests/features/steps/metadata_steps.py @@ -27,8 +27,8 @@ def step_impl_metadata_contains(context): key, metadata_type, value = row assert context.evaluation.flag_metadata[ - key - ] == convert_value_from_metadata_type(value, metadata_type) + key + ] == convert_value_from_metadata_type(value, metadata_type) def convert_value_from_metadata_type(value, metadata_type):