test_organization_health.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. from __future__ import absolute_import
  2. from six.moves.urllib.parse import urlencode
  3. from datetime import timedelta
  4. from django.utils import timezone
  5. from django.core.urlresolvers import reverse
  6. from sentry.testutils import APITestCase, SnubaTestCase
  7. class OrganizationHealthTest(APITestCase, SnubaTestCase):
  8. def setUp(self):
  9. super(OrganizationHealthTest, self).setUp()
  10. self.min_ago = timezone.now() - timedelta(minutes=1)
  11. self.day_ago = timezone.now() - timedelta(days=1)
  12. def test_time_range(self):
  13. self.login_as(user=self.user)
  14. project = self.create_project()
  15. project2 = self.create_project()
  16. group = self.create_group(project=project)
  17. group2 = self.create_group(project=project2)
  18. self.create_event('a' * 32, group=group, datetime=self.min_ago,
  19. tags=[('sentry:user', 'id:%s' % (self.user.id,))])
  20. self.create_event('b' * 32, group=group2, datetime=self.day_ago,
  21. tags=[('sentry:user', 'id:%s' % (self.user.id,))])
  22. now = timezone.now()
  23. base_url = reverse(
  24. 'sentry-api-0-organization-health-graph',
  25. kwargs={
  26. 'organization_slug': project.organization.slug,
  27. }
  28. )
  29. # test swapped order of start/end
  30. url = '%s?%s' % (base_url, urlencode({
  31. 'end': (now - timedelta(hours=2)).strftime('%Y-%m-%dT%H:%M:%S'),
  32. 'start': now.strftime('%Y-%m-%dT%H:%M:%S'),
  33. 'tag': 'user',
  34. }))
  35. response = self.client.get(url, format='json')
  36. assert response.status_code == 400
  37. url = '%s?%s' % (base_url, urlencode({
  38. 'start': (now - timedelta(hours=2)).strftime('%Y-%m-%dT%H:%M:%S'),
  39. 'end': now.strftime('%Y-%m-%dT%H:%M:%S'),
  40. 'tag': 'user',
  41. }))
  42. response = self.client.get(url, format='json')
  43. assert response.status_code == 200, response.content
  44. assert response.data['totals']['count'] == 1
  45. def test_environments(self):
  46. user = self.create_user()
  47. org = self.create_organization()
  48. team = self.create_team(organization=org)
  49. self.create_member(organization=org, user=user, teams=[team])
  50. self.login_as(user=user)
  51. project = self.create_project(organization=org, teams=[team])
  52. environment = self.create_environment(project=project, name='production')
  53. environment2 = self.create_environment(project=project)
  54. environment3 = self.create_environment(project=project)
  55. no_env = self.create_environment(project=project, name='')
  56. group = self.create_group(project=project)
  57. self.create_event(
  58. 'a' * 32,
  59. group=group,
  60. datetime=self.min_ago,
  61. tags={
  62. 'environment': environment.name,
  63. 'sentry:user': 'id:%s' % (self.user.id,),
  64. },
  65. )
  66. self.create_event(
  67. 'b' * 32,
  68. group=group,
  69. datetime=self.min_ago,
  70. tags={
  71. 'environment': environment2.name,
  72. 'sentry:user': 'id:%s' % (self.user.id,),
  73. },
  74. )
  75. self.create_event(
  76. 'c' * 32,
  77. group=group,
  78. datetime=self.min_ago,
  79. tags={
  80. 'environment': environment3.name,
  81. 'sentry:user': 'id:%s' % (self.user.id,),
  82. },
  83. )
  84. self.create_event(
  85. 'd' * 32,
  86. group=group,
  87. datetime=self.min_ago,
  88. tags={
  89. 'environment': '',
  90. 'sentry:user': 'id:%s' % (self.user.id,),
  91. },
  92. )
  93. base_url = reverse(
  94. 'sentry-api-0-organization-health-graph',
  95. kwargs={
  96. 'organization_slug': org.slug,
  97. }
  98. )
  99. now = timezone.now()
  100. # test multiple environments
  101. url = '%s?%s' % (base_url, urlencode((
  102. ('start', (now - timedelta(hours=2)).strftime('%Y-%m-%dT%H:%M:%S')),
  103. ('end', now.strftime('%Y-%m-%dT%H:%M:%S')),
  104. ('tag', 'user'),
  105. ('environment', environment2.name),
  106. ('environment', environment.name),
  107. )))
  108. response = self.client.get(url, format='json')
  109. assert response.status_code == 200, response.content
  110. assert response.data['totals']['count'] == 2
  111. # test 'no environment' environment
  112. url = '%s?%s' % (base_url, urlencode((
  113. ('start', (now - timedelta(hours=2)).strftime('%Y-%m-%dT%H:%M:%S')),
  114. ('end', now.strftime('%Y-%m-%dT%H:%M:%S')),
  115. ('tag', 'user'),
  116. ('environment', no_env.name),
  117. )))
  118. response = self.client.get(url, format='json')
  119. assert response.status_code == 200, response.content
  120. assert response.data['totals']['count'] == 1
  121. # test 'no environment' environment with named envs
  122. url = '%s?%s' % (base_url, urlencode((
  123. ('start', (now - timedelta(hours=2)).strftime('%Y-%m-%dT%H:%M:%S')),
  124. ('end', now.strftime('%Y-%m-%dT%H:%M:%S')),
  125. ('tag', 'user'),
  126. ('environment', no_env.name),
  127. ('environment', environment.name),
  128. )))
  129. response = self.client.get(url, format='json')
  130. assert response.status_code == 200, response.content
  131. assert response.data['totals']['count'] == 2
  132. # test nonexistent environment
  133. url = '%s?environment=notanenvironment&tag=user' % (base_url,)
  134. response = self.client.get(url, format='json')
  135. assert response.status_code == 404