Files
2024-02-15 17:01:50 +00:00

208 lines
7.6 KiB
Python

import unittest
from unittest.mock import Mock, patch
import pytest
from django.http import Http404
from django.test.utils import override_settings
from sentry.api.bases.sentryapps import (
SentryAppBaseEndpoint,
SentryAppInstallationBaseEndpoint,
SentryAppInstallationPermission,
SentryAppPermission,
add_integration_platform_metric_tag,
)
from sentry.testutils.cases import TestCase
from sentry.testutils.helpers.features import with_feature
from sentry.testutils.silo import control_silo_test
@control_silo_test
class SentryAppPermissionTest(TestCase):
def setUp(self):
self.permission = SentryAppPermission()
self.user = self.create_user()
self.org = self.create_organization(owner=self.user)
self.sentry_app = self.create_sentry_app(name="foo", organization=self.org)
self.request = self.make_request(user=self.user, method="GET")
self.superuser = self.create_user(is_superuser=True)
def test_request_user_is_app_owner_succeeds(self):
assert self.permission.has_object_permission(self.request, None, self.sentry_app)
def test_request_user_is_not_app_owner_fails(self):
self.request.user = self.create_user()
with pytest.raises(Http404):
self.permission.has_object_permission(self.request, None, self.sentry_app)
def test_has_permission(self):
from sentry.models.apitoken import ApiToken
token = ApiToken.objects.create(user=self.user, scope_list=["event:read", "org:read"])
self.request = self.make_request(user=None, auth=token, method="GET")
assert self.permission.has_permission(self.request, None)
def test_superuser_has_permission(self):
request = self.make_request(user=self.superuser, method="GET", is_superuser=True)
assert self.permission.has_object_permission(request, None, self.sentry_app)
request.method = "POST"
assert self.permission.has_object_permission(request, None, self.sentry_app)
@with_feature("auth:enterprise-superuser-read-write")
@override_settings(SENTRY_SELF_HOSTED=False)
def test_superuser_has_permission_read_only(self):
request = self.make_request(user=self.superuser, method="GET", is_superuser=True)
assert self.permission.has_object_permission(request, None, self.sentry_app)
request.method = "POST"
with pytest.raises(Http404):
self.permission.has_object_permission(request, None, self.sentry_app)
@with_feature("auth:enterprise-superuser-read-write")
@override_settings(SENTRY_SELF_HOSTED=False)
def test_superuser_has_permission_write(self):
self.add_user_permission(self.superuser, "superuser.write")
request = self.make_request(user=self.superuser, method="GET", is_superuser=True)
assert self.permission.has_object_permission(request, None, self.sentry_app)
request.method = "POST"
self.permission.has_object_permission(request, None, self.sentry_app)
@control_silo_test
class SentryAppBaseEndpointTest(TestCase):
def setUp(self):
self.endpoint = SentryAppBaseEndpoint()
self.user = self.create_user()
self.org = self.create_organization(owner=self.user)
self.request = self.make_request(user=self.user, method="GET")
self.sentry_app = self.create_sentry_app(name="foo", organization=self.org)
def test_retrieves_sentry_app(self):
args, kwargs = self.endpoint.convert_args(self.request, self.sentry_app.slug)
assert kwargs["sentry_app"].id == self.sentry_app.id
def test_raises_when_sentry_app_not_found(self):
with pytest.raises(Http404):
self.endpoint.convert_args(self.request, "notanapp")
@control_silo_test
class SentryAppInstallationPermissionTest(TestCase):
def setUp(self):
self.permission = SentryAppInstallationPermission()
self.user = self.create_user()
self.member = self.create_user()
self.org = self.create_organization(owner=self.member)
self.sentry_app = self.create_sentry_app(name="foo", organization=self.org)
self.installation = self.create_sentry_app_installation(
slug=self.sentry_app.slug, organization=self.org, user=self.user
)
self.request = self.make_request(user=self.user, method="GET")
self.superuser = self.create_user(is_superuser=True)
def test_missing_request_user(self):
self.request.user = None
assert not self.permission.has_object_permission(self.request, None, self.installation)
def test_request_user_in_organization(self):
self.request = self.make_request(user=self.member, method="GET")
assert self.permission.has_object_permission(self.request, None, self.installation)
def test_request_user_not_in_organization(self):
with pytest.raises(Http404):
self.permission.has_object_permission(self.request, None, self.installation)
def test_superuser_has_permission(self):
request = self.make_request(user=self.superuser, method="GET", is_superuser=True)
assert self.permission.has_object_permission(request, None, self.installation)
request.method = "POST"
assert self.permission.has_object_permission(request, None, self.installation)
@with_feature("auth:enterprise-superuser-read-write")
@override_settings(SENTRY_SELF_HOSTED=False)
def test_superuser_has_permission_read_only(self):
request = self.make_request(user=self.superuser, method="GET", is_superuser=True)
assert self.permission.has_object_permission(request, None, self.installation)
request.method = "POST"
with pytest.raises(Http404):
self.permission.has_object_permission(request, None, self.installation)
@with_feature("auth:enterprise-superuser-read-write")
@override_settings(SENTRY_SELF_HOSTED=False)
def test_superuser_has_permission_write(self):
self.add_user_permission(self.superuser, "superuser.write")
request = self.make_request(user=self.superuser, method="GET", is_superuser=True)
assert self.permission.has_object_permission(request, None, self.installation)
request.method = "POST"
self.permission.has_object_permission(request, None, self.installation)
@control_silo_test
class SentryAppInstallationBaseEndpointTest(TestCase):
def setUp(self):
self.endpoint = SentryAppInstallationBaseEndpoint()
self.user = self.create_user()
self.org = self.create_organization(owner=self.user)
self.request = self.make_request(user=self.user, method="GET")
self.sentry_app = self.create_sentry_app(name="foo", organization=self.org)
self.installation = self.create_sentry_app_installation(
slug=self.sentry_app.slug, organization=self.org, user=self.user
)
def test_retrieves_installation(self):
args, kwargs = self.endpoint.convert_args(self.request, self.installation.uuid)
assert kwargs["installation"].id == self.installation.id
def test_raises_when_sentry_app_not_found(self):
with pytest.raises(Http404):
self.endpoint.convert_args(self.request, "1234")
@control_silo_test
class AddIntegrationPlatformMetricTagTest(unittest.TestCase):
@patch("sentry.api.bases.sentryapps.add_request_metric_tags")
def test_record_platform_integration_metric(self, add_request_metric_tags):
@add_integration_platform_metric_tag
def get(self, request, *args, **kwargs):
pass
request = Mock()
endpoint = Mock(request=request)
get(endpoint, request)
add_request_metric_tags.assert_called_with(request, integration_platform=True)