diff --git a/api/conftest.py b/api/conftest.py index 6f3600650e4c..bde60d982095 100644 --- a/api/conftest.py +++ b/api/conftest.py @@ -471,14 +471,14 @@ def _with_project_permissions( @pytest.fixture() -def environment_v2_versioning(environment): +def environment_v2_versioning(environment: Environment) -> Environment: enable_v2_versioning(environment.id) environment.refresh_from_db() return environment @pytest.fixture() -def identity(environment): +def identity(environment: Environment) -> Identity: return Identity.objects.create(identifier="test_identity", environment=environment) diff --git a/api/features/models.py b/api/features/models.py index 275d8d2b7de0..24021477d110 100644 --- a/api/features/models.py +++ b/api/features/models.py @@ -533,6 +533,14 @@ def __gt__(self, other: "FeatureState") -> bool: # noqa: C901 if self.type == other.type: if self.environment.use_v2_feature_versioning: + if ( + self.environment_feature_version is None + or other.environment_feature_version is None + ): + raise ValueError( + "Cannot compare feature states as they are missing environment_feature_version." + ) + return ( self.environment_feature_version > other.environment_feature_version ) diff --git a/api/tests/unit/features/test_unit_features_models.py b/api/tests/unit/features/test_unit_features_models.py index 0c5e8e47bb28..6f440e8917dc 100644 --- a/api/tests/unit/features/test_unit_features_models.py +++ b/api/tests/unit/features/test_unit_features_models.py @@ -367,6 +367,36 @@ def test_feature_state_gt_operator_order( assert segment_2_state > default_env_state +def test_feature_state_gt_operator_order_when_environment_feature_version_is_none( + identity: Identity, + feature: Feature, + feature_state: FeatureState, + environment: Environment, + environment_v2_versioning: Environment, + mocker: MockerFixture, +) -> None: + # Given + feature_state2 = FeatureState.objects.create( + identity=identity, feature=feature, environment=environment + ) + mocker.patch.object( + FeatureState, + "type", + new_callable=mocker.PropertyMock, + return_value="ENVIRONMENT", + ) + + # When + with pytest.raises(ValueError) as exception: + assert feature_state > feature_state2 + + # Then + assert ( + exception.value.args[0] + == "Cannot compare feature states as they are missing environment_feature_version." + ) + + def test_feature_state_gt_operator_throws_value_error_if_different_environments( project: Project, environment: Environment, diff --git a/api/tests/unit/users/test_unit_users_views.py b/api/tests/unit/users/test_unit_users_views.py index 2856d3afbfa3..00ce5fff89fa 100644 --- a/api/tests/unit/users/test_unit_users_views.py +++ b/api/tests/unit/users/test_unit_users_views.py @@ -926,7 +926,7 @@ def test_list_user_groups( group_2 = response_json["results"][1] group_2_users = group_2["users"] assert len(group_2_users) == 2 - assert tuple((user["id"], user["group_admin"]) for user in group_2_users) == ( + assert set((user["id"], user["group_admin"]) for user in group_2_users) == { (user1.pk, False), (user2.pk, True), - ) + }