|
2 | 2 | from django.urls import reverse |
3 | 3 | from rest_framework.response import Response |
4 | 4 |
|
| 5 | +from sentry.models.apikey import ApiKey |
5 | 6 | from sentry.models.promptsactivity import PromptsActivity |
6 | 7 | from sentry.silo.base import SiloMode |
7 | 8 | from sentry.testutils.cases import APITestCase |
@@ -90,6 +91,48 @@ def test_service_account_sees_no_prompt_state(self) -> None: |
90 | 91 | class PutPromptsActivityTest(PromptsActivityTestBase): |
91 | 92 | method = "put" |
92 | 93 |
|
| 94 | + def _dismiss(self, **headers: str | bytes) -> Response: |
| 95 | + return self.client.put( |
| 96 | + self.path, |
| 97 | + { |
| 98 | + "organization_id": self.org.id, |
| 99 | + "project_id": self.project.id, |
| 100 | + "feature": "releases", |
| 101 | + "status": "dismissed", |
| 102 | + }, |
| 103 | + **headers, |
| 104 | + ) |
| 105 | + |
| 106 | + def test_api_key_cannot_dismiss(self) -> None: |
| 107 | + with assume_test_silo_mode(SiloMode.CONTROL): |
| 108 | + key = ApiKey.objects.create(organization_id=self.org.id, scope_list=["org:read"]) |
| 109 | + self.client.logout() |
| 110 | + |
| 111 | + resp = self._dismiss(HTTP_AUTHORIZATION=self.create_basic_auth_header(key.key)) |
| 112 | + |
| 113 | + assert resp.status_code == 401, resp.content |
| 114 | + assert not PromptsActivity.objects.filter(feature="releases").exists() |
| 115 | + |
| 116 | + @override_settings(SEER_API_SHARED_SECRET="service-account-secret") |
| 117 | + @with_feature("organizations:service-accounts") |
| 118 | + def test_service_account_cannot_dismiss(self) -> None: |
| 119 | + service_account = self.create_service_account( |
| 120 | + organization=self.org, scope_list=["org:read"] |
| 121 | + ) |
| 122 | + viewer_context = encode_viewer_context( |
| 123 | + ViewerContext( |
| 124 | + actor=Actor(type=ActorType.SERVICE_ACCOUNT, actor_id=service_account.id), |
| 125 | + organization_id=self.org.id, |
| 126 | + ), |
| 127 | + key="service-account-secret", |
| 128 | + ) |
| 129 | + |
| 130 | + resp = self._dismiss(HTTP_X_VIEWER_CONTEXT=viewer_context) |
| 131 | + |
| 132 | + assert resp.status_code == 403, resp.content |
| 133 | + assert resp.data["detail"]["code"] == "user-required" |
| 134 | + assert not PromptsActivity.objects.filter(feature="releases").exists() |
| 135 | + |
93 | 136 | def test_regular_org_member_can_dismiss(self) -> None: |
94 | 137 | member_user = self.create_user() |
95 | 138 | self.create_member(user=member_user, organization=self.org, role="member") |
|
0 commit comments