Browse Source

fix(api): Actually check for feature flag on service hook API

Matt Robenolt 6 years ago
parent
commit
83b4746fc6

+ 12 - 0
src/sentry/api/endpoints/project_servicehooks.py

@@ -51,6 +51,12 @@ class ProjectServiceHooksEndpoint(ProjectEndpoint):
         :pparam string project_slug: the slug of the project the client keys
                                      belong to.
         """
+        if not self.has_feature(request, project):
+            return self.respond({
+                'error_type': 'unavailable_feature',
+                'detail': ['You do not have that feature enabled']
+            }, status=403)
+
         queryset = ServiceHook.objects.filter(
             project_id=project.id,
         )
@@ -96,6 +102,12 @@ class ProjectServiceHooksEndpoint(ProjectEndpoint):
         if not request.user.is_authenticated():
             return self.respond(status=401)
 
+        if not self.has_feature(request, project):
+            return self.respond({
+                'error_type': 'unavailable_feature',
+                'detail': ['You do not have that feature enabled']
+            }, status=403)
+
         validator = ServiceHookValidator(data=request.DATA)
         if not validator.is_valid():
             return self.respond(validator.errors, status=status.HTTP_400_BAD_REQUEST)

+ 1 - 0
src/sentry/conf/server.py

@@ -772,6 +772,7 @@ SENTRY_FEATURES = {
     'projects:discard-groups': False,
     'projects:custom-inbound-filters': False,
     'projects:minidump': True,
+    'projects:servicehooks': False,
 }
 
 # Default time zone for localization in the UI.

+ 33 - 32
tests/acceptance/test_project_servicehooks.py

@@ -30,39 +30,40 @@ class ProjectServiceHooksTest(AcceptanceTestCase):
         self.new_hook_path = '/settings/{}/{}/hooks/new/'.format(self.org.slug, self.project.slug)
 
     def test_simple(self):
-        self.browser.get(self.list_hooks_path)
-        self.browser.wait_until_not('.loading-indicator')
-        self.browser.wait_until('.ref-project-service-hooks')
-        self.browser.snapshot('project settings - service hooks - empty list')
-        # click "New"
-        self.browser.click('[data-test-id="new-service-hook"]')
+        with self.feature('projects:servicehooks'):
+            self.browser.get(self.list_hooks_path)
+            self.browser.wait_until_not('.loading-indicator')
+            self.browser.wait_until('.ref-project-service-hooks')
+            self.browser.snapshot('project settings - service hooks - empty list')
+            # click "New"
+            self.browser.click('[data-test-id="new-service-hook"]')
 
-        self.browser.wait_until_not('.loading-indicator')
-        assert self.browser.current_url == '{}{}'.format(
-            self.browser.live_server_url,
-            self.new_hook_path,
-        )
-        self.browser.snapshot('project settings - service hooks - create')
-        self.browser.element('input[name="url"]').send_keys('https://example.com/hook')
-        # click "Save Changes"
-        self.browser.click('.ref-project-create-service-hook [data-test-id="form-submit"]')
+            self.browser.wait_until_not('.loading-indicator')
+            assert self.browser.current_url == '{}{}'.format(
+                self.browser.live_server_url,
+                self.new_hook_path,
+            )
+            self.browser.snapshot('project settings - service hooks - create')
+            self.browser.element('input[name="url"]').send_keys('https://example.com/hook')
+            # click "Save Changes"
+            self.browser.click('.ref-project-create-service-hook [data-test-id="form-submit"]')
 
-        self.browser.wait_until_not('.loading-indicator')
-        assert self.browser.current_url == '{}{}'.format(
-            self.browser.live_server_url,
-            self.list_hooks_path,
-        )
-        self.browser.snapshot('project settings - service hooks - list with entries')
+            self.browser.wait_until_not('.loading-indicator')
+            assert self.browser.current_url == '{}{}'.format(
+                self.browser.live_server_url,
+                self.list_hooks_path,
+            )
+            self.browser.snapshot('project settings - service hooks - list with entries')
 
-        hook = ServiceHook.objects.get(project_id=self.project.id)
-        assert hook.url == 'https://example.com/hook'
-        assert not hook.events
+            hook = ServiceHook.objects.get(project_id=self.project.id)
+            assert hook.url == 'https://example.com/hook'
+            assert not hook.events
 
-        # hopefully click the first service hook
-        self.browser.click('.ref-project-service-hooks label a')
-        self.browser.wait_until_not('.loading-indicator')
-        assert self.browser.current_url == '{}{}'.format(
-            self.browser.live_server_url,
-            '/settings/{}/{}/hooks/{}/'.format(self.org.slug, self.project.slug, hook.guid),
-        )
-        self.browser.snapshot('project settings - service hooks - details')
+            # hopefully click the first service hook
+            self.browser.click('.ref-project-service-hooks label a')
+            self.browser.wait_until_not('.loading-indicator')
+            assert self.browser.current_url == '{}{}'.format(
+                self.browser.live_server_url,
+                '/settings/{}/{}/hooks/{}/'.format(self.org.slug, self.project.slug, hook.guid),
+            )
+            self.browser.snapshot('project settings - service hooks - details')

+ 9 - 7
tests/sentry/api/endpoints/test_project_servicehooks.py

@@ -17,7 +17,8 @@ class ListProjectServiceHooksTest(APITestCase):
             project.organization.slug,
             project.slug,
         )
-        response = self.client.get(url)
+        with self.feature('projects:servicehooks'):
+            response = self.client.get(url)
         assert response.status_code == 200
         assert len(response.data) == 1
         assert response.data[0]['id'] == hook.guid
@@ -34,12 +35,13 @@ class CreateProjectServiceHookTest(APITestCase):
         )
 
     def test_simple(self):
-        resp = self.client.post(
-            self.path, data={
-                'url': 'http://example.com',
-                'events': ['event.alert', 'event.created'],
-            }
-        )
+        with self.feature('projects:servicehooks'):
+            resp = self.client.post(
+                self.path, data={
+                    'url': 'http://example.com',
+                    'events': ['event.alert', 'event.created'],
+                }
+            )
         assert resp.status_code == 201, resp.content
         hook = ServiceHook.objects.get(guid=resp.data['id'])
         assert hook.url == 'http://example.com'