Skip to content

Commit 7580d68

Browse files
committed
Implement tests for create/delete service accounts
Refs. TS-2320
1 parent 490641a commit 7580d68

File tree

2 files changed

+214
-0
lines changed

2 files changed

+214
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
import json
2+
3+
import pytest
4+
from django.contrib.auth import get_user_model
5+
from rest_framework.test import APIClient
6+
7+
from thunderstore.account.models.service_account import ServiceAccount
8+
from thunderstore.repository.models.team import Team, TeamMember
9+
10+
User = get_user_model()
11+
12+
13+
def get_create_service_account_url(team_name: str) -> str:
14+
return f"/api/cyberstorm/team/{team_name}/service-account/create/"
15+
16+
17+
@pytest.mark.django_db
18+
def test_create_service_account_success(api_client: APIClient, team_owner: TeamMember):
19+
api_client.force_authenticate(team_owner.user)
20+
21+
url = get_create_service_account_url(team_owner.team.name)
22+
data = json.dumps({"nickname": "CoolestTeamServiceAccountName"})
23+
24+
response = api_client.post(url, data, content_type="application/json")
25+
26+
expected_response = {
27+
"nickname": "CoolestTeamServiceAccountName",
28+
"team_name": team_owner.team.name,
29+
"api_token": "tss_",
30+
}
31+
32+
service_account_count = ServiceAccount.objects.filter(
33+
owner__name=team_owner.team.name,
34+
user__first_name="CoolestTeamServiceAccountName",
35+
).count()
36+
37+
assert response.status_code == 201
38+
assert response.json()["nickname"] == expected_response["nickname"]
39+
assert response.json()["team_name"] == expected_response["team_name"]
40+
assert response.json()["api_token"][:4] == expected_response["api_token"]
41+
assert service_account_count == 1
42+
43+
44+
@pytest.mark.django_db
45+
def test_create_service_account_not_authenticated(
46+
api_client: APIClient, team_owner: TeamMember
47+
):
48+
url = get_create_service_account_url(team_owner.team.name)
49+
data = json.dumps({"nickname": "CoolestTeamServiceAccountName"})
50+
51+
response = api_client.post(url, data, content_type="application/json")
52+
expected_response = {"detail": "Authentication credentials were not provided."}
53+
54+
assert response.status_code == 401
55+
assert response.json() == expected_response
56+
57+
58+
@pytest.mark.django_db
59+
def test_create_service_account_fails_because_nickname_too_long(
60+
api_client: APIClient,
61+
team_owner: TeamMember,
62+
):
63+
api_client.force_authenticate(team_owner.user)
64+
url = get_create_service_account_url(team_owner.team.name)
65+
data = json.dumps({"nickname": "LongestCoolestTeamServiceAccountNameEver"})
66+
67+
response = api_client.post(url, data, content_type="application/json")
68+
69+
expected_response = {
70+
"nickname": ["Ensure this field has no more than 32 characters."]
71+
}
72+
73+
service_account_count = ServiceAccount.objects.filter(
74+
owner__name=team_owner.team.name,
75+
user__first_name="LongestCoolestTeamServiceAccountNameEver",
76+
).count()
77+
78+
assert response.status_code == 400
79+
assert response.json() == expected_response
80+
assert service_account_count == 0
81+
82+
83+
@pytest.mark.django_db
84+
def test_create_service_account_fail_because_user_is_not_team_member(
85+
api_client: APIClient,
86+
team: Team,
87+
):
88+
non_team_user = User.objects.create()
89+
api_client.force_authenticate(non_team_user)
90+
91+
url = get_create_service_account_url(team.name)
92+
data = json.dumps({"nickname": "CoolestTeamServiceAccountName"})
93+
94+
response = api_client.post(url, data, content_type="application/json")
95+
account_count = ServiceAccount.objects.filter(
96+
owner__name=team.name, user__first_name="CoolestTeamServiceAccountName"
97+
).count()
98+
99+
expected_response = {"detail": "User does not have permission to access this team."}
100+
101+
assert response.status_code == 403
102+
assert account_count == 0
103+
assert response.json() == expected_response
104+
105+
106+
@pytest.mark.django_db
107+
def test_create_service_account_fail_because_user_is_not_team_owner(
108+
api_client: APIClient,
109+
team: Team,
110+
team_member: TeamMember,
111+
):
112+
api_client.force_authenticate(team_member.user)
113+
url = get_create_service_account_url(team.name)
114+
data = json.dumps({"nickname": "CoolestTeamServiceAccountName"})
115+
116+
response = api_client.post(url, data, content_type="application/json")
117+
account_count = ServiceAccount.objects.filter(
118+
owner__name=team.name, user__first_name="CoolestTeamServiceAccountName"
119+
).count()
120+
121+
expected_response = {
122+
"detail": (
123+
"User does not have permission to create service accounts for this team."
124+
)
125+
}
126+
127+
assert response.status_code == 403
128+
assert account_count == 0
129+
assert response.json() == expected_response
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import json
2+
3+
import pytest
4+
from django.contrib.auth import get_user_model
5+
from rest_framework.test import APIClient
6+
7+
from thunderstore.account.models.service_account import ServiceAccount
8+
from thunderstore.repository.models.team import Team, TeamMember
9+
10+
User = get_user_model()
11+
12+
13+
def get_delete_service_account_url(team_name: str) -> str:
14+
return f"/api/cyberstorm/team/{team_name}/service-account/delete/"
15+
16+
17+
def make_request(api_client: APIClient, team_name: str, account: ServiceAccount):
18+
return api_client.post(
19+
path=get_delete_service_account_url(team_name),
20+
data=json.dumps({"uuid": str(account.uuid)}),
21+
content_type="application/json",
22+
)
23+
24+
25+
@pytest.mark.django_db
26+
def test_delete_service_account_success(
27+
api_client: APIClient,
28+
team_owner: TeamMember,
29+
service_account: ServiceAccount,
30+
):
31+
assert ServiceAccount.objects.filter(uuid=service_account.uuid).count() == 1
32+
33+
api_client.force_authenticate(team_owner.user)
34+
response = make_request(api_client, team_owner.team.name, service_account)
35+
36+
assert response.status_code == 204
37+
assert ServiceAccount.objects.filter(uuid=service_account.uuid).count() == 0
38+
39+
40+
@pytest.mark.django_db
41+
def test_delete_service_account_fail_user_is_not_authenticated(
42+
api_client: APIClient,
43+
team: Team,
44+
service_account: ServiceAccount,
45+
):
46+
assert ServiceAccount.objects.filter(uuid=service_account.uuid).count() == 1
47+
48+
response = make_request(api_client, team.name, service_account)
49+
assert response.status_code == 401
50+
51+
assert ServiceAccount.objects.filter(uuid=service_account.uuid).count() == 1
52+
53+
54+
@pytest.mark.django_db
55+
def test_delete_service_account_fails_because_user_is_not_team_member(
56+
api_client: APIClient,
57+
team: Team,
58+
service_account: ServiceAccount,
59+
):
60+
assert ServiceAccount.objects.filter(uuid=service_account.uuid).count() == 1
61+
62+
non_team_user = User.objects.create()
63+
api_client.force_authenticate(non_team_user)
64+
65+
response = make_request(api_client, team.name, service_account)
66+
assert response.status_code == 403
67+
68+
assert ServiceAccount.objects.filter(uuid=service_account.uuid).count() == 1
69+
70+
71+
@pytest.mark.django_db
72+
def test_delete_service_account_fail_because_user_is_not_team_owner(
73+
api_client: APIClient,
74+
team_member: TeamMember,
75+
team: Team,
76+
service_account: ServiceAccount,
77+
):
78+
assert ServiceAccount.objects.filter(uuid=service_account.uuid).count() == 1
79+
80+
api_client.force_authenticate(team_member.user)
81+
82+
response = make_request(api_client, team.name, service_account)
83+
assert response.status_code == 403
84+
85+
assert ServiceAccount.objects.filter(uuid=service_account.uuid).count() == 1

0 commit comments

Comments
 (0)