test_organization_events_v2.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. from __future__ import absolute_import
  2. import pytz
  3. from mock import patch
  4. from sentry.testutils import AcceptanceTestCase, SnubaTestCase
  5. from sentry.utils.samples import load_data
  6. from sentry.testutils.helpers.datetime import iso_format, before_now
  7. FEATURE_NAMES = ("organizations:events-v2", "organizations:discover-v2-query-builder")
  8. all_view = "field=title&field=event.type&field=project&field=user&field=timestamp&alias=title&alias=type&alias=project&alias=user&alias=time&name=All+Events&sort=-timestamp&tag=event.type&tag=release&tag=project.name&tag=user.email&tag=user.ip&tag=environment"
  9. error_view = "field=title&alias=error&field=count%28id%29&alias=events&field=count_unique%28user%29&alias=users&field=project&alias=project&field=last_seen&alias=last+seen&name=Errors&query=event.type%3Aerror&sort=-last_seen&sort=-title&tag=error.type&tag=project.name"
  10. class OrganizationEventsV2Test(AcceptanceTestCase, SnubaTestCase):
  11. def setUp(self):
  12. super(OrganizationEventsV2Test, self).setUp()
  13. self.user = self.create_user("foo@example.com")
  14. self.org = self.create_organization(owner=None, name="Rowdy Tiger")
  15. self.team = self.create_team(organization=self.org, name="Mariachi Band")
  16. self.project = self.create_project(organization=self.org, teams=[self.team], name="Bengal")
  17. self.create_member(user=self.user, organization=self.org, role="owner", teams=[self.team])
  18. self.login_as(self.user)
  19. self.path = u"/organizations/{}/eventsv2/".format(self.org.slug)
  20. def wait_until_loaded(self):
  21. self.browser.wait_until_not(".loading-indicator")
  22. self.browser.wait_until_not('[data-test-id="loading-placeholder"]')
  23. def test_all_events_empty(self):
  24. with self.feature(FEATURE_NAMES):
  25. self.browser.get(self.path + "?" + all_view)
  26. self.wait_until_loaded()
  27. self.browser.snapshot("events-v2 - all events empty state")
  28. @patch("django.utils.timezone.now")
  29. def test_all_events(self, mock_now):
  30. mock_now.return_value = before_now().replace(tzinfo=pytz.utc)
  31. min_ago = iso_format(before_now(minutes=1))
  32. self.store_event(
  33. data={
  34. "event_id": "a" * 32,
  35. "message": "oh no",
  36. "timestamp": min_ago,
  37. "fingerprint": ["group-1"],
  38. },
  39. project_id=self.project.id,
  40. assert_no_errors=False,
  41. )
  42. with self.feature(FEATURE_NAMES):
  43. self.browser.get(self.path + "?" + all_view)
  44. self.wait_until_loaded()
  45. self.browser.snapshot("events-v2 - all events")
  46. @patch("django.utils.timezone.now")
  47. def test_errors(self, mock_now):
  48. mock_now.return_value = before_now().replace(tzinfo=pytz.utc)
  49. min_ago = iso_format(before_now(minutes=1))
  50. self.store_event(
  51. data={
  52. "event_id": "a" * 32,
  53. "message": "oh no",
  54. "timestamp": min_ago,
  55. "fingerprint": ["group-1"],
  56. },
  57. project_id=self.project.id,
  58. assert_no_errors=False,
  59. )
  60. self.store_event(
  61. data={
  62. "event_id": "b" * 32,
  63. "message": "oh no",
  64. "timestamp": min_ago,
  65. "fingerprint": ["group-1"],
  66. },
  67. project_id=self.project.id,
  68. assert_no_errors=False,
  69. )
  70. self.store_event(
  71. data={
  72. "event_id": "c" * 32,
  73. "message": "this is bad.",
  74. "timestamp": min_ago,
  75. "fingerprint": ["group-2"],
  76. },
  77. project_id=self.project.id,
  78. assert_no_errors=False,
  79. )
  80. with self.feature(FEATURE_NAMES):
  81. self.browser.get(self.path + "?" + error_view)
  82. self.wait_until_loaded()
  83. self.browser.snapshot("events-v2 - errors")
  84. @patch("django.utils.timezone.now")
  85. def test_modal_from_all_events(self, mock_now):
  86. mock_now.return_value = before_now().replace(tzinfo=pytz.utc)
  87. min_ago = iso_format(before_now(minutes=1))
  88. event_data = load_data("python")
  89. event_data.update(
  90. {
  91. "event_id": "a" * 32,
  92. "timestamp": min_ago,
  93. "received": min_ago,
  94. "fingerprint": ["group-1"],
  95. }
  96. )
  97. event = self.store_event(
  98. data=event_data, project_id=self.project.id, assert_no_errors=False
  99. )
  100. with self.feature(FEATURE_NAMES):
  101. # Get the list page.
  102. self.browser.get(self.path + "?" + all_view)
  103. self.wait_until_loaded()
  104. # Click the event link to open the modal
  105. self.browser.element('[aria-label="{}"]'.format(event.title)).click()
  106. self.wait_until_loaded()
  107. header = self.browser.element('[data-test-id="modal-dialog"] h2')
  108. assert event_data["message"] in header.text
  109. issue_link = self.browser.element('[data-test-id="linked-issue"]')
  110. issue_event_url_fragment = "/issues/%s/events/%s/" % (event.group_id, event.event_id)
  111. assert issue_event_url_fragment in issue_link.get_attribute("href")
  112. self.browser.snapshot("events-v2 - single error modal")
  113. @patch("django.utils.timezone.now")
  114. def test_modal_from_errors_view(self, mock_now):
  115. mock_now.return_value = before_now().replace(tzinfo=pytz.utc)
  116. event_source = (("a", 1), ("b", 39), ("c", 69))
  117. event_ids = []
  118. event_data = load_data("javascript")
  119. event_data["fingerprint"] = ["group-1"]
  120. for id_prefix, offset in event_source:
  121. event_time = iso_format(before_now(minutes=offset))
  122. event_data.update(
  123. {
  124. "timestamp": event_time,
  125. "received": event_time,
  126. "event_id": id_prefix * 32,
  127. "type": "error",
  128. }
  129. )
  130. event = self.store_event(data=event_data, project_id=self.project.id)
  131. event_ids.append(event.event_id)
  132. with self.feature(FEATURE_NAMES):
  133. # Get the list page
  134. self.browser.get(self.path + "?" + error_view + "&statsPeriod=24h")
  135. self.wait_until_loaded()
  136. # Click the event link to open the modal
  137. self.browser.element('[aria-label="{}"]'.format(event.title)).click()
  138. self.wait_until_loaded()
  139. self.browser.snapshot("events-v2 - grouped error modal")
  140. # Check that the newest event is loaded first and that pagination
  141. # controls display
  142. display_id = self.browser.element('[data-test-id="event-id"]')
  143. assert event_ids[0] in display_id.text
  144. assert self.browser.element_exists_by_test_id("older-event")
  145. assert self.browser.element_exists_by_test_id("newer-event")