test_organization_events_v2.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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"
  8. all_view = "field=title&field=event.type&field=project&field=user&field=timestamp&fieldnames=title&fieldnames=type&fieldnames=project&fieldnames=user&fieldnames=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&fieldnames=error&field=count%28id%29&fieldnames=events&field=count_unique%28user%29&fieldnames=users&field=project&fieldnames=project&field=last_seen&fieldnames=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. self.browser.click_when_visible('[data-test-id="grid-edit-enable"]')
  47. self.browser.snapshot("events-v2 - querybuilder edit state")
  48. self.browser.click_when_visible('[data-test-id="grid-add-column-right-end"]')
  49. self.browser.snapshot("events-v2 - querybuilder edit modal")
  50. @patch("django.utils.timezone.now")
  51. def test_errors(self, mock_now):
  52. mock_now.return_value = before_now().replace(tzinfo=pytz.utc)
  53. min_ago = iso_format(before_now(minutes=1))
  54. self.store_event(
  55. data={
  56. "event_id": "a" * 32,
  57. "message": "oh no",
  58. "timestamp": min_ago,
  59. "fingerprint": ["group-1"],
  60. },
  61. project_id=self.project.id,
  62. assert_no_errors=False,
  63. )
  64. self.store_event(
  65. data={
  66. "event_id": "b" * 32,
  67. "message": "oh no",
  68. "timestamp": min_ago,
  69. "fingerprint": ["group-1"],
  70. },
  71. project_id=self.project.id,
  72. assert_no_errors=False,
  73. )
  74. self.store_event(
  75. data={
  76. "event_id": "c" * 32,
  77. "message": "this is bad.",
  78. "timestamp": min_ago,
  79. "fingerprint": ["group-2"],
  80. },
  81. project_id=self.project.id,
  82. assert_no_errors=False,
  83. )
  84. with self.feature(FEATURE_NAMES):
  85. self.browser.get(self.path + "?" + error_view)
  86. self.wait_until_loaded()
  87. self.browser.snapshot("events-v2 - errors")
  88. @patch("django.utils.timezone.now")
  89. def test_modal_from_all_events(self, mock_now):
  90. mock_now.return_value = before_now().replace(tzinfo=pytz.utc)
  91. min_ago = iso_format(before_now(minutes=1))
  92. event_data = load_data("python")
  93. event_data.update(
  94. {
  95. "event_id": "a" * 32,
  96. "timestamp": min_ago,
  97. "received": min_ago,
  98. "fingerprint": ["group-1"],
  99. }
  100. )
  101. event = self.store_event(
  102. data=event_data, project_id=self.project.id, assert_no_errors=False
  103. )
  104. with self.feature(FEATURE_NAMES):
  105. # Get the list page.
  106. self.browser.get(self.path + "?" + all_view)
  107. self.wait_until_loaded()
  108. # Click the event link to open the modal
  109. self.browser.element('[aria-label="{}"]'.format(event.title)).click()
  110. self.wait_until_loaded()
  111. header = self.browser.element('[data-test-id="modal-dialog"] h2')
  112. assert event_data["message"] in header.text
  113. issue_link = self.browser.element('[data-test-id="linked-issue"]')
  114. issue_event_url_fragment = "/issues/%s/events/%s/" % (event.group_id, event.event_id)
  115. assert issue_event_url_fragment in issue_link.get_attribute("href")
  116. self.browser.snapshot("events-v2 - single error modal")
  117. @patch("django.utils.timezone.now")
  118. def test_modal_from_errors_view(self, mock_now):
  119. mock_now.return_value = before_now().replace(tzinfo=pytz.utc)
  120. event_source = (("a", 1), ("b", 39), ("c", 69))
  121. event_ids = []
  122. event_data = load_data("javascript")
  123. event_data["fingerprint"] = ["group-1"]
  124. for id_prefix, offset in event_source:
  125. event_time = iso_format(before_now(minutes=offset))
  126. event_data.update(
  127. {
  128. "timestamp": event_time,
  129. "received": event_time,
  130. "event_id": id_prefix * 32,
  131. "type": "error",
  132. }
  133. )
  134. event = self.store_event(data=event_data, project_id=self.project.id)
  135. event_ids.append(event.event_id)
  136. with self.feature(FEATURE_NAMES):
  137. # Get the list page
  138. self.browser.get(self.path + "?" + error_view + "&statsPeriod=24h")
  139. self.wait_until_loaded()
  140. # Click the event link to open the modal
  141. self.browser.element('[aria-label="{}"]'.format(event.title)).click()
  142. self.wait_until_loaded()
  143. self.browser.snapshot("events-v2 - grouped error modal")
  144. # Check that the newest event is loaded first and that pagination
  145. # controls display
  146. display_id = self.browser.element('[data-test-id="event-id"]')
  147. assert event_ids[0] in display_id.text
  148. assert self.browser.element_exists_by_test_id("older-event")
  149. assert self.browser.element_exists_by_test_id("newer-event")