Skip to content

Commit f8373e7

Browse files
committed
feat: improved test coverage
1 parent 51d303c commit f8373e7

7 files changed

Lines changed: 91 additions & 1 deletion

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from django.urls import reverse
2+
from rest_framework import status
3+
from rest_framework.test import APITestCase
4+
5+
from accounts.models import Account, AccountConfirmation
6+
7+
8+
class ConfirmAccountTest(APITestCase):
9+
def setUp(self) -> None:
10+
self.account = Account.objects.create_user(
11+
username="confirmUser",
12+
email="confirm@example.com",
13+
unique_identifier="confirmUser",
14+
)
15+
self.account.set_password("aValidPss963")
16+
self.account.is_confirmed = False
17+
self.account.save()
18+
19+
self.confirmation = AccountConfirmation.objects.create(account=self.account, token="confirm-token") # noqa: S106 - test-only credential
20+
self.url = reverse("account:confirm")
21+
22+
def test_confirm_account_with_valid_token(self) -> None:
23+
response = self.client.post(self.url, {"token": self.confirmation.token}, format="json")
24+
25+
self.assertEqual(response.status_code, status.HTTP_200_OK)
26+
27+
self.account.refresh_from_db()
28+
self.assertTrue(self.account.is_confirmed)
29+
self.assertFalse(AccountConfirmation.objects.filter(pk=self.confirmation.pk).exists())
30+
31+
def test_confirm_account_with_invalid_token(self) -> None:
32+
response = self.client.post(self.url, {"token": "invalid-token"}, format="json")
33+
34+
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
35+
self.account.refresh_from_db()
36+
self.assertFalse(self.account.is_confirmed)

src/tests/accounts/endpoints/test_login_credentials.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from django.core.cache import cache
12
from django.urls import reverse
23
from rest_framework import status
34
from rest_framework.test import APITestCase
@@ -7,6 +8,7 @@
78

89
class LoginCredentialsTest(APITestCase):
910
def setUp(self):
11+
cache.clear()
1012
self.url = reverse("account:login-credentials")
1113
self.valid_account = Account.objects.create_user(
1214
username="validUser",

src/tests/accounts/endpoints/test_login_token.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from django.core.cache import cache
12
from django.urls import reverse
23
from rest_framework import status
34
from rest_framework.test import APITestCase
@@ -7,6 +8,7 @@
78

89
class LoginTokenTest(APITestCase):
910
def setUp(self):
11+
cache.clear()
1012
self.url = reverse("account:login-token")
1113
self.valid_account = Account.objects.create_user(
1214
username="validUser",

src/tests/accounts/endpoints/test_register.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
from unittest.mock import patch
2+
3+
from django.core.cache import cache
14
from django.urls import reverse
25
from rest_framework import status
36
from rest_framework.test import APITestCase
@@ -7,6 +10,7 @@
710

811
class RegisterTest(APITestCase):
912
def setUp(self):
13+
cache.clear()
1014
self.url = reverse("account:register")
1115
self.valid_data = {
1216
"email": "validUser@valid.com",
@@ -101,3 +105,15 @@ def test_confirmed_state_at_registering(self):
101105
self.assertEqual(response.status_code, status.HTTP_200_OK)
102106
created_account = Account.objects.get(email=self.valid_data["email"])
103107
self.assertFalse(created_account.is_confirmed)
108+
109+
def test_register_sends_confirmation_email(self):
110+
data = self.valid_data.copy()
111+
data["email"] = "newuser@example.com"
112+
data["unique_identifier"] = "newuser"
113+
data["username"] = "newuser"
114+
115+
with patch("accounts.models.Account.send_confirmation_mail") as mock_send:
116+
response = self.client.post(self.url, data, format="json")
117+
118+
self.assertEqual(response.status_code, status.HTTP_200_OK)
119+
mock_send.assert_called_once()

src/tests/accounts/endpoints/test_reset_password.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
from unittest.mock import patch
2+
3+
from django.core.cache import cache
14
from django.urls import reverse
25
from rest_framework import status
36
from rest_framework.test import APITestCase
@@ -11,6 +14,7 @@ def get_reset_url(token):
1114

1215
class PasswordResetTest(APITestCase):
1316
def setUp(self):
17+
cache.clear()
1418
self.valid_account = Account.objects.create_user(
1519
username="validUser",
1620
email="validUser@valid.com",
@@ -37,6 +41,16 @@ def test_request_password_reset_with_valid_email(self):
3741
password_reset_request = PasswordResetRequestModel.objects.first()
3842
self.assertIsNotNone(password_reset_request)
3943

44+
def test_request_password_reset_sends_email(self):
45+
data = {"email": "validUser@valid.com"}
46+
47+
with patch("accounts.api.views.send_email_with_template") as mock_send:
48+
response = self.client.post(self.url_request, data, format="json")
49+
50+
self.assertEqual(response.status_code, status.HTTP_200_OK)
51+
mock_send.assert_called_once()
52+
self.assertEqual(mock_send.call_args.kwargs["recipient"], data["email"])
53+
4054
def test_request_password_reset_with_invalid_email(self):
4155
data = {"email": "invalid@mail.com"}
4256

src/tests/accounts/endpoints/test_server_verification_token.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from django.core.cache import cache
12
from django.urls import reverse
23
from rest_framework import status
34
from rest_framework.test import APITestCase
@@ -7,6 +8,7 @@
78

89
class ServerVerificationTokenTest(APITestCase):
910
def setUp(self):
11+
cache.clear()
1012
self.valid_account = Account.objects.create_user(
1113
username="validUser",
1214
email="validUser@valid.com",

src/tests/baby_serverlist/test_api.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from datetime import UTC, datetime
1+
from datetime import UTC, datetime, timedelta
2+
from uuid import uuid4
23

34
from django.core.cache import cache
45
from django.test import override_settings
@@ -102,6 +103,17 @@ def test_regenerate_token_rejects_non_owner(self) -> None:
102103

103104
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
104105

106+
def test_regenerate_token_not_found_returns_404(self) -> None:
107+
self.client.force_authenticate(self.user)
108+
109+
response = self.client.post(
110+
reverse("baby_serverlist:regenerate-token"),
111+
{"server_id": str(uuid4())},
112+
format="json",
113+
)
114+
115+
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
116+
105117
def test_post_server_status_stores_payload_in_cache(self) -> None:
106118
baby_server = BabyServer.objects.create(owner=self.user, whitelisted=True)
107119
payload = _sample_status_payload(baby_server.serverlist_token)
@@ -151,6 +163,12 @@ def test_list_owned_baby_servers_live_flag(self) -> None:
151163
response = self.client.get(reverse("baby_serverlist:list-owned"))
152164
self.assertTrue(response.json()[0]["live"])
153165

166+
stale_time = datetime.now(tz=UTC) - timedelta(seconds=13)
167+
set_baby_server_heartbeat(str(baby_server.id), stale_time.isoformat())
168+
169+
response = self.client.get(reverse("baby_serverlist:list-owned"))
170+
self.assertFalse(response.json()[0]["live"])
171+
154172
def test_list_baby_servers_returns_whitelisted_status(self) -> None:
155173
baby_server = BabyServer.objects.create(owner=self.user, whitelisted=True)
156174
status_data = _sample_status_payload(baby_server.serverlist_token)

0 commit comments

Comments
 (0)