from django.urls import reverse from sentry.api.serializers import serialize from sentry.discover.models import DiscoverSavedQuery from tests.snuba.api.endpoints.test_discover_saved_queries import DiscoverSavedQueryBase FEATURES = ("organizations:discover-query",) class DiscoverHomepageQueryTest(DiscoverSavedQueryBase): def setUp(self): super().setUp() self.url = reverse("sentry-api-0-discover-homepage-query", args=[self.org.slug]) self.query = {"fields": ["test"], "conditions": [], "limit": 10} self.project_ids = [ self.create_project(organization=self.org).id, self.create_project(organization=self.org).id, ] def test_returns_no_response_if_no_homepage_query_for_user(self): with self.feature(FEATURES): response = self.client.get(self.url) assert response.status_code == 204, response.content assert response.data is None def test_returns_serialized_saved_query_if_homepage_is_set(self): saved_query = DiscoverSavedQuery.objects.create( organization=self.org, created_by_id=self.user.id, name="Test query", query=self.query, is_homepage=True, ) with self.feature(FEATURES): response = self.client.get(self.url) assert response.status_code == 200, response.content assert response.data == serialize(saved_query) def test_put_updates_existing_homepage_query_to_reflect_new_data(self): saved_query = DiscoverSavedQuery.objects.create( organization=self.org, created_by_id=self.user.id, name="Test query", query=self.query, is_homepage=True, ) with self.feature(FEATURES): response = self.client.put( self.url, { "name": "A new homepage query update", "projects": self.project_ids, "fields": ["field1", "field2"], }, ) assert response.status_code == 200, response.content saved_query.refresh_from_db() assert response.data == serialize(saved_query) assert saved_query.query["fields"] == ["field1", "field2"] assert set(saved_query.projects.values_list("id", flat=True)) == set(self.project_ids) def test_put_creates_new_discover_saved_query_if_none_exists(self): homepage_query_payload = { "version": 2, "name": "New Homepage Query", "projects": self.project_ids, "environment": ["alpha"], "fields": ["environment", "platform.name"], "orderby": "-timestamp", "range": None, } with self.feature(FEATURES): response = self.client.put(self.url, data=homepage_query_payload) assert response.status_code == 201, response.content new_query = DiscoverSavedQuery.objects.get( created_by_id=self.user.id, organization=self.org, is_homepage=True ) assert response.data == serialize(new_query) assert new_query.query["fields"] == homepage_query_payload["fields"] assert new_query.query["environment"] == homepage_query_payload["environment"] assert set(new_query.projects.values_list("id", flat=True)) == set(self.project_ids) def test_put_responds_with_saved_empty_name_field(self): homepage_query_payload = { "version": 2, "name": "New Homepage Query", "projects": self.project_ids, "environment": ["alpha"], "fields": ["environment", "platform.name"], "orderby": "-timestamp", "range": None, } with self.feature(FEATURES): response = self.client.put(self.url, data=homepage_query_payload) assert response.status_code == 201, response.content new_query = DiscoverSavedQuery.objects.get( created_by_id=self.user.id, organization=self.org, is_homepage=True ) assert new_query.name == "" assert response.data["name"] == "" def test_put_with_no_name(self): homepage_query_payload = { "version": 2, "name": "", "projects": self.project_ids, "environment": ["alpha"], "fields": ["environment", "platform.name"], "orderby": "-timestamp", "range": None, } with self.feature(FEATURES): response = self.client.put(self.url, data=homepage_query_payload) assert response.status_code == 201, response.content new_query = DiscoverSavedQuery.objects.get( created_by_id=self.user.id, organization=self.org, is_homepage=True ) assert new_query.name == "" assert response.data["name"] == "" def test_post_not_allowed(self): homepage_query_payload = { "version": 2, "name": "New Homepage Query", "projects": ["-1"], "environment": ["alpha"], "fields": ["environment", "platform.name"], "orderby": "-timestamp", "range": None, } with self.feature(FEATURES): response = self.client.post(self.url, data=homepage_query_payload) assert response.status_code == 405, response.content def test_delete_resets_saved_query(self): DiscoverSavedQuery.objects.create( organization=self.org, created_by_id=self.user.id, name="Test query", query=self.query, is_homepage=True, ) with self.feature(FEATURES): response = self.client.delete(self.url) assert response.status_code == 204 assert not DiscoverSavedQuery.objects.filter( created_by_id=self.user.id, organization=self.org, is_homepage=True ).exists()