Skip to content

Commit 82ad887

Browse files
committed
fix(api): handle null environment in validate_environment (#6597)
When a request passes a null environment value to the featurestates endpoint, `validate_environment` raises an `AttributeError` because it tries to access `.id` on `None`. Guard against `None` and return early, letting the broader `validate` method resolve the environment from the serialiser context.
1 parent e7328d8 commit 82ad887

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

api/features/serializers.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,8 @@ def validate_feature(self, feature): # type: ignore[no-untyped-def]
597597
return feature
598598

599599
def validate_environment(self, environment): # type: ignore[no-untyped-def]
600+
if environment is None:
601+
return environment
600602
if self.instance and self.instance.environment_id != environment.id: # type: ignore[union-attr]
601603
raise serializers.ValidationError(
602604
"Cannot change the environment of a feature state"

api/tests/unit/features/test_unit_features_serializers.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,29 @@
1414
from features.serializers import FeatureStateSerializerBasic
1515

1616

17+
def test_feature_state_serializer_basic__null_environment_with_context__is_valid( # type: ignore[no-untyped-def]
18+
feature, environment
19+
):
20+
# Given
21+
feature_state = FeatureState.objects.get(feature=feature, environment=environment)
22+
data = {
23+
"id": feature_state.id,
24+
"feature": feature.id,
25+
"environment": None,
26+
}
27+
serializer = FeatureStateSerializerBasic(
28+
instance=feature_state,
29+
data=data,
30+
context={"environment": environment},
31+
)
32+
33+
# When
34+
is_valid = serializer.is_valid()
35+
36+
# Then - should not raise AttributeError on environment.id
37+
assert is_valid
38+
39+
1740
@pytest.mark.parametrize(
1841
"percentage_value, expected_is_valid", ((90, True), (100, True), (110, False))
1942
)

0 commit comments

Comments
 (0)