test_discover_saved_query_detail.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. from __future__ import absolute_import
  2. import six
  3. from sentry.testutils import APITestCase, SnubaTestCase
  4. from django.core.urlresolvers import reverse
  5. from sentry.discover.models import DiscoverSavedQuery, DiscoverSavedQueryProject
  6. class DiscoverSavedQueryDetailTest(APITestCase, SnubaTestCase):
  7. feature_name = "organizations:discover"
  8. def setUp(self):
  9. super(DiscoverSavedQueryDetailTest, self).setUp()
  10. self.login_as(user=self.user)
  11. self.org = self.create_organization(owner=self.user)
  12. self.org_without_access = self.create_organization()
  13. self.project_ids = [
  14. self.create_project(organization=self.org).id,
  15. self.create_project(organization=self.org).id,
  16. ]
  17. query = {"fields": ["test"], "conditions": [], "limit": 10}
  18. model = DiscoverSavedQuery.objects.create(
  19. organization=self.org, created_by=self.user, name="Test query", query=query
  20. )
  21. model.set_projects(self.project_ids)
  22. self.query_id = model.id
  23. invalid = DiscoverSavedQuery.objects.create(
  24. organization=self.org_without_access, name="Query without access", query=query
  25. )
  26. invalid.set_projects(self.project_ids)
  27. self.query_id_without_access = invalid.id
  28. def test_get(self):
  29. with self.feature(self.feature_name):
  30. url = reverse(
  31. "sentry-api-0-discover-saved-query-detail", args=[self.org.slug, self.query_id]
  32. )
  33. response = self.client.get(url)
  34. assert response.status_code == 200, response.content
  35. assert response.data["id"] == six.text_type(self.query_id)
  36. assert set(response.data["projects"]) == set(self.project_ids)
  37. assert response.data["fields"] == ["test"]
  38. assert response.data["conditions"] == []
  39. assert response.data["limit"] == 10
  40. def test_get_version(self):
  41. query = {"fields": ["event_id"], "query": "event.type:error", "limit": 10, "version": 2}
  42. model = DiscoverSavedQuery.objects.create(
  43. organization=self.org, created_by=self.user, name="v2 query", query=query
  44. )
  45. model.set_projects(self.project_ids)
  46. with self.feature(self.feature_name):
  47. url = reverse(
  48. "sentry-api-0-discover-saved-query-detail", args=[self.org.slug, model.id]
  49. )
  50. response = self.client.get(url)
  51. assert response.status_code == 200, response.content
  52. assert response.data["id"] == six.text_type(model.id)
  53. assert set(response.data["projects"]) == set(self.project_ids)
  54. assert response.data["fields"] == ["event_id"]
  55. assert response.data["query"] == "event.type:error"
  56. assert response.data["limit"] == 10
  57. assert response.data["version"] == 2
  58. def test_get_org_without_access(self):
  59. with self.feature(self.feature_name):
  60. url = reverse(
  61. "sentry-api-0-discover-saved-query-detail",
  62. args=[self.org_without_access.slug, self.query_id],
  63. )
  64. response = self.client.get(url)
  65. assert response.status_code == 403, response.content
  66. def test_put(self):
  67. with self.feature(self.feature_name):
  68. url = reverse(
  69. "sentry-api-0-discover-saved-query-detail", args=[self.org.slug, self.query_id]
  70. )
  71. response = self.client.put(
  72. url,
  73. {
  74. "name": "New query",
  75. "projects": self.project_ids,
  76. "fields": [],
  77. "range": "24h",
  78. "limit": 20,
  79. "conditions": [],
  80. "aggregations": [],
  81. "orderby": "-time",
  82. },
  83. )
  84. assert response.status_code == 200, response.content
  85. assert response.data["id"] == six.text_type(self.query_id)
  86. assert set(response.data["projects"]) == set(self.project_ids)
  87. assert response.data["fields"] == []
  88. assert response.data["conditions"] == []
  89. assert response.data["limit"] == 20
  90. def test_put_query_without_access(self):
  91. with self.feature(self.feature_name):
  92. url = reverse(
  93. "sentry-api-0-discover-saved-query-detail",
  94. args=[self.org.slug, self.query_id_without_access],
  95. )
  96. response = self.client.put(
  97. url, {"name": "New query", "projects": self.project_ids, "range": "24h"}
  98. )
  99. assert response.status_code == 404
  100. def test_put_org_without_access(self):
  101. with self.feature(self.feature_name):
  102. url = reverse(
  103. "sentry-api-0-discover-saved-query-detail",
  104. args=[self.org_without_access.slug, self.query_id],
  105. )
  106. response = self.client.put(
  107. url, {"name": "New query", "projects": self.project_ids, "range": "24h"}
  108. )
  109. assert response.status_code == 403, response.content
  110. def test_delete(self):
  111. with self.feature(self.feature_name):
  112. url = reverse(
  113. "sentry-api-0-discover-saved-query-detail", args=[self.org.slug, self.query_id]
  114. )
  115. response = self.client.delete(url)
  116. assert response.status_code == 204
  117. assert self.client.get(url).status_code == 404
  118. def test_delete_removes_projects(self):
  119. with self.feature(self.feature_name):
  120. url = reverse(
  121. "sentry-api-0-discover-saved-query-detail", args=[self.org.slug, self.query_id]
  122. )
  123. self.client.delete(url)
  124. projects = list(
  125. DiscoverSavedQueryProject.objects.filter(discover_saved_query=self.query_id)
  126. )
  127. assert projects == []
  128. def test_delete_query_without_access(self):
  129. with self.feature(self.feature_name):
  130. url = reverse(
  131. "sentry-api-0-discover-saved-query-detail",
  132. args=[self.org.slug, self.query_id_without_access],
  133. )
  134. response = self.client.delete(url)
  135. assert response.status_code == 404
  136. def test_delete_org_without_access(self):
  137. with self.feature(self.feature_name):
  138. url = reverse(
  139. "sentry-api-0-discover-saved-query-detail",
  140. args=[self.org_without_access.slug, self.query_id],
  141. )
  142. response = self.client.delete(url)
  143. assert response.status_code == 403, response.content