test_group_details.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. from sentry.models import Environment, GroupInboxReason, Release
  2. from sentry.models.groupinbox import add_group_to_inbox, remove_group_from_inbox
  3. from sentry.testutils import APITestCase, SnubaTestCase
  4. from sentry.testutils.helpers.datetime import before_now, iso_format
  5. from sentry.utils.compat import mock
  6. class GroupDetailsTest(APITestCase, SnubaTestCase):
  7. def test_multiple_environments(self):
  8. group = self.create_group()
  9. self.login_as(user=self.user)
  10. environment = Environment.get_or_create(group.project, "production")
  11. environment2 = Environment.get_or_create(group.project, "staging")
  12. url = f"/api/0/issues/{group.id}/"
  13. from sentry.api.endpoints.group_details import tsdb
  14. with mock.patch(
  15. "sentry.api.endpoints.group_details.tsdb.get_range", side_effect=tsdb.get_range
  16. ) as get_range:
  17. response = self.client.get(
  18. f"{url}?environment=production&environment=staging", format="json"
  19. )
  20. assert response.status_code == 200
  21. assert get_range.call_count == 2
  22. for args, kwargs in get_range.call_args_list:
  23. assert kwargs["environment_ids"] == [environment.id, environment2.id]
  24. response = self.client.get(f"{url}?environment=invalid", format="json")
  25. assert response.status_code == 404
  26. def test_with_first_last_release(self):
  27. self.login_as(user=self.user)
  28. first_release = {
  29. "firstEvent": before_now(minutes=3),
  30. "lastEvent": before_now(minutes=2, seconds=30),
  31. }
  32. last_release = {
  33. "firstEvent": before_now(minutes=1, seconds=30),
  34. "lastEvent": before_now(minutes=1),
  35. }
  36. for timestamp in first_release.values():
  37. self.store_event(
  38. data={"release": "1.0", "timestamp": iso_format(timestamp)},
  39. project_id=self.project.id,
  40. )
  41. self.store_event(
  42. data={"release": "1.1", "timestamp": iso_format(before_now(minutes=2))},
  43. project_id=self.project.id,
  44. )
  45. for timestamp in last_release.values():
  46. event = self.store_event(
  47. data={"release": "1.0a", "timestamp": iso_format(timestamp)},
  48. project_id=self.project.id,
  49. )
  50. group = event.group
  51. url = f"/api/0/issues/{group.id}/"
  52. response = self.client.get(url, format="json")
  53. assert response.status_code == 200, response.content
  54. assert response.data["id"] == str(group.id)
  55. release = response.data["firstRelease"]
  56. assert release["version"] == "1.0"
  57. for event, timestamp in first_release.items():
  58. assert release[event].ctime() == timestamp.ctime()
  59. release = response.data["lastRelease"]
  60. assert release["version"] == "1.0a"
  61. for event, timestamp in last_release.items():
  62. assert release[event].ctime() == timestamp.ctime()
  63. def test_first_last_only_one_tagstore(self):
  64. self.login_as(user=self.user)
  65. event = self.store_event(
  66. data={"release": "1.0", "timestamp": iso_format(before_now(days=3))},
  67. project_id=self.project.id,
  68. )
  69. self.store_event(
  70. data={"release": "1.1", "timestamp": iso_format(before_now(minutes=3))},
  71. project_id=self.project.id,
  72. )
  73. group = event.group
  74. url = f"/api/0/issues/{group.id}/"
  75. with mock.patch(
  76. "sentry.api.endpoints.group_details.tagstore.get_release_tags"
  77. ) as get_release_tags:
  78. response = self.client.get(url, format="json")
  79. assert response.status_code == 200
  80. assert get_release_tags.call_count == 1
  81. def test_first_release_only(self):
  82. self.login_as(user=self.user)
  83. first_event = before_now(days=3)
  84. self.store_event(
  85. data={"release": "1.0", "timestamp": iso_format(first_event)},
  86. project_id=self.project.id,
  87. )
  88. event = self.store_event(
  89. data={"release": "1.1", "timestamp": iso_format(before_now(days=1))},
  90. project_id=self.project.id,
  91. )
  92. # Forcibly remove one of the releases
  93. Release.objects.get(version="1.1").delete()
  94. group = event.group
  95. url = f"/api/0/issues/{group.id}/"
  96. response = self.client.get(url, format="json")
  97. assert response.status_code == 200, response.content
  98. assert response.data["firstRelease"]["version"] == "1.0"
  99. # only one event
  100. assert (
  101. response.data["firstRelease"]["firstEvent"]
  102. == response.data["firstRelease"]["lastEvent"]
  103. )
  104. assert response.data["firstRelease"]["firstEvent"].ctime() == first_event.ctime()
  105. assert response.data["lastRelease"] == {"version": "1.1"}
  106. def test_group_expand_inbox(self):
  107. with self.feature("organizations:inbox"):
  108. self.login_as(user=self.user)
  109. event = self.store_event(
  110. data={"timestamp": iso_format(before_now(minutes=3))},
  111. project_id=self.project.id,
  112. )
  113. group = event.group
  114. add_group_to_inbox(group, GroupInboxReason.NEW)
  115. url = f"/api/0/issues/{group.id}/?expand=inbox"
  116. response = self.client.get(url, format="json")
  117. assert response.status_code == 200, response.content
  118. assert response.data["inbox"] is not None
  119. assert response.data["inbox"]["reason"] == GroupInboxReason.NEW.value
  120. assert response.data["inbox"]["reason_details"] is None
  121. remove_group_from_inbox(event.group)
  122. response = self.client.get(url, format="json")
  123. assert response.status_code == 200, response.content
  124. assert response.data["inbox"] is None