test_issue_details.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. from __future__ import absolute_import
  2. import json
  3. from datetime import datetime
  4. from django.conf import settings
  5. from django.utils import timezone
  6. from sentry.testutils import AcceptanceTestCase, SnubaTestCase
  7. from sentry.utils.samples import load_data
  8. class IssueDetailsTest(AcceptanceTestCase, SnubaTestCase):
  9. def setUp(self):
  10. super(IssueDetailsTest, self).setUp()
  11. self.user = self.create_user('foo@example.com')
  12. self.org = self.create_organization(owner=self.user, name='Rowdy Tiger')
  13. self.team = self.create_team(organization=self.org, name='Mariachi Band')
  14. self.project = self.create_project(
  15. organization=self.org,
  16. teams=[self.team],
  17. name='Bengal',
  18. )
  19. self.login_as(self.user)
  20. self.dismiss_assistant()
  21. def create_sample_event(self, platform, default=None, sample_name=None):
  22. event_data = load_data(platform, default=default, sample_name=sample_name)
  23. event_data['event_id'] = 'd964fdbd649a4cf8bfc35d18082b6b0e'
  24. event = self.store_event(
  25. data=event_data,
  26. project_id=self.project.id,
  27. assert_no_errors=False,
  28. )
  29. event.datetime = datetime(2017, 9, 6, 0, 0)
  30. event.save()
  31. event.group.update(
  32. first_seen=datetime(2015, 8, 13, 3, 8, 25, tzinfo=timezone.utc),
  33. last_seen=datetime(2016, 1, 13, 3, 8, 25, tzinfo=timezone.utc),
  34. )
  35. return event
  36. def test_python_event(self):
  37. event = self.create_sample_event(
  38. platform='python',
  39. )
  40. self.browser.get(
  41. u'/{}/{}/issues/{}/'.format(self.org.slug, self.project.slug, event.group.id)
  42. )
  43. self.wait_until_loaded()
  44. self.browser.snapshot('issue details python')
  45. def test_cocoa_event(self):
  46. event = self.create_sample_event(
  47. platform='cocoa',
  48. )
  49. self.browser.get(
  50. u'/{}/{}/issues/{}/'.format(self.org.slug, self.project.slug, event.group.id)
  51. )
  52. self.wait_until_loaded()
  53. self.browser.snapshot('issue details cocoa')
  54. def test_unity_event(self):
  55. event = self.create_sample_event(
  56. default='unity',
  57. platform='csharp'
  58. )
  59. self.browser.get(
  60. u'/{}/{}/issues/{}/'.format(self.org.slug, self.project.slug, event.group.id)
  61. )
  62. self.wait_until_loaded()
  63. self.browser.snapshot('issue details unity')
  64. def test_aspnetcore_event(self):
  65. event = self.create_sample_event(
  66. default='aspnetcore',
  67. platform='csharp'
  68. )
  69. self.browser.get(
  70. u'/{}/{}/issues/{}/'.format(self.org.slug, self.project.slug, event.group.id)
  71. )
  72. self.wait_until_loaded()
  73. self.browser.snapshot('issue details aspnetcore')
  74. def test_javascript_specific_event(self):
  75. event = self.create_sample_event(
  76. platform='javascript'
  77. )
  78. self.dismiss_assistant()
  79. self.browser.get(
  80. u'/{}/{}/issues/{}/events/{}/'.format(self.org.slug,
  81. self.project.slug, event.group.id, event.id)
  82. )
  83. self.wait_until_loaded()
  84. self.browser.snapshot('issue details javascript - event details')
  85. self.browser.find_element_by_xpath("//a//code[contains(text(), 'curl')]").click()
  86. self.browser.snapshot('issue details javascript - event details - curl command')
  87. def test_rust_event(self):
  88. # TODO: This should become its own "rust" platform type
  89. event = self.create_sample_event(
  90. platform='native',
  91. sample_name='Rust',
  92. )
  93. self.browser.get(
  94. u'/{}/{}/issues/{}/'.format(self.org.slug, self.project.slug, event.group.id)
  95. )
  96. self.wait_until_loaded()
  97. self.browser.snapshot('issue details rust')
  98. def test_cordova_event(self):
  99. event = self.create_sample_event(
  100. platform='cordova'
  101. )
  102. self.dismiss_assistant()
  103. self.browser.get(
  104. u'/{}/{}/issues/{}/'.format(self.org.slug, self.project.slug, event.group.id)
  105. )
  106. self.wait_until_loaded()
  107. self.browser.snapshot('issue details cordova')
  108. def test_stripped_event(self):
  109. event = self.create_sample_event(
  110. platform='pii'
  111. )
  112. self.browser.get(
  113. u'/{}/{}/issues/{}/'.format(self.org.slug, self.project.slug, event.group.id)
  114. )
  115. self.wait_until_loaded()
  116. self.browser.snapshot('issue details pii stripped')
  117. def test_empty_exception(self):
  118. event = self.create_sample_event(
  119. platform='empty-exception'
  120. )
  121. self.browser.get(
  122. u'/{}/{}/issues/{}/'.format(self.org.slug, self.project.slug, event.group.id)
  123. )
  124. self.wait_until_loaded()
  125. self.browser.snapshot('issue details empty exception')
  126. def test_empty_stacktrace(self):
  127. event = self.create_sample_event(
  128. platform='empty-stacktrace'
  129. )
  130. self.browser.get(
  131. u'/{}/{}/issues/{}/'.format(self.org.slug, self.project.slug, event.group.id)
  132. )
  133. self.wait_until_loaded()
  134. self.browser.snapshot('issue details empty stacktrace')
  135. def test_invalid_interfaces(self):
  136. event = self.create_sample_event(
  137. platform='invalid-interfaces'
  138. )
  139. self.browser.get(
  140. u'/{}/{}/issues/{}/'.format(self.org.slug, self.project.slug, event.group.id)
  141. )
  142. self.wait_until_loaded()
  143. self.browser.click('.errors-toggle')
  144. self.browser.wait_until('.entries > .errors ul')
  145. self.browser.snapshot('issue details invalid interfaces')
  146. def test_activity_page(self):
  147. event = self.create_sample_event(
  148. platform='python',
  149. )
  150. self.browser.get(
  151. u'/{}/{}/issues/{}/activity/'.format(
  152. self.org.slug, self.project.slug, event.group.id)
  153. )
  154. self.browser.wait_until('.activity-item')
  155. self.browser.snapshot('issue activity python')
  156. def wait_until_loaded(self):
  157. self.browser.wait_until_not('.loading-indicator')
  158. self.browser.wait_until('.entries')
  159. self.browser.wait_until_test_id('linked-issues')
  160. self.browser.wait_until_test_id('loaded-device-name')
  161. def dismiss_assistant(self):
  162. # Forward session cookie to django client.
  163. self.client.cookies[settings.SESSION_COOKIE_NAME] = self.session.session_key
  164. res = self.client.put(
  165. '/api/0/assistant/',
  166. content_type='application/json',
  167. data=json.dumps({'guide_id': 1, 'status': 'viewed', 'useful': True}))
  168. assert res.status_code == 201
  169. res = self.client.put(
  170. '/api/0/assistant/',
  171. content_type='application/json',
  172. data=json.dumps({'guide_id': 3, 'status': 'viewed', 'useful': True}))
  173. assert res.status_code == 201