Skip to content

Commit dd68e02

Browse files
Merge pull request #7 from RandomProgramm3r/develop
test: Modify user application tests. - Group relevant tests of the user application into separate files - Add some tests.
2 parents 769bc43 + 95d0dbe commit dd68e02

File tree

6 files changed

+279
-208
lines changed

6 files changed

+279
-208
lines changed

promo_code/user/tests/__init__.py

Whitespace-only changes.

promo_code/user/tests/auth/__init__.py

Whitespace-only changes.
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import django.test
2+
import django.urls
3+
import rest_framework.status
4+
import rest_framework.test
5+
6+
import user.models
7+
8+
9+
class AuthenticationTests(rest_framework.test.APITestCase):
10+
def setUp(self):
11+
self.client = rest_framework.test.APIClient()
12+
super().setUp()
13+
14+
def tearDown(self):
15+
user.models.User.objects.all().delete()
16+
super().tearDown()
17+
18+
def test_valid_registration(self):
19+
data = {
20+
'name': 'Steve',
21+
'surname': 'Jobs',
22+
'email': '[email protected]',
23+
'password': 'SuperStrongPassword2000!',
24+
'other': {'age': 23, 'country': 'gb'},
25+
}
26+
response = self.client.post(
27+
django.urls.reverse('api-user:sign-up'),
28+
data,
29+
format='json',
30+
)
31+
self.assertEqual(
32+
response.status_code,
33+
rest_framework.status.HTTP_200_OK,
34+
)
35+
self.assertIn('access', response.data)
36+
self.assertTrue(
37+
user.models.User.objects.filter(
38+
39+
).exists(),
40+
)
41+
42+
def test_signin_success(self):
43+
user.models.User.objects.create_user(
44+
45+
name='Steve',
46+
surname='Jobs',
47+
password='SuperStrongPassword2000!',
48+
other={'age': 23, 'country': 'gb'},
49+
)
50+
51+
data = {
52+
'email': '[email protected]',
53+
'password': 'SuperStrongPassword2000!',
54+
}
55+
response = self.client.post(
56+
django.urls.reverse('api-user:sign-in'),
57+
data,
58+
format='json',
59+
)
60+
self.assertEqual(
61+
response.status_code,
62+
rest_framework.status.HTTP_200_OK,
63+
)
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import django.urls
2+
import rest_framework.status
3+
import rest_framework.test
4+
5+
import user.models
6+
7+
8+
class RegistrationTests(rest_framework.test.APITestCase):
9+
def setUp(self):
10+
self.client = rest_framework.test.APIClient()
11+
super().setUp()
12+
13+
def tearDown(self):
14+
user.models.User.objects.all().delete()
15+
super().tearDown()
16+
17+
def test_valid_registration(self):
18+
valid_data = {
19+
'name': 'Emma',
20+
'surname': 'Thompson',
21+
'email': '[email protected]',
22+
'password': 'SuperStrongPassword2000!',
23+
'other': {'age': 23, 'country': 'us'},
24+
}
25+
response = self.client.post(
26+
django.urls.reverse('api-user:sign-up'),
27+
valid_data,
28+
format='json',
29+
)
30+
self.assertEqual(
31+
response.status_code,
32+
rest_framework.status.HTTP_200_OK,
33+
)
34+
self.assertTrue(
35+
user.models.User.objects.filter(
36+
37+
).exists(),
38+
)
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
import django.test
2+
import django.urls
3+
import rest_framework.status
4+
import rest_framework.test
5+
import rest_framework_simplejwt.token_blacklist.models as tb_models
6+
7+
import user.models
8+
9+
10+
class JWTTests(rest_framework.test.APITestCase):
11+
def setUp(self):
12+
self.signup_url = django.urls.reverse('api-user:sign-up')
13+
self.signin_url = django.urls.reverse('api-user:sign-in')
14+
self.protected_url = django.urls.reverse('api-core:protected')
15+
self.refresh_url = django.urls.reverse('api-user:token_refresh')
16+
user.models.User.objects.create_user(
17+
name='John',
18+
surname='Doe',
19+
20+
password='SuperStrongPassword2000!',
21+
other={'age': 25, 'country': 'us'},
22+
)
23+
self.user_data = {
24+
'email': '[email protected]',
25+
'password': 'SuperStrongPassword2000!',
26+
}
27+
28+
super(JWTTests, self).setUp()
29+
30+
def tearDown(self):
31+
user.models.User.objects.all().delete()
32+
33+
super(JWTTests, self).tearDown()
34+
35+
def test_access_protected_view_with_valid_token(self):
36+
response = self.client.post(
37+
self.signin_url,
38+
self.user_data,
39+
format='json',
40+
)
41+
42+
token = response.data['access']
43+
44+
self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + token)
45+
response = self.client.get(self.protected_url)
46+
self.assertEqual(response.status_code, 200)
47+
self.assertEqual(response.data['status'], 'request was permitted')
48+
49+
def test_registration_token_invalid_after_login(self):
50+
data = {
51+
'email': '[email protected]',
52+
'password': 'StrongPass123!cd',
53+
'name': 'John',
54+
'surname': 'Doe',
55+
'other': {'age': 22, 'country': 'us'},
56+
}
57+
response = self.client.post(
58+
self.signup_url,
59+
data,
60+
format='json',
61+
)
62+
reg_access_token = response.data['access']
63+
64+
self.client.credentials(
65+
HTTP_AUTHORIZATION=f'Bearer {reg_access_token}',
66+
)
67+
response = self.client.get(self.protected_url)
68+
self.assertEqual(response.status_code, 200)
69+
70+
login_data = {'email': data['email'], 'password': data['password']}
71+
response = self.client.post(
72+
self.signin_url,
73+
login_data,
74+
format='json',
75+
)
76+
login_access_token = response.data['access']
77+
78+
self.client.credentials(
79+
HTTP_AUTHORIZATION=f'Bearer {reg_access_token}',
80+
)
81+
response = self.client.get(self.protected_url)
82+
self.assertEqual(response.status_code, 401)
83+
84+
self.client.credentials(
85+
HTTP_AUTHORIZATION=f'Bearer {login_access_token}',
86+
)
87+
response = self.client.get(self.protected_url)
88+
self.assertEqual(response.status_code, 200)
89+
90+
def test_refresh_token_invalidation_after_new_login(self):
91+
first_login_response = self.client.post(
92+
self.signin_url,
93+
self.user_data,
94+
format='json',
95+
)
96+
97+
refresh_token_v1 = first_login_response.data['refresh']
98+
99+
second_login_response = self.client.post(
100+
self.signin_url,
101+
self.user_data,
102+
format='json',
103+
)
104+
refresh_token_v2 = second_login_response.data['refresh']
105+
106+
refresh_response_v1 = self.client.post(
107+
self.refresh_url,
108+
{'refresh': refresh_token_v1},
109+
format='json',
110+
)
111+
self.assertEqual(
112+
refresh_response_v1.status_code,
113+
rest_framework.status.HTTP_401_UNAUTHORIZED,
114+
)
115+
self.assertEqual(refresh_response_v1.data['code'], 'token_not_valid')
116+
self.assertEqual(
117+
str(refresh_response_v1.data['detail']),
118+
'Token is blacklisted',
119+
)
120+
121+
refresh_response_v2 = self.client.post(
122+
self.refresh_url,
123+
{'refresh': refresh_token_v2},
124+
format='json',
125+
)
126+
self.assertEqual(
127+
refresh_response_v2.status_code,
128+
rest_framework.status.HTTP_200_OK,
129+
)
130+
self.assertIn('access', refresh_response_v2.data)
131+
132+
self.client.credentials(
133+
HTTP_AUTHORIZATION='Bearer ' + first_login_response.data['access'],
134+
)
135+
protected_response = self.client.get(self.protected_url)
136+
self.assertEqual(
137+
protected_response.status_code,
138+
rest_framework.status.HTTP_401_UNAUTHORIZED,
139+
)
140+
141+
def test_blacklist_storage(self):
142+
143+
self.client.post(self.signin_url, self.user_data, format='json')
144+
145+
self.client.post(self.signin_url, self.user_data, format='json')
146+
147+
self.assertEqual(
148+
(tb_models.BlacklistedToken.objects.count()),
149+
1,
150+
)
151+
self.assertEqual(
152+
(tb_models.OutstandingToken.objects.count()),
153+
2,
154+
)

0 commit comments

Comments
 (0)