Skip to content

Commit cde95c5

Browse files
committed
get latest events per provider per feature per environment
1 parent bfe1e3e commit cde95c5

File tree

2 files changed

+38
-5
lines changed

2 files changed

+38
-5
lines changed

api/features/feature_health/models.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@ def get_latest_by_feature(
7979
) -> "models.QuerySet[FeatureHealthEvent]":
8080
return (
8181
self.filter(feature=feature)
82-
.order_by("provider_name", "-created_at")
83-
.distinct("provider_name")
82+
.order_by("provider_name", "environment_id", "-created_at")
83+
.distinct("provider_name", "environment_id")
8484
)
8585

8686
def get_latest_by_project(
@@ -89,8 +89,8 @@ def get_latest_by_project(
8989
) -> "models.QuerySet[FeatureHealthEvent]":
9090
return (
9191
self.filter(feature__project=project)
92-
.order_by("provider_name", "feature_id", "-created_at")
93-
.distinct("provider_name", "feature_id")
92+
.order_by("provider_name", "environment_id", "feature_id", "-created_at")
93+
.distinct("provider_name", "environment_id", "feature_id")
9494
)
9595

9696

api/tests/unit/features/feature_health/test_models.py

+34-1
Original file line numberDiff line numberDiff line change
@@ -53,29 +53,55 @@ def test_feature_health_provider__get_audit_log_author__return_expected(
5353
def test_feature_health_event__get_latest_by_feature__return_expected(
5454
project: Project,
5555
feature: Feature,
56+
environment: Environment,
5657
) -> None:
5758
# Given
5859
unrelated_feature = Feature.objects.create(
5960
project=project, name="unrelated_feature"
6061
)
62+
environment_2 = Environment.objects.create(project=project, name="Environment 2")
6163

6264
latest_provider1_event = FeatureHealthEvent.objects.create(
6365
feature=feature,
6466
type="UNHEALTHY",
6567
provider_name="provider1",
6668
)
69+
latest_provider1_environment_event = FeatureHealthEvent.objects.create(
70+
feature=feature,
71+
type="UNHEALTHY",
72+
provider_name="provider1",
73+
environment=environment,
74+
)
6775
with freeze_time(now - datetime.timedelta(hours=1)):
6876
older_provider1_event = FeatureHealthEvent.objects.create(
6977
feature=feature,
7078
type="HEALTHY",
7179
provider_name="provider1",
7280
)
81+
older_provider1_environment_event = FeatureHealthEvent.objects.create(
82+
feature=feature,
83+
type="HEALTHY",
84+
provider_name="provider1",
85+
environment=environment,
86+
)
87+
latest_provider_1_environment_2_event = FeatureHealthEvent.objects.create(
88+
feature=feature,
89+
type="UNHEALTHY",
90+
provider_name="provider1",
91+
environment=environment_2,
92+
)
7393
with freeze_time(now - datetime.timedelta(hours=2)):
7494
latest_provider2_event = FeatureHealthEvent.objects.create(
7595
feature=feature,
7696
type="UNHEALTHY",
7797
provider_name="provider2",
7898
)
99+
older_provider_1_environment_2_event = FeatureHealthEvent.objects.create(
100+
feature=feature,
101+
type="HEALTHY",
102+
provider_name="provider1",
103+
environment=environment_2,
104+
)
79105
unrelated_feature_event = FeatureHealthEvent.objects.create(
80106
feature=unrelated_feature,
81107
type="UNHEALTHY",
@@ -86,8 +112,15 @@ def test_feature_health_event__get_latest_by_feature__return_expected(
86112
feature_health_events = [*FeatureHealthEvent.objects.get_latest_by_feature(feature)]
87113

88114
# Then
89-
assert feature_health_events == [latest_provider1_event, latest_provider2_event]
115+
assert feature_health_events == [
116+
latest_provider1_environment_event,
117+
latest_provider_1_environment_2_event,
118+
latest_provider1_event,
119+
latest_provider2_event,
120+
]
90121
assert older_provider1_event not in feature_health_events
122+
assert older_provider1_environment_event not in feature_health_events
123+
assert older_provider_1_environment_2_event not in feature_health_events
91124
assert unrelated_feature_event not in feature_health_events
92125

93126

0 commit comments

Comments
 (0)