|
@@ -9,9 +9,14 @@ from sentry_relay.consts import SPAN_STATUS_CODE_TO_NAME
|
|
|
|
|
|
from sentry.api.event_search import SearchFilter, SearchKey, SearchValue
|
|
|
from sentry.models.release import SemverFilter
|
|
|
-from sentry.search.events.constants import SEMVER_ALIAS, SEMVER_EMPTY_RELEASE
|
|
|
+from sentry.search.events.constants import SEMVER_ALIAS, SEMVER_EMPTY_RELEASE, SEMVER_PACKAGE_ALIAS
|
|
|
from sentry.search.events.fields import Function, FunctionArg, InvalidSearchQuery, with_default
|
|
|
-from sentry.search.events.filter import _semver_filter_converter, get_filter, parse_semver
|
|
|
+from sentry.search.events.filter import (
|
|
|
+ _semver_filter_converter,
|
|
|
+ _semver_package_filter_converter,
|
|
|
+ get_filter,
|
|
|
+ parse_semver,
|
|
|
+)
|
|
|
from sentry.testutils.cases import TestCase
|
|
|
from sentry.testutils.helpers.datetime import before_now
|
|
|
from sentry.utils.snuba import OPERATOR_TO_FUNCTION
|
|
@@ -1433,7 +1438,7 @@ class FunctionTest(unittest.TestCase):
|
|
|
|
|
|
class SemverFilterConverterTest(TestCase):
|
|
|
def test_invalid_params(self):
|
|
|
- key = "semver"
|
|
|
+ key = SEMVER_ALIAS
|
|
|
filter = SearchFilter(SearchKey(key), ">", SearchValue("1.2.3"))
|
|
|
with pytest.raises(ValueError, match="organization_id is a required param"):
|
|
|
_semver_filter_converter(filter, key, None)
|
|
@@ -1441,7 +1446,7 @@ class SemverFilterConverterTest(TestCase):
|
|
|
_semver_filter_converter(filter, key, {"something": 1})
|
|
|
|
|
|
def test_invalid_query(self):
|
|
|
- key = "semver"
|
|
|
+ key = SEMVER_ALIAS
|
|
|
filter = SearchFilter(SearchKey(key), ">", SearchValue("1.2.hi"))
|
|
|
with pytest.raises(InvalidSearchQuery, match="Invalid format for semver query"):
|
|
|
_semver_filter_converter(filter, key, {"organization_id": self.organization.id})
|
|
@@ -1450,7 +1455,7 @@ class SemverFilterConverterTest(TestCase):
|
|
|
self, operator, version, expected_operator, expected_releases, organization_id=None
|
|
|
):
|
|
|
organization_id = organization_id if organization_id else self.organization.id
|
|
|
- key = "semver"
|
|
|
+ key = SEMVER_ALIAS
|
|
|
filter = SearchFilter(SearchKey(key), operator, SearchValue(version))
|
|
|
assert _semver_filter_converter(filter, key, {"organization_id": organization_id}) == [
|
|
|
"release",
|
|
@@ -1553,7 +1558,7 @@ class SemverFilterConverterTest(TestCase):
|
|
|
self.run_test("=", "1.2.3.4", "IN", [release_4.version])
|
|
|
self.run_test("=", "2.*", "IN", [release_5.version])
|
|
|
|
|
|
- def test_multi_packagae(self):
|
|
|
+ def test_multi_package(self):
|
|
|
release_1 = self.create_release(version="test@1.0.0.0")
|
|
|
release_2 = self.create_release(version="test@1.2.0.0")
|
|
|
release_3 = self.create_release(version="test_2@1.2.3.0")
|
|
@@ -1562,6 +1567,40 @@ class SemverFilterConverterTest(TestCase):
|
|
|
self.run_test(">", "test_2@1.0", "IN", [release_3.version])
|
|
|
|
|
|
|
|
|
+class SemverPackageFilterConverterTest(TestCase):
|
|
|
+ def run_test(
|
|
|
+ self, operator, version, expected_operator, expected_releases, organization_id=None
|
|
|
+ ):
|
|
|
+ organization_id = organization_id if organization_id else self.organization.id
|
|
|
+ key = SEMVER_ALIAS
|
|
|
+ filter = SearchFilter(SearchKey(key), operator, SearchValue(version))
|
|
|
+ converted = _semver_package_filter_converter(
|
|
|
+ filter, key, {"organization_id": organization_id}
|
|
|
+ )
|
|
|
+ assert converted[0] == "release"
|
|
|
+ assert converted[1] == expected_operator
|
|
|
+ assert set(converted[2]) == set(expected_releases)
|
|
|
+
|
|
|
+ def test_invalid_params(self):
|
|
|
+ key = SEMVER_PACKAGE_ALIAS
|
|
|
+ filter = SearchFilter(SearchKey(key), "=", SearchValue("sentry"))
|
|
|
+ with pytest.raises(ValueError, match="organization_id is a required param"):
|
|
|
+ _semver_filter_converter(filter, key, None)
|
|
|
+ with pytest.raises(ValueError, match="organization_id is a required param"):
|
|
|
+ _semver_filter_converter(filter, key, {"something": 1})
|
|
|
+
|
|
|
+ def test_empty(self):
|
|
|
+ self.run_test("=", "test", "IN", [SEMVER_EMPTY_RELEASE])
|
|
|
+
|
|
|
+ def test(self):
|
|
|
+ release = self.create_release(version="test@1.2.3")
|
|
|
+ release_2 = self.create_release(version="test@1.2.4")
|
|
|
+ release_3 = self.create_release(version="test2@1.2.4")
|
|
|
+ self.run_test("=", "test", "IN", [release.version, release_2.version])
|
|
|
+ self.run_test("=", "test2", "IN", [release_3.version])
|
|
|
+ self.run_test("=", "test3", "IN", [SEMVER_EMPTY_RELEASE])
|
|
|
+
|
|
|
+
|
|
|
class ParseSemverTest(unittest.TestCase):
|
|
|
def run_test(self, version: str, operator: str, expected: SemverFilter):
|
|
|
semver_filter = parse_semver(version, operator)
|