Skip to content

Commit 7ca797b

Browse files
committed
fix(flagd): widen metadata TypedDict and cover EventStream selector
- types.py: metadata is now variadic tuple[tuple[str, str], ...] to allow >1 entry and satisfy mypy.\n- tests: import FLAGD_SELECTOR_HEADER from the resolver instead of hardcoding, and add coverage for the EventStream listen() path (both with and without selector). Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
1 parent c03c838 commit 7ca797b

2 files changed

Lines changed: 38 additions & 3 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44
class GrpcMultiCallableArgs(typing.TypedDict, total=False):
55
timeout: float | None
66
wait_for_ready: bool | None
7-
metadata: tuple[tuple[str, str]] | None
7+
metadata: tuple[tuple[str, str], ...] | None

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

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22

33
from openfeature.contrib.provider.flagd.config import Config
44
from openfeature.contrib.provider.flagd.flag_type import FlagType
5-
from openfeature.contrib.provider.flagd.resolvers.grpc import GrpcResolver
5+
from openfeature.contrib.provider.flagd.resolvers.grpc import (
6+
FLAGD_SELECTOR_HEADER,
7+
GrpcResolver,
8+
)
69
from openfeature.schemas.protobuf.flagd.evaluation.v2 import evaluation_pb2
710

811

@@ -30,7 +33,7 @@ def test_unary_call_includes_selector_metadata_when_configured():
3033
resolver._resolve("flag", FlagType.BOOLEAN, False, None)
3134

3235
kwargs = mock_stub.ResolveBoolean.call_args.kwargs
33-
assert kwargs.get("metadata") == (("flagd-selector", "test-selector"),)
36+
assert kwargs.get("metadata") == ((FLAGD_SELECTOR_HEADER, "test-selector"),)
3437

3538

3639
def test_unary_call_omits_metadata_when_no_selector():
@@ -45,3 +48,35 @@ def test_unary_call_omits_metadata_when_no_selector():
4548

4649
kwargs = mock_stub.ResolveBoolean.call_args.kwargs
4750
assert "metadata" not in kwargs
51+
52+
53+
def test_event_stream_includes_selector_metadata_when_configured():
54+
resolver = _make_resolver("test-selector")
55+
mock_stub = MagicMock()
56+
mock_stub.EventStream = Mock(side_effect=Exception("break loop"))
57+
resolver.stub = mock_stub
58+
resolver.active = True
59+
60+
try:
61+
resolver.listen()
62+
except Exception:
63+
pass
64+
65+
kwargs = mock_stub.EventStream.call_args.kwargs
66+
assert kwargs.get("metadata") == ((FLAGD_SELECTOR_HEADER, "test-selector"),)
67+
68+
69+
def test_event_stream_omits_metadata_when_no_selector():
70+
resolver = _make_resolver(None)
71+
mock_stub = MagicMock()
72+
mock_stub.EventStream = Mock(side_effect=Exception("break loop"))
73+
resolver.stub = mock_stub
74+
resolver.active = True
75+
76+
try:
77+
resolver.listen()
78+
except Exception:
79+
pass
80+
81+
kwargs = mock_stub.EventStream.call_args.kwargs
82+
assert "metadata" not in kwargs

0 commit comments

Comments
 (0)