Skip to content

Commit 61db807

Browse files
authored
chore: Improve FeatureState test coverage (#5617)
1 parent b5a2af7 commit 61db807

File tree

2 files changed

+50
-2
lines changed

2 files changed

+50
-2
lines changed

api/features/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -580,11 +580,11 @@ def __gt__(self, other: "FeatureState") -> bool: # noqa: C901
580580
# it has a feature_segment or an identity
581581
return not (other.feature_segment_id or other.identity_id)
582582

583-
def __str__(self): # type: ignore[no-untyped-def]
583+
def __str__(self) -> str:
584584
s = f"Feature {self.feature.name} - Enabled: {self.enabled}"
585585
if self.environment is not None:
586586
s = f"{self.environment} - {s}"
587-
elif self.identity is not None:
587+
if self.identity is not None:
588588
s = f"Identity {self.identity.identifier} - {s}"
589589
return s
590590

api/tests/unit/features/test_unit_features_models.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from django.core.exceptions import ValidationError
77
from django.db.utils import IntegrityError
88
from django.utils import timezone
9+
from pytest_lazyfixture import lazy_fixture # type: ignore[import-untyped]
910
from pytest_mock import MockerFixture
1011

1112
from environments.identities.models import Identity
@@ -453,6 +454,53 @@ def test_feature_state_gt_operator_throws_value_error_if_different_identities(
453454
feature_state_identity_1 > feature_state_identity_2
454455

455456

457+
def test_feature_state_gt_operator__environment_default__returns_expected(
458+
environment: Environment,
459+
feature: Feature,
460+
identity: Identity,
461+
feature_segment: FeatureSegment,
462+
) -> None:
463+
# When
464+
feature_state = FeatureState.objects.get(feature=feature, environment=environment)
465+
feature_state_identity = FeatureState.objects.create(
466+
feature=feature, environment=environment, identity=identity
467+
)
468+
feature_state_segment = FeatureState.objects.create(
469+
feature=feature,
470+
environment=environment,
471+
feature_segment=feature_segment,
472+
)
473+
474+
# Then
475+
assert not feature_state > feature_state_identity
476+
assert not feature_state > feature_state_segment
477+
478+
479+
@pytest.mark.parametrize(
480+
"feature_identity, expected_result",
481+
[
482+
(
483+
lazy_fixture("identity"),
484+
"Identity test_identity - Project Test Project - Environment Test Environment - Feature Test Feature1 - Enabled: False",
485+
),
486+
(
487+
None,
488+
"Project Test Project - Environment Test Environment - Feature Test Feature1 - Enabled: False",
489+
),
490+
],
491+
)
492+
def test_feature_state_str__returns_expected(
493+
feature_state: FeatureState,
494+
feature_identity: Identity | None,
495+
expected_result: str,
496+
) -> None:
497+
# Given
498+
feature_state.identity = feature_identity
499+
500+
# When & Then
501+
assert str(feature_state) == expected_result
502+
503+
456504
@mock.patch("features.signals.trigger_feature_state_change_webhooks")
457505
def test_feature_state_save_calls_trigger_webhooks(
458506
mock_trigger_webhooks: mock.MagicMock,

0 commit comments

Comments
 (0)