test_group_details.py 4.8 KB

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