From f07d2ea6e62cc3c06a056fd959d729061472484e Mon Sep 17 00:00:00 2001 From: Kyle Consalus Date: Thu, 22 May 2025 12:50:33 -0700 Subject: [PATCH] fix(aci): Add an initial UptimeSubscription serializer --- src/sentry/uptime/endpoints/serializers.py | 34 +++++++++++++++++-- .../test_organization_detector_index.py | 27 +++++++++++++++ 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/src/sentry/uptime/endpoints/serializers.py b/src/sentry/uptime/endpoints/serializers.py index e2f747e9ab2390..de8f0f2a651451 100644 --- a/src/sentry/uptime/endpoints/serializers.py +++ b/src/sentry/uptime/endpoints/serializers.py @@ -1,5 +1,5 @@ from collections.abc import MutableMapping, Sequence -from typing import Any, Literal, TypedDict, cast +from typing import Any, Literal, TypedDict, cast, override from django.db.models import prefetch_related_objects from sentry_kafka_schemas.schema_types.snuba_uptime_results_v1 import ( @@ -10,7 +10,7 @@ from sentry.api.serializers import Serializer, register, serialize from sentry.api.serializers.models.actor import ActorSerializer, ActorSerializerResponse from sentry.types.actor import Actor -from sentry.uptime.models import ProjectUptimeSubscription +from sentry.uptime.models import ProjectUptimeSubscription, UptimeSubscription from sentry.uptime.subscriptions.regions import get_region_config from sentry.uptime.types import EapCheckEntry, IncidentStatus @@ -134,3 +134,33 @@ def serialize( "region": obj.region, "regionName": region_name, } + + +class UptimeSubscriptionSerializerResponse(TypedDict): + timeoutMs: int + intervalSeconds: int + method: str + url: str + urlDomain: str + urlDomainSuffix: str + traceSampling: bool + hostProviderId: str + hostProviderName: str + + +@register(UptimeSubscription) +class UptimeSubscriptionSerializer(Serializer): + + @override + def serialize(self, obj: UptimeSubscription, attrs, user, **kwargs) -> dict[str, Any]: + return { + "timeoutMs": obj.timeout_ms, + "intervalSeconds": obj.interval_seconds, + "method": obj.method, + "url": obj.url, + "urlDomain": obj.url_domain, + "urlDomainSuffix": obj.url_domain_suffix, + "traceSampling": obj.trace_sampling, + "hostProviderId": obj.host_provider_id, + "hostProviderName": obj.host_provider_name, + } diff --git a/tests/sentry/workflow_engine/endpoints/test_organization_detector_index.py b/tests/sentry/workflow_engine/endpoints/test_organization_detector_index.py index 5d0552c5adfdbe..e8d3d7b91272e8 100644 --- a/tests/sentry/workflow_engine/endpoints/test_organization_detector_index.py +++ b/tests/sentry/workflow_engine/endpoints/test_organization_detector_index.py @@ -14,6 +14,8 @@ ) from sentry.testutils.cases import APITestCase from sentry.testutils.silo import region_silo_test +from sentry.uptime.grouptype import UptimeDomainCheckFailure +from sentry.uptime.types import DATA_SOURCE_UPTIME_SUBSCRIPTION from sentry.workflow_engine.models import DataCondition, DataConditionGroup, DataSource, Detector from sentry.workflow_engine.models.data_condition import Condition from sentry.workflow_engine.registry import data_source_type_registry @@ -49,6 +51,31 @@ def test_simple(self): ) assert response.data == serialize([detector, detector_2]) + def test_uptime_detector(self): + subscription = self.create_uptime_subscription() + data_source = self.create_data_source( + organization_id=self.organization.id, + source_id=subscription.id, + type=DATA_SOURCE_UPTIME_SUBSCRIPTION, + ) + detector = self.create_detector( + project_id=self.project.id, + name="Test Detector", + type=UptimeDomainCheckFailure.slug, + config={ + "mode": 1, + "environment": "production", + }, + ) + self.create_data_source_detector( + data_source=data_source, + detector=detector, + ) + response = self.get_success_response( + self.organization.slug, qs_params={"project": self.project.id} + ) + assert response.data[0]["dataSources"][0]["queryObj"] == serialize(subscription) + def test_empty_result(self): response = self.get_success_response( self.organization.slug, qs_params={"project": self.project.id}