Skip to content

Commit ca76802

Browse files
authored
fix: object resolution for RPC and Object types, add test-harness. (#103)
fix: object resolution for RPC and Object types, add test-harness Signed-off-by: Simon Schrottner <[email protected]>
1 parent d936a47 commit ca76802

File tree

4 files changed

+15
-23
lines changed

4 files changed

+15
-23
lines changed

providers/openfeature-provider-flagd/src/openfeature/contrib/provider/flagd/resolvers/grpc.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import typing
22

33
import grpc
4+
from google.protobuf.json_format import MessageToDict
45
from google.protobuf.struct_pb2 import Struct
56

67
from openfeature.evaluation_context import EvaluationContext
@@ -72,7 +73,7 @@ def resolve_object_details(
7273
) -> FlagResolutionDetails[typing.Union[dict, list]]:
7374
return self._resolve(key, FlagType.OBJECT, default_value, evaluation_context)
7475

75-
def _resolve(
76+
def _resolve( # noqa: PLR0915
7677
self,
7778
flag_key: str,
7879
flag_type: FlagType,
@@ -87,26 +88,33 @@ def _resolve(
8788
flag_key=flag_key, context=context
8889
)
8990
response = self.stub.ResolveBoolean(request, **call_args)
91+
value = response.value
9092
elif flag_type == FlagType.STRING:
9193
request = schema_pb2.ResolveStringRequest( # type:ignore[attr-defined]
9294
flag_key=flag_key, context=context
9395
)
9496
response = self.stub.ResolveString(request, **call_args)
97+
value = response.value
9598
elif flag_type == FlagType.OBJECT:
9699
request = schema_pb2.ResolveObjectRequest( # type:ignore[attr-defined]
97100
flag_key=flag_key, context=context
98101
)
99102
response = self.stub.ResolveObject(request, **call_args)
103+
value = MessageToDict(response, preserving_proto_field_name=True)[
104+
"value"
105+
]
100106
elif flag_type == FlagType.FLOAT:
101107
request = schema_pb2.ResolveFloatRequest( # type:ignore[attr-defined]
102108
flag_key=flag_key, context=context
103109
)
104110
response = self.stub.ResolveFloat(request, **call_args)
111+
value = response.value
105112
elif flag_type == FlagType.INTEGER:
106113
request = schema_pb2.ResolveIntRequest( # type:ignore[attr-defined]
107114
flag_key=flag_key, context=context
108115
)
109116
response = self.stub.ResolveInt(request, **call_args)
117+
value = response.value
110118
else:
111119
raise ValueError(f"Unknown flag type: {flag_type}")
112120

@@ -124,7 +132,7 @@ def _resolve(
124132

125133
# Got a valid flag and valid type. Return it.
126134
return FlagResolutionDetails(
127-
value=response.value,
135+
value=value,
128136
reason=response.reason,
129137
variant=response.variant,
130138
)

providers/openfeature-provider-flagd/tests/e2e/test_rpc.py

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,24 +25,6 @@ def test_flag_change_event():
2525
"""not implemented"""
2626

2727

28-
@pytest.mark.skip(reason="issue #102")
29-
@scenario(
30-
"../../spec/specification/assets/gherkin/evaluation.feature",
31-
"Resolves object value",
32-
)
33-
def test_resolves_object_value():
34-
"""not implemented"""
35-
36-
37-
@pytest.mark.skip(reason="issue #102")
38-
@scenario(
39-
"../../spec/specification/assets/gherkin/evaluation.feature",
40-
"Resolves object details",
41-
)
42-
def test_resolves_object_details():
43-
"""not implemented"""
44-
45-
4628
scenarios(
4729
"../../test-harness/gherkin/flagd.feature",
4830
"../../test-harness/gherkin/flagd-json-evaluator.feature",

providers/openfeature-provider-flagd/tests/test_errors.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,11 @@ def test_file_load_errors(file_name: str):
5757
],
5858
)
5959
def test_json_logic_parse_errors(file_name: str):
60+
path = os.path.abspath(os.path.join(os.path.dirname(__file__), "./flags/"))
6061
client = create_client(
6162
FlagdProvider(
6263
resolver_type=ResolverType.IN_PROCESS,
63-
offline_flag_source_path=f"tests/flags/{file_name}",
64+
offline_flag_source_path=f"{path}/{file_name}",
6465
)
6566
)
6667

@@ -71,10 +72,11 @@ def test_json_logic_parse_errors(file_name: str):
7172

7273

7374
def test_flag_disabled():
75+
path = os.path.abspath(os.path.join(os.path.dirname(__file__), "./flags/"))
7476
client = create_client(
7577
FlagdProvider(
7678
resolver_type=ResolverType.IN_PROCESS,
77-
offline_flag_source_path="tests/flags/basic-flag-disabled.json",
79+
offline_flag_source_path=f"{path}/basic-flag-disabled.json",
7880
)
7981
)
8082

providers/openfeature-provider-flagd/tests/test_flagd.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def test_should_get_object_flag_from_flagd(flagd_provider_client):
6565
}
6666

6767
# When
68-
flag = client.get_string_details(flag_key="Key", default_value=return_value)
68+
flag = client.get_object_details(flag_key="Key", default_value=return_value)
6969

7070
# Then
7171
assert flag is not None

0 commit comments

Comments
 (0)