Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/sentry/api/serializers/models/release.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ def _expose_health_data(data):
"totalProjectSessions24h": data["total_project_sessions_24h"],
"adoption": data["adoption"],
"sessionsAdoption": data["sessions_adoption"],
"stats": data.get("stats"),
"stats": {str(k): v for k, v in (data.get("stats") or {}).items()},
# XXX: legacy key, should be removed later.
"hasHealthData": data["has_health_data"],
}
Expand All @@ -86,7 +86,7 @@ def _expose_project(project):
"id": project["id"],
"slug": project["slug"],
"name": project["name"],
"newGroups": project["new_groups"],
"newGroups": project["new_groups"] or 0,
"platform": project["platform"],
"platforms": project["platforms"],
# XXX: Legacy should be removed
Expand Down
53 changes: 52 additions & 1 deletion tests/sentry/api/serializers/test_release.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,11 @@
from sentry import tagstore
from sentry.api.endpoints.organization_releases import ReleaseSerializerWithProjects
from sentry.api.serializers import serialize
from sentry.api.serializers.models.release import GroupEventReleaseSerializer, get_users_for_authors
from sentry.api.serializers.models.release import (
GroupEventReleaseSerializer,
_expose_health_data,
get_users_for_authors,
)
from sentry.integrations.models.external_actor import ExternalActor
from sentry.models.commit import Commit
from sentry.models.commitauthor import CommitAuthor
Expand Down Expand Up @@ -595,6 +599,22 @@ def test_with_none_new_groups(self) -> None:
assert result["version"] == "0.1"
assert result["newGroups"] == 0 # Should default to 0 when None

def test_none_new_groups_per_project_defaults_to_zero(self) -> None:
project = self.create_project()

release = Release.objects.create(
organization_id=project.organization_id,
version="0.2",
)
release.add_project(project)

ReleaseProject.objects.filter(release=release, project=project).update(new_groups=None)

result = serialize(release, user=self.user, project=project)

assert result["newGroups"] == 0
assert result["projects"][0]["newGroups"] == 0 # Should default to 0 when None

def test_new_groups_single_release(self) -> None:
"""
Test new groups counts for one release with multiple projects, each having different issue counts.
Expand Down Expand Up @@ -1263,3 +1283,34 @@ def test_external_actor_duplicate_external_name_prefers_most_recent(self) -> Non
assert users[str(author.id)].get("id", "not present") == str(user2.id)
assert users[str(author.id)]["email"] == "user2@company.com"
assert users[str(author.id)]["name"] == "User 2"


class ExposeHealthDataTest(TestCase):
def test_none_and_empty_payload_returns_none(self) -> None:
assert _expose_health_data(None) is None
assert _expose_health_data({}) is None

def test_missing_stats_defaults_to_empty_dict(self) -> None:
result = _expose_health_data(
{
"duration_p50": None,
"duration_p90": None,
"crash_free_users": None,
"crash_free_sessions": None,
"sessions_crashed": 0,
"sessions_errored": 0,
"total_users": 0,
"total_users_24h": 0,
"total_project_users_24h": 0,
"total_sessions": 0,
"total_sessions_24h": 0,
"total_project_sessions_24h": 0,
"adoption": None,
"sessions_adoption": None,
"has_health_data": False,
}
)

assert result is not None
assert result["stats"] == {}
assert result["sessionsCrashed"] == 0
Loading