|
@@ -36,13 +36,22 @@ from sentry.search.events.constants import (
|
|
|
SEMVER_BUILD_ALIAS,
|
|
|
SEMVER_PACKAGE_ALIAS,
|
|
|
)
|
|
|
-from sentry.testutils import APITestCase, ReleaseCommitPatchTest, SetRefsTestCase, TestCase
|
|
|
+from sentry.testutils import (
|
|
|
+ APITestCase,
|
|
|
+ ReleaseCommitPatchTest,
|
|
|
+ SetRefsTestCase,
|
|
|
+ SnubaTestCase,
|
|
|
+ TestCase,
|
|
|
+)
|
|
|
from sentry.utils.compat.mock import patch
|
|
|
|
|
|
|
|
|
-class OrganizationReleaseListTest(APITestCase):
|
|
|
+class OrganizationReleaseListTest(APITestCase, SnubaTestCase):
|
|
|
endpoint = "sentry-api-0-organization-releases"
|
|
|
|
|
|
+ def assert_expected_versions(self, response, expected):
|
|
|
+ assert [item["version"] for item in response.data] == [e.version for e in expected]
|
|
|
+
|
|
|
def test_simple(self):
|
|
|
user = self.create_user(is_staff=False, is_superuser=False)
|
|
|
org = self.organization
|
|
@@ -84,14 +93,8 @@ class OrganizationReleaseListTest(APITestCase):
|
|
|
)
|
|
|
release4.add_project(project3)
|
|
|
|
|
|
- url = reverse("sentry-api-0-organization-releases", kwargs={"organization_slug": org.slug})
|
|
|
- response = self.client.get(url, format="json")
|
|
|
-
|
|
|
- assert response.status_code == 200, response.content
|
|
|
- assert len(response.data) == 3
|
|
|
- assert response.data[0]["version"] == release4.version
|
|
|
- assert response.data[1]["version"] == release1.version
|
|
|
- assert response.data[2]["version"] == release3.version
|
|
|
+ response = self.get_valid_response(org.slug)
|
|
|
+ self.assert_expected_versions(response, [release4, release1, release3])
|
|
|
|
|
|
def test_release_list_order_by_date_added(self):
|
|
|
"""
|
|
@@ -136,14 +139,89 @@ class OrganizationReleaseListTest(APITestCase):
|
|
|
)
|
|
|
release8.add_project(project)
|
|
|
|
|
|
- url = reverse("sentry-api-0-organization-releases", kwargs={"organization_slug": org.slug})
|
|
|
- response = self.client.get(url, format="json")
|
|
|
+ response = self.get_valid_response(org.slug)
|
|
|
+ self.assert_expected_versions(response, [release8, release7, release6])
|
|
|
|
|
|
- assert response.status_code == 200, response.content
|
|
|
- assert len(response.data) == 3
|
|
|
- assert response.data[0]["version"] == release8.version
|
|
|
- assert response.data[1]["version"] == release7.version
|
|
|
- assert response.data[2]["version"] == release6.version
|
|
|
+ def test_release_list_order_by_sessions_empty(self):
|
|
|
+ self.login_as(user=self.user)
|
|
|
+
|
|
|
+ release_1 = self.create_release(version="1")
|
|
|
+ release_2 = self.create_release(version="2")
|
|
|
+ release_3 = self.create_release(version="3")
|
|
|
+ release_4 = self.create_release(version="4")
|
|
|
+ release_5 = self.create_release(version="5")
|
|
|
+
|
|
|
+ # Make sure ordering works fine when we have no session data at all
|
|
|
+ response = self.get_valid_response(self.organization.slug, sort="sessions", flatten="1")
|
|
|
+ self.assert_expected_versions(
|
|
|
+ response, [release_5, release_4, release_3, release_2, release_1]
|
|
|
+ )
|
|
|
+
|
|
|
+ def test_release_list_order_by_sessions(self):
|
|
|
+ self.login_as(user=self.user)
|
|
|
+
|
|
|
+ release_1 = self.create_release(version="1")
|
|
|
+ self.store_session(self.session_dict(release=release_1))
|
|
|
+ release_2 = self.create_release(version="2")
|
|
|
+ release_3 = self.create_release(version="3")
|
|
|
+ release_4 = self.create_release(version="4")
|
|
|
+ release_5 = self.create_release(version="5")
|
|
|
+ self.bulk_store_sessions([self.session_dict(release=release_5) for _ in range(2)])
|
|
|
+
|
|
|
+ response = self.get_valid_response(self.organization.slug, sort="sessions", flatten="1")
|
|
|
+ self.assert_expected_versions(
|
|
|
+ response, [release_5, release_1, release_4, release_3, release_2]
|
|
|
+ )
|
|
|
+
|
|
|
+ response = self.get_valid_response(
|
|
|
+ self.organization.slug, sort="sessions", flatten="1", per_page=1
|
|
|
+ )
|
|
|
+ self.assert_expected_versions(response, [release_5])
|
|
|
+ response = self.get_valid_response(
|
|
|
+ self.organization.slug,
|
|
|
+ sort="sessions",
|
|
|
+ flatten="1",
|
|
|
+ per_page=1,
|
|
|
+ cursor=self.get_cursor_headers(response)[1],
|
|
|
+ )
|
|
|
+ self.assert_expected_versions(response, [release_1])
|
|
|
+ response = self.get_valid_response(
|
|
|
+ self.organization.slug,
|
|
|
+ sort="sessions",
|
|
|
+ flatten="1",
|
|
|
+ per_page=1,
|
|
|
+ cursor=self.get_cursor_headers(response)[1],
|
|
|
+ )
|
|
|
+ self.assert_expected_versions(response, [release_4])
|
|
|
+ response = self.get_valid_response(
|
|
|
+ self.organization.slug,
|
|
|
+ sort="sessions",
|
|
|
+ flatten="1",
|
|
|
+ per_page=1,
|
|
|
+ cursor=self.get_cursor_headers(response)[1],
|
|
|
+ )
|
|
|
+ self.assert_expected_versions(response, [release_3])
|
|
|
+ response = self.get_valid_response(
|
|
|
+ self.organization.slug,
|
|
|
+ sort="sessions",
|
|
|
+ flatten="1",
|
|
|
+ per_page=1,
|
|
|
+ cursor=self.get_cursor_headers(response)[1],
|
|
|
+ )
|
|
|
+ self.assert_expected_versions(response, [release_2])
|
|
|
+
|
|
|
+ response = self.get_valid_response(
|
|
|
+ self.organization.slug, sort="sessions", flatten="1", per_page=3
|
|
|
+ )
|
|
|
+ self.assert_expected_versions(response, [release_5, release_1, release_4])
|
|
|
+ response = self.get_valid_response(
|
|
|
+ self.organization.slug,
|
|
|
+ sort="sessions",
|
|
|
+ flatten="1",
|
|
|
+ per_page=3,
|
|
|
+ cursor=self.get_cursor_headers(response)[1],
|
|
|
+ )
|
|
|
+ self.assert_expected_versions(response, [release_3, release_2])
|
|
|
|
|
|
def test_release_list_order_by_build_number(self):
|
|
|
self.login_as(user=self.user)
|
|
@@ -154,11 +232,7 @@ class OrganizationReleaseListTest(APITestCase):
|
|
|
self.create_release(version="test@1.2+500alpha")
|
|
|
|
|
|
response = self.get_valid_response(self.organization.slug, sort="build")
|
|
|
- assert [r["version"] for r in response.data] == [
|
|
|
- release_1.version,
|
|
|
- release_3.version,
|
|
|
- release_2.version,
|
|
|
- ]
|
|
|
+ self.assert_expected_versions(response, [release_1, release_3, release_2])
|
|
|
|
|
|
def test_release_list_order_by_semver(self):
|
|
|
self.login_as(user=self.user)
|
|
@@ -173,17 +247,20 @@ class OrganizationReleaseListTest(APITestCase):
|
|
|
release_9 = self.create_release(version="random_junk")
|
|
|
|
|
|
response = self.get_valid_response(self.organization.slug, sort="semver")
|
|
|
- assert [r["version"] for r in response.data] == [
|
|
|
- release_7.version,
|
|
|
- release_2.version,
|
|
|
- release_6.version,
|
|
|
- release_5.version,
|
|
|
- release_4.version,
|
|
|
- release_1.version,
|
|
|
- release_3.version,
|
|
|
- release_9.version,
|
|
|
- release_8.version,
|
|
|
- ]
|
|
|
+ self.assert_expected_versions(
|
|
|
+ response,
|
|
|
+ [
|
|
|
+ release_7,
|
|
|
+ release_2,
|
|
|
+ release_6,
|
|
|
+ release_5,
|
|
|
+ release_4,
|
|
|
+ release_1,
|
|
|
+ release_3,
|
|
|
+ release_9,
|
|
|
+ release_8,
|
|
|
+ ],
|
|
|
+ )
|
|
|
|
|
|
def test_query_filter(self):
|
|
|
user = self.create_user(is_staff=False, is_superuser=False)
|
|
@@ -213,17 +290,11 @@ class OrganizationReleaseListTest(APITestCase):
|
|
|
)
|
|
|
release2.add_project(project)
|
|
|
|
|
|
- url = reverse("sentry-api-0-organization-releases", kwargs={"organization_slug": org.slug})
|
|
|
- response = self.client.get(url + "?query=oob", format="json")
|
|
|
-
|
|
|
- assert response.status_code == 200, response.content
|
|
|
- assert len(response.data) == 1
|
|
|
- assert response.data[0]["version"] == release.version
|
|
|
-
|
|
|
- response = self.client.get(url + "?query=baz", format="json")
|
|
|
+ response = self.get_valid_response(org.slug, query="oob")
|
|
|
+ self.assert_expected_versions(response, [release])
|
|
|
|
|
|
- assert response.status_code == 200, response.content
|
|
|
- assert len(response.data) == 0
|
|
|
+ response = self.get_valid_response(org.slug, query="baz")
|
|
|
+ self.assert_expected_versions(response, [])
|
|
|
|
|
|
def test_release_filter(self):
|
|
|
user = self.create_user(is_staff=False, is_superuser=False)
|
|
@@ -254,21 +325,13 @@ class OrganizationReleaseListTest(APITestCase):
|
|
|
release2.add_project(project)
|
|
|
|
|
|
response = self.get_valid_response(self.organization.slug, query=f"{RELEASE_ALIAS}:foobar")
|
|
|
-
|
|
|
- assert response.status_code == 200, response.content
|
|
|
- assert len(response.data) == 1
|
|
|
- assert response.data[0]["version"] == release.version
|
|
|
+ self.assert_expected_versions(response, [release])
|
|
|
|
|
|
response = self.get_valid_response(self.organization.slug, query=f"{RELEASE_ALIAS}:foo*")
|
|
|
-
|
|
|
- assert response.status_code == 200, response.content
|
|
|
- assert len(response.data) == 1
|
|
|
- assert response.data[0]["version"] == release.version
|
|
|
+ self.assert_expected_versions(response, [release])
|
|
|
|
|
|
response = self.get_valid_response(self.organization.slug, query=f"{RELEASE_ALIAS}:baz")
|
|
|
-
|
|
|
- assert response.status_code == 200, response.content
|
|
|
- assert len(response.data) == 0
|
|
|
+ self.assert_expected_versions(response, [])
|
|
|
|
|
|
def test_query_filter_suffix(self):
|
|
|
user = self.create_user(is_staff=False, is_superuser=False)
|
|
@@ -314,53 +377,41 @@ class OrganizationReleaseListTest(APITestCase):
|
|
|
self.create_release(version="some.release")
|
|
|
|
|
|
response = self.get_valid_response(self.organization.slug, query=f"{SEMVER_ALIAS}:>1.2.3")
|
|
|
- assert [r["version"] for r in response.data] == [release_3.version, release_1.version]
|
|
|
+ self.assert_expected_versions(response, [release_3, release_1])
|
|
|
|
|
|
response = self.get_valid_response(self.organization.slug, query=f"{SEMVER_ALIAS}:>=1.2.3")
|
|
|
- assert [r["version"] for r in response.data] == [
|
|
|
- release_3.version,
|
|
|
- release_2.version,
|
|
|
- release_1.version,
|
|
|
- ]
|
|
|
+ self.assert_expected_versions(response, [release_3, release_2, release_1])
|
|
|
|
|
|
response = self.get_valid_response(self.organization.slug, query=f"{SEMVER_ALIAS}:1.2.*")
|
|
|
- assert [r["version"] for r in response.data] == [
|
|
|
- release_3.version,
|
|
|
- release_2.version,
|
|
|
- release_1.version,
|
|
|
- ]
|
|
|
+ self.assert_expected_versions(response, [release_3, release_2, release_1])
|
|
|
|
|
|
response = self.get_valid_response(
|
|
|
self.organization.slug, query=f"{SEMVER_ALIAS}:>=1.2.3", sort="semver"
|
|
|
)
|
|
|
- assert [r["version"] for r in response.data] == [
|
|
|
- release_3.version,
|
|
|
- release_1.version,
|
|
|
- release_2.version,
|
|
|
- ]
|
|
|
+ self.assert_expected_versions(response, [release_3, release_1, release_2])
|
|
|
|
|
|
response = self.get_valid_response(self.organization.slug, query=f"{SEMVER_ALIAS}:2.2.1")
|
|
|
- assert [r["version"] for r in response.data] == []
|
|
|
+ self.assert_expected_versions(response, [])
|
|
|
|
|
|
response = self.get_valid_response(
|
|
|
self.organization.slug, query=f"{SEMVER_PACKAGE_ALIAS}:test2"
|
|
|
)
|
|
|
- assert [r["version"] for r in response.data] == [release_3.version]
|
|
|
+ self.assert_expected_versions(response, [release_3])
|
|
|
|
|
|
response = self.get_valid_response(
|
|
|
self.organization.slug, query=f"{SEMVER_PACKAGE_ALIAS}:test"
|
|
|
)
|
|
|
- assert [r["version"] for r in response.data] == [release_2.version, release_1.version]
|
|
|
+ self.assert_expected_versions(response, [release_2, release_1])
|
|
|
|
|
|
response = self.get_valid_response(
|
|
|
self.organization.slug, query=f"{SEMVER_BUILD_ALIAS}:>124"
|
|
|
)
|
|
|
- assert [r["version"] for r in response.data] == [release_3.version]
|
|
|
+ self.assert_expected_versions(response, [release_3])
|
|
|
|
|
|
response = self.get_valid_response(
|
|
|
self.organization.slug, query=f"{SEMVER_BUILD_ALIAS}:<125"
|
|
|
)
|
|
|
- assert [r["version"] for r in response.data] == [release_2.version, release_1.version]
|
|
|
+ self.assert_expected_versions(response, [release_2, release_1])
|
|
|
|
|
|
def test_release_stage_filter(self):
|
|
|
self.login_as(user=self.user)
|
|
@@ -399,31 +450,28 @@ class OrganizationReleaseListTest(APITestCase):
|
|
|
query=f"{RELEASE_STAGE_ALIAS}:{ReleaseStages.ADOPTED}",
|
|
|
environment=self.environment.name,
|
|
|
)
|
|
|
- assert [r["version"] for r in response.data] == [adopted_release.version]
|
|
|
+ self.assert_expected_versions(response, [adopted_release])
|
|
|
|
|
|
response = self.get_valid_response(
|
|
|
self.organization.slug,
|
|
|
query=f"{RELEASE_STAGE_ALIAS}:{ReleaseStages.LOW_ADOPTION}",
|
|
|
environment=self.environment.name,
|
|
|
)
|
|
|
- assert [r["version"] for r in response.data] == [not_adopted_release.version]
|
|
|
+ self.assert_expected_versions(response, [not_adopted_release])
|
|
|
|
|
|
response = self.get_valid_response(
|
|
|
self.organization.slug,
|
|
|
query=f"{RELEASE_STAGE_ALIAS}:{ReleaseStages.REPLACED}",
|
|
|
environment=self.environment.name,
|
|
|
)
|
|
|
- assert [r["version"] for r in response.data] == [replaced_release.version]
|
|
|
+ self.assert_expected_versions(response, [replaced_release])
|
|
|
|
|
|
response = self.get_valid_response(
|
|
|
self.organization.slug,
|
|
|
query=f"{RELEASE_STAGE_ALIAS}:[{ReleaseStages.ADOPTED},{ReleaseStages.REPLACED}]",
|
|
|
environment=self.environment.name,
|
|
|
)
|
|
|
- assert [r["version"] for r in response.data] == [
|
|
|
- adopted_release.version,
|
|
|
- replaced_release.version,
|
|
|
- ]
|
|
|
+ self.assert_expected_versions(response, [adopted_release, replaced_release])
|
|
|
|
|
|
response = self.get_valid_response(
|
|
|
self.organization.slug,
|
|
@@ -431,17 +479,15 @@ class OrganizationReleaseListTest(APITestCase):
|
|
|
environment=self.environment.name,
|
|
|
)
|
|
|
|
|
|
- assert [r["version"] for r in response.data] == [not_adopted_release.version]
|
|
|
+ self.assert_expected_versions(response, [not_adopted_release])
|
|
|
|
|
|
response = self.get_valid_response(
|
|
|
self.organization.slug,
|
|
|
sort="adoption",
|
|
|
)
|
|
|
- assert [r["version"] for r in response.data] == [
|
|
|
- adopted_release.version,
|
|
|
- replaced_release.version,
|
|
|
- not_adopted_release.version,
|
|
|
- ]
|
|
|
+ self.assert_expected_versions(
|
|
|
+ response, [adopted_release, replaced_release, not_adopted_release]
|
|
|
+ )
|
|
|
adopted_rpe.update(adopted=timezone.now() - timedelta(minutes=15))
|
|
|
|
|
|
# Replaced should come first now.
|
|
@@ -449,16 +495,12 @@ class OrganizationReleaseListTest(APITestCase):
|
|
|
self.organization.slug,
|
|
|
sort="adoption",
|
|
|
)
|
|
|
- assert [r["version"] for r in response.data] == [
|
|
|
- replaced_release.version,
|
|
|
- adopted_release.version,
|
|
|
- not_adopted_release.version,
|
|
|
- ]
|
|
|
+ self.assert_expected_versions(
|
|
|
+ response, [replaced_release, adopted_release, not_adopted_release]
|
|
|
+ )
|
|
|
|
|
|
response = self.get_valid_response(self.organization.slug, sort="adoption", per_page=1)
|
|
|
- assert [r["version"] for r in response.data] == [
|
|
|
- replaced_release.version,
|
|
|
- ]
|
|
|
+ self.assert_expected_versions(response, [replaced_release])
|
|
|
next_cursor = self.get_cursor_headers(response)[1]
|
|
|
response = self.get_valid_response(
|
|
|
self.organization.slug,
|
|
@@ -466,9 +508,7 @@ class OrganizationReleaseListTest(APITestCase):
|
|
|
per_page=1,
|
|
|
cursor=next_cursor,
|
|
|
)
|
|
|
- assert [r["version"] for r in response.data] == [
|
|
|
- adopted_release.version,
|
|
|
- ]
|
|
|
+ self.assert_expected_versions(response, [adopted_release])
|
|
|
next_cursor = self.get_cursor_headers(response)[1]
|
|
|
response = self.get_valid_response(
|
|
|
self.organization.slug,
|
|
@@ -477,9 +517,7 @@ class OrganizationReleaseListTest(APITestCase):
|
|
|
cursor=next_cursor,
|
|
|
)
|
|
|
prev_cursor = self.get_cursor_headers(response)[0]
|
|
|
- assert [r["version"] for r in response.data] == [
|
|
|
- not_adopted_release.version,
|
|
|
- ]
|
|
|
+ self.assert_expected_versions(response, [not_adopted_release])
|
|
|
response = self.get_valid_response(
|
|
|
self.organization.slug,
|
|
|
sort="adoption",
|
|
@@ -487,9 +525,7 @@ class OrganizationReleaseListTest(APITestCase):
|
|
|
cursor=prev_cursor,
|
|
|
)
|
|
|
prev_cursor = self.get_cursor_headers(response)[0]
|
|
|
- assert [r["version"] for r in response.data] == [
|
|
|
- adopted_release.version,
|
|
|
- ]
|
|
|
+ self.assert_expected_versions(response, [adopted_release])
|
|
|
response = self.get_valid_response(
|
|
|
self.organization.slug,
|
|
|
sort="adoption",
|
|
@@ -497,9 +533,7 @@ class OrganizationReleaseListTest(APITestCase):
|
|
|
cursor=prev_cursor,
|
|
|
)
|
|
|
prev_cursor = self.get_cursor_headers(response)[0]
|
|
|
- assert [r["version"] for r in response.data] == [
|
|
|
- replaced_release.version,
|
|
|
- ]
|
|
|
+ self.assert_expected_versions(response, [replaced_release])
|
|
|
|
|
|
adopted_rpe.update(adopted=timezone.now() - timedelta(minutes=15))
|
|
|
|
|
@@ -509,10 +543,7 @@ class OrganizationReleaseListTest(APITestCase):
|
|
|
sort="adoption",
|
|
|
environment=self.environment.name,
|
|
|
)
|
|
|
- assert [r["version"] for r in response.data] == [
|
|
|
- replaced_release.version,
|
|
|
- not_adopted_release.version,
|
|
|
- ]
|
|
|
+ self.assert_expected_versions(response, [replaced_release, not_adopted_release])
|
|
|
|
|
|
response = self.get_response(
|
|
|
self.organization.slug,
|
|
@@ -561,13 +592,8 @@ class OrganizationReleaseListTest(APITestCase):
|
|
|
)
|
|
|
release3.add_project(project1)
|
|
|
|
|
|
- url = reverse("sentry-api-0-organization-releases", kwargs={"organization_slug": org.slug})
|
|
|
- response = self.client.get(url, format="json")
|
|
|
-
|
|
|
- assert response.status_code == 200, response.content
|
|
|
- assert len(response.data) == 2
|
|
|
- assert response.data[0]["version"] == release1.version
|
|
|
- assert response.data[1]["version"] == release3.version
|
|
|
+ response = self.get_valid_response(org.slug)
|
|
|
+ self.assert_expected_versions(response, [release1, release3])
|
|
|
|
|
|
def test_all_projects_parameter(self):
|
|
|
user = self.create_user(is_staff=False, is_superuser=False)
|
|
@@ -594,13 +620,8 @@ class OrganizationReleaseListTest(APITestCase):
|
|
|
)
|
|
|
release2.add_project(project2)
|
|
|
|
|
|
- url = reverse("sentry-api-0-organization-releases", kwargs={"organization_slug": org.slug})
|
|
|
- response = self.client.get(url, data={"project": [-1]}, format="json")
|
|
|
-
|
|
|
- assert response.status_code == 200, response.content
|
|
|
- assert len(response.data) == 2
|
|
|
- assert response.data[0]["version"] == release2.version
|
|
|
- assert response.data[1]["version"] == release1.version
|
|
|
+ response = self.get_valid_response(org.slug, project=[-1])
|
|
|
+ self.assert_expected_versions(response, [release2, release1])
|
|
|
|
|
|
def test_new_org(self):
|
|
|
user = self.create_user(is_staff=False, is_superuser=False)
|
|
@@ -608,11 +629,8 @@ class OrganizationReleaseListTest(APITestCase):
|
|
|
team = self.create_team(organization=org)
|
|
|
self.create_member(teams=[team], user=user, organization=org)
|
|
|
self.login_as(user=user)
|
|
|
- url = reverse("sentry-api-0-organization-releases", kwargs={"organization_slug": org.slug})
|
|
|
- response = self.client.get(url, format="json")
|
|
|
-
|
|
|
- assert response.status_code == 200, response.content
|
|
|
- assert len(response.data) == 0
|
|
|
+ response = self.get_valid_response(org.slug)
|
|
|
+ self.assert_expected_versions(response, [])
|
|
|
|
|
|
def test_archive_release(self):
|
|
|
self.login_as(user=self.user)
|