test_group_events.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. from __future__ import absolute_import
  2. import six
  3. from datetime import timedelta
  4. from django.utils import timezone
  5. from sentry import options
  6. from sentry.models import Environment
  7. from sentry.testutils import APITestCase, SnubaTestCase
  8. class GroupEventsTest(APITestCase, SnubaTestCase):
  9. """
  10. This is more or less an exact copy of the tests under:
  11. /tests/sentry/api/endpoints/test_group_events.py
  12. with the removal of any explicit tagstore key/value creation calls, and
  13. comparing the resulting events by `eventID`, instead of `id`.
  14. """
  15. def setUp(self):
  16. super(GroupEventsTest, self).setUp()
  17. self.min_ago = timezone.now() - timedelta(minutes=1)
  18. options.set('snuba.events-queries.enabled', True)
  19. def test_simple(self):
  20. self.login_as(user=self.user)
  21. group = self.create_group()
  22. event_1 = self.create_event(
  23. event_id='a' * 32,
  24. datetime=self.min_ago,
  25. group=group
  26. )
  27. event_2 = self.create_event(
  28. event_id='b' * 32,
  29. datetime=self.min_ago,
  30. group=group
  31. )
  32. url = u'/api/0/issues/{}/events/'.format(group.id)
  33. response = self.client.get(url, format='json')
  34. assert response.status_code == 200, response.content
  35. assert len(response.data) == 2
  36. assert sorted(map(lambda x: x['eventID'], response.data)) == sorted(
  37. [
  38. six.text_type(event_1.event_id),
  39. six.text_type(event_2.event_id),
  40. ]
  41. )
  42. def test_tags(self):
  43. self.login_as(user=self.user)
  44. group = self.create_group()
  45. event_1 = self.create_event(
  46. event_id='a' * 32,
  47. datetime=self.min_ago,
  48. group=group,
  49. tags={
  50. 'foo': 'baz',
  51. 'bar': 'buz',
  52. }
  53. )
  54. event_2 = self.create_event(
  55. event_id='b' * 32,
  56. datetime=self.min_ago,
  57. group=group,
  58. tags={
  59. 'bar': 'biz',
  60. }
  61. )
  62. url = u'/api/0/issues/{}/events/'.format(group.id)
  63. response = self.client.get(url + '?query=foo:baz', format='json')
  64. assert response.status_code == 200, response.content
  65. assert len(response.data) == 1
  66. assert response.data[0]['eventID'] == six.text_type(event_1.event_id)
  67. response = self.client.get(url + '?query=bar:biz', format='json')
  68. assert response.status_code == 200, response.content
  69. assert len(response.data) == 1
  70. assert response.data[0]['eventID'] == six.text_type(event_2.event_id)
  71. response = self.client.get(url + '?query=bar:biz%20foo:baz', format='json')
  72. assert response.status_code == 200, response.content
  73. assert len(response.data) == 0
  74. response = self.client.get(url + '?query=bar:buz%20foo:baz', format='json')
  75. assert response.status_code == 200, response.content
  76. assert len(response.data) == 1
  77. assert response.data[0]['eventID'] == six.text_type(event_1.event_id)
  78. response = self.client.get(url + '?query=bar:baz', format='json')
  79. assert response.status_code == 200, response.content
  80. assert len(response.data) == 0
  81. response = self.client.get(url + '?query=a:b', format='json')
  82. assert response.status_code == 200, response.content
  83. assert len(response.data) == 0
  84. response = self.client.get(url + '?query=bar:b', format='json')
  85. assert response.status_code == 200, response.content
  86. assert len(response.data) == 0
  87. response = self.client.get(url + '?query=bar:baz', format='json')
  88. assert response.status_code == 200, response.content
  89. assert len(response.data) == 0
  90. def test_search_event_by_id(self):
  91. self.login_as(user=self.user)
  92. group = self.create_group()
  93. event_1 = self.create_event(
  94. event_id='a' * 32,
  95. datetime=self.min_ago,
  96. group=group
  97. )
  98. self.create_event(
  99. event_id='b' * 32,
  100. datetime=self.min_ago,
  101. group=group
  102. )
  103. url = u'/api/0/issues/{}/events/?query={}'.format(group.id, event_1.event_id)
  104. response = self.client.get(url, format='json')
  105. assert response.status_code == 200, response.content
  106. assert len(response.data) == 1
  107. assert response.data[0]['eventID'] == event_1.event_id
  108. def test_search_event_by_message(self):
  109. self.login_as(user=self.user)
  110. group = self.create_group()
  111. event_1 = self.create_event(
  112. event_id='a' * 32,
  113. datetime=self.min_ago,
  114. group=group,
  115. message="foo bar hello world"
  116. )
  117. event_2 = self.create_event(
  118. event_id='b' * 32,
  119. datetime=self.min_ago,
  120. group=group,
  121. message='this bar hello world '
  122. )
  123. query_1 = "foo"
  124. query_2 = "hello+world"
  125. # Single Word Query
  126. url = u'/api/0/issues/{}/events/?query={}'.format(group.id, query_1)
  127. response = self.client.get(url, format='json')
  128. assert response.status_code == 200, response.content
  129. assert len(response.data) == 1
  130. assert response.data[0]['eventID'] == event_1.event_id
  131. # Multiple Word Query
  132. url = u'/api/0/issues/{}/events/?query={}'.format(group.id, query_2)
  133. response = self.client.get(url, format='json')
  134. assert response.status_code == 200, response.content
  135. assert len(response.data) == 2
  136. assert sorted(map(lambda x: x['eventID'], response.data)) == sorted(
  137. [
  138. six.text_type(event_1.event_id),
  139. six.text_type(event_2.event_id),
  140. ]
  141. )
  142. def test_environment(self):
  143. self.login_as(user=self.user)
  144. group = self.create_group()
  145. events = {}
  146. for name in ['production', 'development']:
  147. Environment.get_or_create(group.project, name)
  148. events[name] = self.create_event(
  149. group=group,
  150. datetime=self.min_ago,
  151. tags={'environment': name},
  152. )
  153. url = u'/api/0/issues/{}/events/'.format(group.id)
  154. response = self.client.get(url + '?environment=production', format='json')
  155. assert response.status_code == 200, response.content
  156. assert set(map(lambda x: x['eventID'], response.data)) == set([
  157. six.text_type(events['production'].event_id),
  158. ])
  159. url = u'/api/0/issues/{}/events/'.format(group.id)
  160. response = self.client.get(url + '?environment=invalid', format='json')
  161. assert response.status_code == 200, response.content
  162. assert response.data == []
  163. url = u'/api/0/issues/{}/events/'.format(group.id)
  164. response = self.client.get(
  165. url + '?environment=production&query=environment:development',
  166. format='json')
  167. assert response.status_code == 200, response.content
  168. assert response.data == []
  169. def test_filters_based_on_retention(self):
  170. self.login_as(user=self.user)
  171. project = self.create_project()
  172. group = self.create_group(project=project)
  173. self.create_event(
  174. event_id='a' * 32,
  175. group=group,
  176. datetime=timezone.now() - timedelta(days=2),
  177. )
  178. event_2 = self.create_event(
  179. event_id='b' * 32,
  180. datetime=self.min_ago,
  181. group=group
  182. )
  183. with self.options({'system.event-retention-days': 1}):
  184. response = self.client.get(u'/api/0/issues/{}/events/'.format(group.id))
  185. assert response.status_code == 200, response.content
  186. assert len(response.data) == 1
  187. assert sorted(map(lambda x: x['eventID'], response.data)) == sorted(
  188. [
  189. six.text_type(event_2.event_id),
  190. ]
  191. )
  192. def test_search_event_has_tags(self):
  193. self.login_as(user=self.user)
  194. group = self.create_group()
  195. self.create_event(
  196. event_id='a' * 32,
  197. datetime=self.min_ago,
  198. group=group,
  199. message="foo",
  200. tags={
  201. 'logger': 'python',
  202. }
  203. )
  204. response = self.client.get(u'/api/0/issues/{}/events/'.format(group.id))
  205. assert response.status_code == 200, response.content
  206. assert len(response.data) == 1
  207. assert response.data[0]['tags']['logger'] == 'python'