diff --git a/providers/openfeature-provider-flagd/src/openfeature/contrib/provider/flagd/resolvers/grpc.py b/providers/openfeature-provider-flagd/src/openfeature/contrib/provider/flagd/resolvers/grpc.py index caab101a..194dc558 100644 --- a/providers/openfeature-provider-flagd/src/openfeature/contrib/provider/flagd/resolvers/grpc.py +++ b/providers/openfeature-provider-flagd/src/openfeature/contrib/provider/flagd/resolvers/grpc.py @@ -1,6 +1,7 @@ import typing import grpc +from google.protobuf.json_format import MessageToDict from google.protobuf.struct_pb2 import Struct from openfeature.evaluation_context import EvaluationContext @@ -72,7 +73,7 @@ def resolve_object_details( ) -> FlagResolutionDetails[typing.Union[dict, list]]: return self._resolve(key, FlagType.OBJECT, default_value, evaluation_context) - def _resolve( + def _resolve( # noqa: PLR0915 self, flag_key: str, flag_type: FlagType, @@ -87,26 +88,33 @@ def _resolve( flag_key=flag_key, context=context ) response = self.stub.ResolveBoolean(request, **call_args) + value = response.value elif flag_type == FlagType.STRING: request = schema_pb2.ResolveStringRequest( # type:ignore[attr-defined] flag_key=flag_key, context=context ) response = self.stub.ResolveString(request, **call_args) + value = response.value elif flag_type == FlagType.OBJECT: request = schema_pb2.ResolveObjectRequest( # type:ignore[attr-defined] flag_key=flag_key, context=context ) response = self.stub.ResolveObject(request, **call_args) + value = MessageToDict(response, preserving_proto_field_name=True)[ + "value" + ] elif flag_type == FlagType.FLOAT: request = schema_pb2.ResolveFloatRequest( # type:ignore[attr-defined] flag_key=flag_key, context=context ) response = self.stub.ResolveFloat(request, **call_args) + value = response.value elif flag_type == FlagType.INTEGER: request = schema_pb2.ResolveIntRequest( # type:ignore[attr-defined] flag_key=flag_key, context=context ) response = self.stub.ResolveInt(request, **call_args) + value = response.value else: raise ValueError(f"Unknown flag type: {flag_type}") @@ -124,7 +132,7 @@ def _resolve( # Got a valid flag and valid type. Return it. return FlagResolutionDetails( - value=response.value, + value=value, reason=response.reason, variant=response.variant, ) diff --git a/providers/openfeature-provider-flagd/tests/e2e/test_rpc.py b/providers/openfeature-provider-flagd/tests/e2e/test_rpc.py index 91ef090c..d2fe57e9 100644 --- a/providers/openfeature-provider-flagd/tests/e2e/test_rpc.py +++ b/providers/openfeature-provider-flagd/tests/e2e/test_rpc.py @@ -25,24 +25,6 @@ def test_flag_change_event(): """not implemented""" -@pytest.mark.skip(reason="issue #102") -@scenario( - "../../spec/specification/assets/gherkin/evaluation.feature", - "Resolves object value", -) -def test_resolves_object_value(): - """not implemented""" - - -@pytest.mark.skip(reason="issue #102") -@scenario( - "../../spec/specification/assets/gherkin/evaluation.feature", - "Resolves object details", -) -def test_resolves_object_details(): - """not implemented""" - - scenarios( "../../test-harness/gherkin/flagd.feature", "../../test-harness/gherkin/flagd-json-evaluator.feature", diff --git a/providers/openfeature-provider-flagd/tests/test_errors.py b/providers/openfeature-provider-flagd/tests/test_errors.py index 542a61d1..cc053788 100644 --- a/providers/openfeature-provider-flagd/tests/test_errors.py +++ b/providers/openfeature-provider-flagd/tests/test_errors.py @@ -57,10 +57,11 @@ def test_file_load_errors(file_name: str): ], ) def test_json_logic_parse_errors(file_name: str): + path = os.path.abspath(os.path.join(os.path.dirname(__file__), "./flags/")) client = create_client( FlagdProvider( resolver_type=ResolverType.IN_PROCESS, - offline_flag_source_path=f"tests/flags/{file_name}", + offline_flag_source_path=f"{path}/{file_name}", ) ) @@ -71,10 +72,11 @@ def test_json_logic_parse_errors(file_name: str): def test_flag_disabled(): + path = os.path.abspath(os.path.join(os.path.dirname(__file__), "./flags/")) client = create_client( FlagdProvider( resolver_type=ResolverType.IN_PROCESS, - offline_flag_source_path="tests/flags/basic-flag-disabled.json", + offline_flag_source_path=f"{path}/basic-flag-disabled.json", ) ) diff --git a/providers/openfeature-provider-flagd/tests/test_flagd.py b/providers/openfeature-provider-flagd/tests/test_flagd.py index f16210b5..bb10268a 100644 --- a/providers/openfeature-provider-flagd/tests/test_flagd.py +++ b/providers/openfeature-provider-flagd/tests/test_flagd.py @@ -65,7 +65,7 @@ def test_should_get_object_flag_from_flagd(flagd_provider_client): } # When - flag = client.get_string_details(flag_key="Key", default_value=return_value) + flag = client.get_object_details(flag_key="Key", default_value=return_value) # Then assert flag is not None