Skip to content

Commit 13904f6

Browse files
Copilotkhvn26
andcommitted
fix: omit segments from evaluation context for get_environment_flags
Co-authored-by: khvn26 <[email protected]>
1 parent f571af0 commit 13904f6

File tree

2 files changed

+83
-1
lines changed

2 files changed

+83
-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: SDKEvaluationContext = {
338+
"environment": self._evaluation_context["environment"],
339+
"features": self._evaluation_context.get("features", {}),
340+
}
341+
342+
evaluation_result = engine.get_evaluation_result(context_without_segments)
336343

337344
return Flags.from_evaluation_result(
338345
evaluation_result=evaluation_result,

tests/test_flagsmith.py

Lines changed: 75 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+
flagsmith: Flagsmith,
100+
evaluation_context: SDKEvaluationContext,
101+
) -> None:
102+
# Given
103+
flagsmith._evaluation_context = evaluation_context
104+
flagsmith.enable_local_evaluation = True
105+
mock_engine = mocker.patch("flagsmith.flagsmith.engine")
106+
107+
expected_evaluation_result = {
108+
"flags": {
109+
"some_feature": {
110+
"name": "some_feature",
111+
"enabled": True,
112+
"value": "some-feature-state-value",
113+
"metadata": {"id": 1},
114+
}
115+
},
116+
"segments": [],
117+
}
118+
119+
mock_engine.get_evaluation_result.return_value = expected_evaluation_result
120+
121+
# When
122+
flagsmith.get_environment_flags()
123+
124+
# Then
125+
mock_engine.get_evaluation_result.assert_called_once()
126+
call_args = mock_engine.get_evaluation_result.call_args
127+
context = call_args[0][0] # First positional argument
128+
# Segments should not be present in the context passed to the engine
129+
assert "segments" not in context
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,46 @@ 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+
flagsmith: Flagsmith,
232+
evaluation_context: SDKEvaluationContext,
233+
) -> None:
234+
# Given
235+
flagsmith._evaluation_context = evaluation_context
236+
flagsmith.enable_local_evaluation = True
237+
mock_engine = mocker.patch("flagsmith.flagsmith.engine")
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_engine.get_evaluation_result.return_value = expected_evaluation_result
255+
256+
# When
257+
flagsmith.get_identity_flags(identifier, traits)
258+
259+
# Then
260+
mock_engine.get_evaluation_result.assert_called_once()
261+
call_args = mock_engine.get_evaluation_result.call_args
262+
context = call_args[1]["context"]
263+
# Segments should be present in the context passed to the engine for identity flags
264+
assert "segments" in context
265+
# Verify segments from evaluation_context are preserved
266+
assert context["segments"] == evaluation_context["segments"]
267+
268+
194269
@responses.activate()
195270
def test_get_identity_flags__transient_identity__calls_expected(
196271
flagsmith: Flagsmith,

0 commit comments

Comments
 (0)