Skip to content

Commit 5c51fe4

Browse files
committed
fix(flagd): object resolution for RPC and Object types (open-feature#102)
Signed-off-by: Simon Schrottner <[email protected]>
1 parent fc445d4 commit 5c51fe4

File tree

3 files changed

+27
-23
lines changed

3 files changed

+27
-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/e2eGherkin/steps.py

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import typing
33

44
import pytest
5-
from asserts import assert_equal, assert_false, assert_not_equal, assert_true
5+
from asserts import assert_equal, assert_false, assert_in, assert_not_equal, assert_true
66
from pytest_bdd import given, parsers, then, when
77
from tests.e2eGherkin.parsers import to_bool, to_list
88

@@ -368,29 +368,26 @@ def assert_object( # noqa: PLR0913
368368
ivalue: int,
369369
details: str,
370370
) -> FlagEvaluationDetails:
371-
# TODO: Fix this test with https://github.com/open-feature/python-sdk-contrib/issues/102
372371
key, default = key_and_default
373372
if details:
374373
evaluation_result = client.get_object_details(key, default)
375-
# TODO: Fix this test with https://github.com/open-feature/python-sdk-contrib/issues/102
376-
# assert_true(bool_field in evaluation_result.keys())
377-
# assert_true(string_field in evaluation_result.keys())
378-
# assert_true(int_field in evaluation_result.keys())
379-
# assert_equal(evaluation_result[bool_field], bvalue)
380-
# assert_equal(evaluation_result[string_field], svalue)
381-
# assert_equal(evaluation_result[int_field], ivalue)
374+
value = evaluation_result.value
375+
assert_in(bool_field, value)
376+
assert_in(string_field, value)
377+
assert_in(string_field, value)
378+
assert_equal(value[bool_field], bvalue)
379+
assert_equal(value[string_field], svalue)
380+
assert_equal(value[int_field], ivalue)
382381
return evaluation_result
383382
else:
384383
evaluation_result = client.get_object_value(key, default)
385-
# TODO: Fix this test with https://github.com/open-feature/python-sdk-contrib/issues/102
386-
# assert_true(bool_field in evaluation_result.keys())
387-
# assert_true(string_field in evaluation_result.keys())
388-
# assert_true(int_field in evaluation_result.keys())
389-
# assert_equal(evaluation_result[bool_field], bvalue)
390-
# assert_equal(evaluation_result[string_field], svalue)
391-
# assert_equal(evaluation_result[int_field], ivalue)
384+
assert_in(bool_field, evaluation_result)
385+
assert_in(string_field, evaluation_result)
386+
assert_in(string_field, evaluation_result)
387+
assert_equal(evaluation_result[bool_field], bvalue)
388+
assert_equal(evaluation_result[string_field], svalue)
389+
assert_equal(evaluation_result[int_field], ivalue)
392390
assert_not_equal(evaluation_result, None)
393-
return FlagEvaluationDetails("no", evaluation_result)
394391

395392

396393
@then(
@@ -404,9 +401,8 @@ def assert_for_variant_and_reason(
404401
variant: str,
405402
reason: str,
406403
):
407-
# TODO: Fix this test with https://github.com/open-feature/python-sdk-contrib/issues/102
408-
# assert_equal(evaluation_details.reason, Reason[reason])
409-
# assert_equal(evaluation_details.variant, variant)
404+
assert_equal(evaluation_details.reason, Reason[reason])
405+
assert_equal(evaluation_details.variant, variant)
410406
assert_true(True)
411407

412408

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)