|
@@ -0,0 +1,266 @@
|
|
|
+from __future__ import absolute_import
|
|
|
+
|
|
|
+import six
|
|
|
+
|
|
|
+from datetime import timedelta
|
|
|
+from django.utils import timezone
|
|
|
+
|
|
|
+from sentry import options
|
|
|
+from sentry.models import Environment
|
|
|
+from sentry.testutils import APITestCase, SnubaTestCase
|
|
|
+
|
|
|
+
|
|
|
+class GroupEventsTest(APITestCase, SnubaTestCase):
|
|
|
+ """
|
|
|
+ This is more or less an exact copy of the tests under:
|
|
|
+
|
|
|
+ /tests/sentry/api/endpoints/test_group_events.py
|
|
|
+
|
|
|
+ with the removal of any explicit tagstore key/value creation calls, and
|
|
|
+ comparing the resulting events by `eventID`, instead of `id`.
|
|
|
+ """
|
|
|
+
|
|
|
+ def setUp(self):
|
|
|
+ super(GroupEventsTest, self).setUp()
|
|
|
+ self.min_ago = timezone.now() - timedelta(minutes=1)
|
|
|
+ options.set('snuba.events-queries.enabled', True)
|
|
|
+
|
|
|
+ def test_simple(self):
|
|
|
+ self.login_as(user=self.user)
|
|
|
+
|
|
|
+ group = self.create_group()
|
|
|
+ event_1 = self.create_event(
|
|
|
+ event_id='a' * 32,
|
|
|
+ datetime=self.min_ago,
|
|
|
+ group=group
|
|
|
+ )
|
|
|
+ event_2 = self.create_event(
|
|
|
+ event_id='b' * 32,
|
|
|
+ datetime=self.min_ago,
|
|
|
+ group=group
|
|
|
+ )
|
|
|
+
|
|
|
+ url = u'/api/0/issues/{}/events/'.format(group.id)
|
|
|
+ response = self.client.get(url, format='json')
|
|
|
+
|
|
|
+ assert response.status_code == 200, response.content
|
|
|
+ assert len(response.data) == 2
|
|
|
+ assert sorted(map(lambda x: x['eventID'], response.data)) == sorted(
|
|
|
+ [
|
|
|
+ six.text_type(event_1.event_id),
|
|
|
+ six.text_type(event_2.event_id),
|
|
|
+ ]
|
|
|
+ )
|
|
|
+
|
|
|
+ def test_tags(self):
|
|
|
+ self.login_as(user=self.user)
|
|
|
+
|
|
|
+ group = self.create_group()
|
|
|
+ event_1 = self.create_event(
|
|
|
+ event_id='a' * 32,
|
|
|
+ datetime=self.min_ago,
|
|
|
+ group=group,
|
|
|
+ tags={
|
|
|
+ 'foo': 'baz',
|
|
|
+ 'bar': 'buz',
|
|
|
+ }
|
|
|
+ )
|
|
|
+ event_2 = self.create_event(
|
|
|
+ event_id='b' * 32,
|
|
|
+ datetime=self.min_ago,
|
|
|
+ group=group,
|
|
|
+ tags={
|
|
|
+ 'bar': 'biz',
|
|
|
+ }
|
|
|
+ )
|
|
|
+
|
|
|
+ url = u'/api/0/issues/{}/events/'.format(group.id)
|
|
|
+ response = self.client.get(url + '?query=foo:baz', format='json')
|
|
|
+
|
|
|
+ assert response.status_code == 200, response.content
|
|
|
+ assert len(response.data) == 1
|
|
|
+ assert response.data[0]['eventID'] == six.text_type(event_1.event_id)
|
|
|
+
|
|
|
+ response = self.client.get(url + '?query=bar:biz', format='json')
|
|
|
+
|
|
|
+ assert response.status_code == 200, response.content
|
|
|
+ assert len(response.data) == 1
|
|
|
+ assert response.data[0]['eventID'] == six.text_type(event_2.event_id)
|
|
|
+
|
|
|
+ response = self.client.get(url + '?query=bar:biz%20foo:baz', format='json')
|
|
|
+
|
|
|
+ assert response.status_code == 200, response.content
|
|
|
+ assert len(response.data) == 0
|
|
|
+
|
|
|
+ response = self.client.get(url + '?query=bar:buz%20foo:baz', format='json')
|
|
|
+
|
|
|
+ assert response.status_code == 200, response.content
|
|
|
+ assert len(response.data) == 1
|
|
|
+ assert response.data[0]['eventID'] == six.text_type(event_1.event_id)
|
|
|
+
|
|
|
+ response = self.client.get(url + '?query=bar:baz', format='json')
|
|
|
+
|
|
|
+ assert response.status_code == 200, response.content
|
|
|
+ assert len(response.data) == 0
|
|
|
+
|
|
|
+ response = self.client.get(url + '?query=a:b', format='json')
|
|
|
+
|
|
|
+ assert response.status_code == 200, response.content
|
|
|
+ assert len(response.data) == 0
|
|
|
+
|
|
|
+ response = self.client.get(url + '?query=bar:b', format='json')
|
|
|
+
|
|
|
+ assert response.status_code == 200, response.content
|
|
|
+ assert len(response.data) == 0
|
|
|
+
|
|
|
+ response = self.client.get(url + '?query=bar:baz', format='json')
|
|
|
+
|
|
|
+ assert response.status_code == 200, response.content
|
|
|
+ assert len(response.data) == 0
|
|
|
+
|
|
|
+ def test_search_event_by_id(self):
|
|
|
+ self.login_as(user=self.user)
|
|
|
+
|
|
|
+ group = self.create_group()
|
|
|
+ event_1 = self.create_event(
|
|
|
+ event_id='a' * 32,
|
|
|
+ datetime=self.min_ago,
|
|
|
+ group=group
|
|
|
+ )
|
|
|
+ self.create_event(
|
|
|
+ event_id='b' * 32,
|
|
|
+ datetime=self.min_ago,
|
|
|
+ group=group
|
|
|
+ )
|
|
|
+
|
|
|
+ url = u'/api/0/issues/{}/events/?query={}'.format(group.id, event_1.event_id)
|
|
|
+ response = self.client.get(url, format='json')
|
|
|
+
|
|
|
+ assert response.status_code == 200, response.content
|
|
|
+ assert len(response.data) == 1
|
|
|
+ assert response.data[0]['eventID'] == event_1.event_id
|
|
|
+
|
|
|
+ def test_search_event_by_message(self):
|
|
|
+ self.login_as(user=self.user)
|
|
|
+
|
|
|
+ group = self.create_group()
|
|
|
+ event_1 = self.create_event(
|
|
|
+ event_id='a' * 32,
|
|
|
+ datetime=self.min_ago,
|
|
|
+ group=group,
|
|
|
+ message="foo bar hello world"
|
|
|
+ )
|
|
|
+
|
|
|
+ event_2 = self.create_event(
|
|
|
+ event_id='b' * 32,
|
|
|
+ datetime=self.min_ago,
|
|
|
+ group=group,
|
|
|
+ message='this bar hello world '
|
|
|
+ )
|
|
|
+
|
|
|
+ query_1 = "foo"
|
|
|
+ query_2 = "hello+world"
|
|
|
+
|
|
|
+ # Single Word Query
|
|
|
+ url = u'/api/0/issues/{}/events/?query={}'.format(group.id, query_1)
|
|
|
+ response = self.client.get(url, format='json')
|
|
|
+
|
|
|
+ assert response.status_code == 200, response.content
|
|
|
+ assert len(response.data) == 1
|
|
|
+ assert response.data[0]['eventID'] == event_1.event_id
|
|
|
+
|
|
|
+ # Multiple Word Query
|
|
|
+ url = u'/api/0/issues/{}/events/?query={}'.format(group.id, query_2)
|
|
|
+ response = self.client.get(url, format='json')
|
|
|
+
|
|
|
+ assert response.status_code == 200, response.content
|
|
|
+ assert len(response.data) == 2
|
|
|
+ assert sorted(map(lambda x: x['eventID'], response.data)) == sorted(
|
|
|
+ [
|
|
|
+ six.text_type(event_1.event_id),
|
|
|
+ six.text_type(event_2.event_id),
|
|
|
+ ]
|
|
|
+ )
|
|
|
+
|
|
|
+ def test_environment(self):
|
|
|
+ self.login_as(user=self.user)
|
|
|
+
|
|
|
+ group = self.create_group()
|
|
|
+ events = {}
|
|
|
+
|
|
|
+ for name in ['production', 'development']:
|
|
|
+ Environment.get_or_create(group.project, name)
|
|
|
+ events[name] = self.create_event(
|
|
|
+ group=group,
|
|
|
+ datetime=self.min_ago,
|
|
|
+ tags={'environment': name},
|
|
|
+ )
|
|
|
+
|
|
|
+ url = u'/api/0/issues/{}/events/'.format(group.id)
|
|
|
+ response = self.client.get(url + '?environment=production', format='json')
|
|
|
+
|
|
|
+ assert response.status_code == 200, response.content
|
|
|
+ assert set(map(lambda x: x['eventID'], response.data)) == set([
|
|
|
+ six.text_type(events['production'].event_id),
|
|
|
+ ])
|
|
|
+
|
|
|
+ url = u'/api/0/issues/{}/events/'.format(group.id)
|
|
|
+ response = self.client.get(url + '?environment=invalid', format='json')
|
|
|
+
|
|
|
+ assert response.status_code == 200, response.content
|
|
|
+ assert response.data == []
|
|
|
+
|
|
|
+ url = u'/api/0/issues/{}/events/'.format(group.id)
|
|
|
+ response = self.client.get(
|
|
|
+ url + '?environment=production&query=environment:development',
|
|
|
+ format='json')
|
|
|
+
|
|
|
+ assert response.status_code == 200, response.content
|
|
|
+ assert response.data == []
|
|
|
+
|
|
|
+ def test_filters_based_on_retention(self):
|
|
|
+ self.login_as(user=self.user)
|
|
|
+
|
|
|
+ project = self.create_project()
|
|
|
+ group = self.create_group(project=project)
|
|
|
+ self.create_event(
|
|
|
+ event_id='a' * 32,
|
|
|
+ group=group,
|
|
|
+ datetime=timezone.now() - timedelta(days=2),
|
|
|
+ )
|
|
|
+ event_2 = self.create_event(
|
|
|
+ event_id='b' * 32,
|
|
|
+ datetime=self.min_ago,
|
|
|
+ group=group
|
|
|
+ )
|
|
|
+
|
|
|
+ with self.options({'system.event-retention-days': 1}):
|
|
|
+ response = self.client.get(u'/api/0/issues/{}/events/'.format(group.id))
|
|
|
+
|
|
|
+ assert response.status_code == 200, response.content
|
|
|
+ assert len(response.data) == 1
|
|
|
+ assert sorted(map(lambda x: x['eventID'], response.data)) == sorted(
|
|
|
+ [
|
|
|
+ six.text_type(event_2.event_id),
|
|
|
+ ]
|
|
|
+ )
|
|
|
+
|
|
|
+ def test_search_event_has_tags(self):
|
|
|
+ self.login_as(user=self.user)
|
|
|
+
|
|
|
+ group = self.create_group()
|
|
|
+ self.create_event(
|
|
|
+ event_id='a' * 32,
|
|
|
+ datetime=self.min_ago,
|
|
|
+ group=group,
|
|
|
+ message="foo",
|
|
|
+ tags={
|
|
|
+ 'logger': 'python',
|
|
|
+ }
|
|
|
+ )
|
|
|
+
|
|
|
+ response = self.client.get(u'/api/0/issues/{}/events/'.format(group.id))
|
|
|
+
|
|
|
+ assert response.status_code == 200, response.content
|
|
|
+ assert len(response.data) == 1
|
|
|
+ assert response.data[0]['tags']['logger'] == 'python'
|