Skip to content

Commit 470c4e3

Browse files
authored
fix: get_environment_flags includes segments in evaluation context (#179)
1 parent c0d57ec commit 470c4e3

File tree

2 files changed

+80
-1
lines changed

2 files changed

+80
-1
lines changed

flagsmith/flagsmith.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,14 @@ def _get_environment_flags_from_document(self) -> Flags:
332332
if self._evaluation_context is None:
333333
raise TypeError("No environment present")
334334

335-
evaluation_result = engine.get_evaluation_result(self._evaluation_context)
335+
# Omit segments from evaluation context for environment flags
336+
# as they are only relevant for identity-specific evaluations
337+
context_without_segments = self._evaluation_context.copy()
338+
context_without_segments.pop("segments", None)
339+
340+
evaluation_result = engine.get_evaluation_result(
341+
context=context_without_segments,
342+
)
336343

337344
return Flags.from_evaluation_result(
338345
evaluation_result=evaluation_result,

tests/test_flagsmith.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,41 @@ def test_get_environment_flags_uses_local_environment_when_available(
9494
assert all_flags[0].value == "some-value"
9595

9696

97+
def test_get_environment_flags_omits_segments_from_evaluation_context(
98+
mocker: MockerFixture,
99+
local_eval_flagsmith: Flagsmith,
100+
evaluation_context: SDKEvaluationContext,
101+
) -> None:
102+
# Given
103+
mock_get_evaluation_result = mocker.patch(
104+
"flagsmith.flagsmith.engine.get_evaluation_result",
105+
autospec=True,
106+
)
107+
108+
expected_evaluation_result = {
109+
"flags": {
110+
"some_feature": {
111+
"name": "some_feature",
112+
"enabled": True,
113+
"value": "some-feature-state-value",
114+
"metadata": {"id": 1},
115+
}
116+
},
117+
"segments": [],
118+
}
119+
120+
mock_get_evaluation_result.return_value = expected_evaluation_result
121+
122+
# When
123+
local_eval_flagsmith.get_environment_flags()
124+
125+
# Then
126+
# Verify segments are not present in the context passed to the engine
127+
context_without_segments = evaluation_context.copy()
128+
context_without_segments.pop("segments", None)
129+
mock_get_evaluation_result.assert_called_once_with(context=context_without_segments)
130+
131+
97132
@responses.activate()
98133
def test_get_identity_flags_calls_api_when_no_local_environment_no_traits(
99134
flagsmith: Flagsmith, identities_json: str
@@ -191,6 +226,43 @@ def test_get_identity_flags_uses_local_environment_when_available(
191226
assert identity_flags[0].value == "some-feature-state-value"
192227

193228

229+
def test_get_identity_flags_includes_segments_in_evaluation_context(
230+
mocker: MockerFixture,
231+
local_eval_flagsmith: Flagsmith,
232+
) -> None:
233+
# Given
234+
mock_get_evaluation_result = mocker.patch(
235+
"flagsmith.flagsmith.engine.get_evaluation_result",
236+
autospec=True,
237+
)
238+
239+
expected_evaluation_result = {
240+
"flags": {
241+
"some_feature": {
242+
"name": "some_feature",
243+
"enabled": True,
244+
"value": "some-feature-state-value",
245+
"metadata": {"id": 1},
246+
}
247+
},
248+
"segments": [],
249+
}
250+
251+
identifier = "identifier"
252+
traits = {"some_trait": "some_value"}
253+
254+
mock_get_evaluation_result.return_value = expected_evaluation_result
255+
256+
# When
257+
local_eval_flagsmith.get_identity_flags(identifier, traits)
258+
259+
# Then
260+
# Verify segments are present in the context passed to the engine for identity flags
261+
call_args = mock_get_evaluation_result.call_args
262+
context = call_args[1]["context"]
263+
assert "segments" in context
264+
265+
194266
@responses.activate()
195267
def test_get_identity_flags__transient_identity__calls_expected(
196268
flagsmith: Flagsmith,

0 commit comments

Comments
 (0)