Skip to content

Commit a0232ab

Browse files
committed
Add DisbandTeamAPIView
1 parent 6ac65b0 commit a0232ab

File tree

4 files changed

+118
-0
lines changed

4 files changed

+118
-0
lines changed

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

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,79 @@ def test_team_api_view__for_inactive_team__returns_404(
5656
assert response.status_code == 404
5757

5858

59+
@pytest.mark.django_db
60+
def test_team_disband__when_disbanding_team__succeeds(
61+
api_client: APIClient,
62+
user: UserType,
63+
team: Team,
64+
):
65+
TeamMemberFactory(team=team, user=user, role="owner")
66+
api_client.force_authenticate(user)
67+
68+
response = api_client.post(
69+
f"/api/cyberstorm/team/{team.name}/disband/",
70+
json.dumps({"verification": team.name}),
71+
content_type="application/json",
72+
)
73+
74+
assert response.status_code == 200
75+
response_json = response.json()
76+
assert response_json["name"] == team.name
77+
78+
79+
@pytest.mark.django_db
80+
def test_team_disband__when_disbanding_team__fails_because_verification_is_invalid(
81+
api_client: APIClient,
82+
user: UserType,
83+
team: Team,
84+
):
85+
TeamMemberFactory(team=team, user=user, role="owner")
86+
api_client.force_authenticate(user)
87+
response = api_client.post(
88+
f"/api/cyberstorm/team/{team.name}/disband/",
89+
json.dumps({"verification": "Bad Verification"}),
90+
content_type="application/json",
91+
)
92+
93+
assert response.status_code == 400
94+
response_json = response.json()
95+
assert "Invalid verification" in response_json["verification"]
96+
97+
98+
@pytest.mark.django_db
99+
def test_team_disband__when_disbanding_team__fails_because_team_doesnt_exist(
100+
api_client: APIClient,
101+
user: UserType,
102+
):
103+
api_client.force_authenticate(user)
104+
response = api_client.post(
105+
f"/api/cyberstorm/team/GhostTeam/disband/",
106+
json.dumps({"verification": "GhostTeam"}),
107+
content_type="application/json",
108+
)
109+
110+
assert response.status_code == 404
111+
response_json = response.json()
112+
assert response_json["detail"] == "Not found."
113+
114+
115+
@pytest.mark.django_db
116+
def test_team_disband__when_disbanding_team__fails_because_user_is_not_authenticated(
117+
api_client: APIClient,
118+
team: Team,
119+
):
120+
response = api_client.post(
121+
f"/api/cyberstorm/team/{team.name}/disband/",
122+
json.dumps({"verification": "Bad Verification"}),
123+
content_type="application/json",
124+
)
125+
126+
assert response.status_code == 401
127+
response_json = response.json()
128+
assert response_json["detail"] == "Authentication credentials were not provided."
129+
assert Team.objects.filter(name=team.name).count() == 1
130+
131+
59132
@pytest.mark.django_db
60133
def test_team_edit__when_editing_donation_link__succeeds(
61134
api_client: APIClient,

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from .package_rating import PackageRatingRateAPIView
1313
from .package_version_list import PackageVersionListAPIView
1414
from .team import (
15+
DisbandTeamAPIView,
1516
EditTeamAPIView,
1617
EditTeamMemberAPIView,
1718
RemoveTeamMemberAPIView,
@@ -44,4 +45,5 @@
4445
"RemoveTeamMemberAPIView",
4546
"EditTeamMemberAPIView",
4647
"EditTeamAPIView",
48+
"DisbandTeamAPIView",
4749
]

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from thunderstore.repository.forms import (
2323
AddTeamMemberForm,
2424
CreateTeamForm,
25+
DisbandTeamForm,
2526
DonationLinkTeamForm,
2627
EditTeamMemberForm,
2728
RemoveTeamMemberForm,
@@ -121,6 +122,42 @@ def post(self, request: HttpRequest):
121122
raise ValidationError(form.errors)
122123

123124

125+
class CyberstormDisbandTeamRequestSerialiazer(serializers.Serializer):
126+
verification = serializers.CharField()
127+
128+
129+
class CyberstormDisbandTeamResponseSerialiazer(serializers.Serializer):
130+
name = serializers.CharField()
131+
132+
133+
class DisbandTeamAPIView(APIView):
134+
@conditional_swagger_auto_schema(
135+
request_body=CyberstormDisbandTeamRequestSerialiazer,
136+
responses={200: CyberstormDisbandTeamResponseSerialiazer},
137+
operation_id="cyberstorm.team.disband",
138+
tags=["cyberstorm"],
139+
)
140+
def post(self, request: HttpRequest, team_name: str):
141+
serializer = CyberstormDisbandTeamRequestSerialiazer(data=request.data)
142+
serializer.is_valid(raise_exception=True)
143+
144+
team = get_object_or_404(Team, name__iexact=team_name)
145+
146+
form = DisbandTeamForm(
147+
user=request.user,
148+
instance=team,
149+
data=serializer.validated_data,
150+
)
151+
152+
if form.is_valid():
153+
form.save()
154+
return Response(
155+
CyberstormDisbandTeamResponseSerialiazer({"name": team_name}).data
156+
)
157+
else:
158+
raise ValidationError(form.errors)
159+
160+
124161
class TeamMemberListAPIView(CyberstormAutoSchemaMixin, TeamRestrictedAPIView):
125162
permission_classes = [AllowAny]
126163
serializer_class = CyberstormTeamMemberSerializer

django/thunderstore/api/urls.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
CommunityAPIView,
55
CommunityFiltersAPIView,
66
CommunityListAPIView,
7+
DisbandTeamAPIView,
78
EditTeamAPIView,
89
EditTeamMemberAPIView,
910
PackageDeprecateAPIView,
@@ -121,6 +122,11 @@
121122
TeamMemberListAPIView.as_view(),
122123
name="cyberstorm.team.member.list",
123124
),
125+
path(
126+
"team/<str:team_name>/disband/",
127+
DisbandTeamAPIView.as_view(),
128+
name="cyberstorm.team.disband",
129+
),
124130
path(
125131
"team/<str:team_name>/member/add/",
126132
TeamMemberAddAPIView.as_view(),

0 commit comments

Comments
 (0)