Skip to content

Commit 9e7246d

Browse files
committed
Use delete() instead of post() in DeleteServiceAccountAPIView
- Inherit DestroyAPIView in DeleteServiceAccountAPIView. - Use delete() instead of post() for deleting service accounts. - Override destroy() to handle deletion in DeleteServiceAccountAPIView. - Update tests accordingly. - Update tests to check the error messages as well. - Add test for checking uuid validation. Refs. TS-2320
1 parent 07f929e commit 9e7246d

File tree

2 files changed

+38
-13
lines changed

2 files changed

+38
-13
lines changed

django/thunderstore/api/cyberstorm/tests/test_delete_service_account.py

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def get_delete_service_account_url(team_name: str) -> str:
1515

1616

1717
def make_request(api_client: APIClient, team_name: str, account: ServiceAccount):
18-
return api_client.post(
18+
return api_client.delete(
1919
path=get_delete_service_account_url(team_name),
2020
data=json.dumps({"uuid": str(account.uuid)}),
2121
content_type="application/json",
@@ -46,8 +46,10 @@ def test_delete_service_account_fail_user_is_not_authenticated(
4646
assert ServiceAccount.objects.filter(uuid=service_account.uuid).count() == 1
4747

4848
response = make_request(api_client, team.name, service_account)
49-
assert response.status_code == 401
49+
expected_response = {"detail": "Authentication credentials were not provided."}
5050

51+
assert response.status_code == 401
52+
assert response.json() == expected_response
5153
assert ServiceAccount.objects.filter(uuid=service_account.uuid).count() == 1
5254

5355

@@ -63,8 +65,10 @@ def test_delete_service_account_fails_because_user_is_not_team_member(
6365
api_client.force_authenticate(non_team_user)
6466

6567
response = make_request(api_client, team.name, service_account)
66-
assert response.status_code == 403
68+
expected_response = {"detail": "User does not have permission to access this team."}
6769

70+
assert response.status_code == 403
71+
assert response.json() == expected_response
6872
assert ServiceAccount.objects.filter(uuid=service_account.uuid).count() == 1
6973

7074

@@ -78,8 +82,31 @@ def test_delete_service_account_fail_because_user_is_not_team_owner(
7882
assert ServiceAccount.objects.filter(uuid=service_account.uuid).count() == 1
7983

8084
api_client.force_authenticate(team_member.user)
81-
8285
response = make_request(api_client, team.name, service_account)
86+
87+
error_message = (
88+
"User does not have permission to delete service accounts for this team."
89+
)
90+
expected_response = {"detail": error_message}
91+
8392
assert response.status_code == 403
93+
assert response.json() == expected_response
94+
assert ServiceAccount.objects.filter(uuid=service_account.uuid).count() == 1
95+
96+
97+
@pytest.mark.django_db
98+
def test_delete_service_account_fail_because_invalid_uuid(
99+
api_client: APIClient,
100+
team_owner: TeamMember,
101+
team: Team,
102+
service_account: ServiceAccount,
103+
):
104+
assert ServiceAccount.objects.filter(uuid=service_account.uuid).count() == 1
105+
106+
api_client.force_authenticate(team_owner.user)
107+
response = make_request(api_client, team.name, ServiceAccount(uuid="invalid-uuid"))
108+
expected_response = {"uuid": ["Must be a valid UUID."]}
84109

110+
assert response.status_code == 400
111+
assert response.json() == expected_response
85112
assert ServiceAccount.objects.filter(uuid=service_account.uuid).count() == 1

django/thunderstore/api/cyberstorm/views/service_account.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from django.http import HttpRequest
22
from rest_framework import status
33
from rest_framework.exceptions import PermissionDenied
4-
from rest_framework.generics import CreateAPIView, GenericAPIView, get_object_or_404
4+
from rest_framework.generics import CreateAPIView, DestroyAPIView, get_object_or_404
55
from rest_framework.permissions import IsAuthenticated
66
from rest_framework.response import Response
77

@@ -69,7 +69,7 @@ def post(self, request, *args, **kwargs) -> Response:
6969
return super().post(request, *args, **kwargs)
7070

7171

72-
class DeleteServiceAccountAPIView(TeamPermissionMixin, GenericAPIView):
72+
class DeleteServiceAccountAPIView(TeamPermissionMixin, DestroyAPIView):
7373
queryset = ServiceAccount.objects.all()
7474
serializer_class = DeleteServiceAccountSerializer
7575

@@ -90,14 +90,12 @@ def get_object(self, uuid: str) -> ServiceAccount:
9090
)
9191
return obj
9292

93-
def perform_delete(self, request, *args, **kwargs) -> Response:
93+
def destroy(self, request, *args, **kwargs):
9494
serializer = self.get_serializer(data=request.data)
9595
serializer.is_valid(raise_exception=True)
9696
uuid = serializer.validated_data["uuid"]
97-
98-
service_account = self.get_object(uuid=uuid)
99-
service_account.delete()
100-
97+
instance = self.get_object(uuid=uuid)
98+
instance.delete()
10199
return Response(status=status.HTTP_204_NO_CONTENT)
102100

103101
@conditional_swagger_auto_schema(
@@ -106,5 +104,5 @@ def perform_delete(self, request, *args, **kwargs) -> Response:
106104
operation_id="cyberstorm.team.service-account.delete",
107105
tags=["cyberstorm"],
108106
)
109-
def post(self, request, *args, **kwargs) -> Response:
110-
return self.perform_delete(request, *args, **kwargs)
107+
def delete(self, request, *args, **kwargs) -> Response:
108+
return self.destroy(request, *args, **kwargs)

0 commit comments

Comments
 (0)