Skip to content

Commit c5af2d5

Browse files
authored
fix: v1-override-limit-includes-all-feature-segments-in-count (#6555)
1 parent b4cf014 commit c5af2d5

File tree

2 files changed

+97
-9
lines changed

2 files changed

+97
-9
lines changed

api/features/feature_segments/limits.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,14 @@ def _check(left: int, right: int) -> bool:
3232
)
3333
q = q & Q(environment_feature_version__in=latest_versions)
3434

35-
existing_overridden_segment_ids = set(
36-
environment.feature_segments.filter(q).values_list("segment_id", flat=True)
37-
)
38-
segment_override_count = len(existing_overridden_segment_ids)
35+
existing_overrides = environment.feature_segments.filter(q)
36+
segment_override_count = existing_overrides.count()
3937

40-
extra = len(segment_ids_to_create_overrides) - len(
41-
set(segment_ids_to_delete_overrides).intersection(
42-
existing_overridden_segment_ids
43-
)
38+
existing_segment_ids = set(existing_overrides.values_list("segment_id", flat=True))
39+
to_delete_count = len(
40+
set(segment_ids_to_delete_overrides).intersection(existing_segment_ids)
4441
)
42+
extra = len(segment_ids_to_create_overrides) - to_delete_count
4543

4644
return _check(
4745
segment_override_count + extra,

api/tests/unit/features/feature_segments/test_unit_feature_segments_limits.py

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,100 @@
11
from environments.models import Environment
22
from features.feature_segments.limits import exceeds_segment_override_limit
3-
from features.models import Feature
3+
from features.models import Feature, FeatureSegment
4+
from features.versioning.models import EnvironmentFeatureVersion
45
from projects.models import Project
56
from segments.models import Segment
67

78

9+
def test_exceeds_segment_override_limit__shared_segment_across_features__returns_true(
10+
project: Project,
11+
environment: Environment,
12+
) -> None:
13+
# Given
14+
project.max_segment_overrides_allowed = 3
15+
project.save()
16+
17+
features = [
18+
Feature.objects.create(name=f"feature_{i}", project=project) for i in range(5)
19+
]
20+
segment = Segment.objects.create(name="shared_segment", project=project)
21+
22+
for feature in features:
23+
FeatureSegment.objects.create(
24+
feature=feature, segment=segment, environment=environment
25+
)
26+
27+
# When
28+
result = exceeds_segment_override_limit(environment=environment)
29+
30+
# Then
31+
assert result is True
32+
33+
34+
def test_exceeds_segment_override_limit__distinct_segments_per_feature__returns_true(
35+
project: Project,
36+
environment: Environment,
37+
) -> None:
38+
# Given
39+
project.max_segment_overrides_allowed = 3
40+
project.save()
41+
42+
features = [
43+
Feature.objects.create(name=f"feature_{i}", project=project) for i in range(5)
44+
]
45+
segments = [
46+
Segment.objects.create(name=f"segment_{i}", project=project) for i in range(5)
47+
]
48+
49+
for feature, segment in zip(features, segments):
50+
FeatureSegment.objects.create(
51+
feature=feature, segment=segment, environment=environment
52+
)
53+
54+
# When
55+
result = exceeds_segment_override_limit(environment=environment)
56+
57+
# Then
58+
assert result is True
59+
60+
61+
def test_exceeds_segment_override_limit__v2_delete_uses_unique_segment_ids__returns_true(
62+
project: Project,
63+
environment_v2_versioning: Environment,
64+
) -> None:
65+
# Given
66+
project.max_segment_overrides_allowed = 5
67+
project.save()
68+
69+
features = [
70+
Feature.objects.create(name=f"feature_{i}", project=project) for i in range(5)
71+
]
72+
shared_segment = Segment.objects.create(name="shared_segment", project=project)
73+
new_segment = Segment.objects.create(name="new_segment", project=project)
74+
75+
for feature in features:
76+
version = EnvironmentFeatureVersion.objects.get_or_create(
77+
environment=environment_v2_versioning,
78+
feature=feature,
79+
)[0]
80+
FeatureSegment.objects.create(
81+
feature=feature,
82+
segment=shared_segment,
83+
environment=environment_v2_versioning,
84+
environment_feature_version=version,
85+
)
86+
87+
# When
88+
result = exceeds_segment_override_limit(
89+
environment=environment_v2_versioning,
90+
segment_ids_to_create_overrides=[new_segment.id],
91+
segment_ids_to_delete_overrides=[shared_segment.id],
92+
)
93+
94+
# Then
95+
assert result is True
96+
97+
898
def test_exceeds_segment_override_limit__deleting_override_with_zero_limit__returns_true(
999
feature: Feature,
10100
segment: Segment,

0 commit comments

Comments
 (0)