test_group_events.py 8.7 KB

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