Skip to content

Commit c03d277

Browse files
41 - Testing with a Temporary Image
1 parent 9869317 commit c03d277

File tree

3 files changed

+185
-1
lines changed

3 files changed

+185
-1
lines changed
File renamed without changes.

src/status/api/tests.py

+184
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
import os
2+
import shutil
3+
import tempfile
4+
from PIL import Image # pip install pillow
5+
6+
from django.urls import reverse
7+
from rest_framework import status
8+
from rest_framework.reverse import reverse as api_reverse
9+
from rest_framework.test import APITestCase
10+
from django.contrib.auth import get_user_model
11+
from django.conf import settings
12+
13+
from rest_framework_jwt.settings import api_settings
14+
15+
from status.models import Status
16+
17+
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
18+
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
19+
20+
User = get_user_model()
21+
22+
23+
class StatusAPITestCase(APITestCase):
24+
def setUp(self):
25+
user = User.objects.create(username='testcfeuser', email='hello@cfe.com')
26+
user.set_password("yeahhhcfe")
27+
user.save()
28+
status_obj = Status.objects.create(user=user, content='Hello there!')
29+
30+
def test_statuses(self):
31+
self.assertEqual(Status.objects.count(), 1)
32+
33+
34+
def status_user_token(self):
35+
auth_url = api_reverse('api-auth:login')
36+
auth_data = {
37+
'username': 'testcfeuser',
38+
'password': 'yeahhhcfe',
39+
}
40+
auth_response = self.client.post(auth_url, auth_data, format='json')
41+
token = auth_response.data.get("token", None)
42+
if token is not None:
43+
self.client.credentials(HTTP_AUTHORIZATION='JWT ' + token)
44+
45+
def create_item(self):
46+
self.status_user_token()
47+
url = api_reverse('api-status:list')
48+
data = {
49+
'content': "some cool test content"
50+
}
51+
response = self.client.post(url, data, format='json')
52+
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
53+
self.assertEqual(Status.objects.count(), 2)
54+
return response.data
55+
56+
def test_empty_create_item(self):
57+
self.status_user_token()
58+
url = api_reverse('api-status:list')
59+
data = {
60+
'content': None,
61+
'image': None
62+
}
63+
response = self.client.post(url, data, format='json')
64+
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
65+
return response.data
66+
67+
def test_status_create_with_image(self):
68+
self.status_user_token()
69+
url = api_reverse('api-status:list')
70+
# (w, h) = (800, 1280)
71+
# (255, 255, 255)
72+
image_item = Image.new('RGB', (800, 1280), (0, 124, 174))
73+
tmp_file = tempfile.NamedTemporaryFile(suffix='.jpg')
74+
image_item.save(tmp_file, format='JPEG')
75+
with open(tmp_file.name, 'rb') as file_obj:
76+
data = {
77+
'content': "some cool test content",
78+
'image': file_obj
79+
}
80+
response = self.client.post(url, data, format='multipart')
81+
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
82+
self.assertEqual(Status.objects.count(), 2)
83+
img_data = response.data.get('image')
84+
self.assertNotEqual(img_data, None)
85+
temp_img_dir = os.path.join(settings.MEDIA_ROOT, 'status', 'testcfeuser')
86+
if os.path.exists(temp_img_dir):
87+
shutil.rmtree(temp_img_dir)
88+
89+
def test_status_create_with_img_and_desc(self):
90+
self.status_user_token()
91+
url = api_reverse('api-status:list')
92+
# (w, h) = (800, 1280)
93+
# (255, 255, 255)
94+
image_item = Image.new('RGB', (800, 1280), (0, 124, 174))
95+
tmp_file = tempfile.NamedTemporaryFile(suffix='.jpg')
96+
image_item.save(tmp_file, format='JPEG')
97+
with open(tmp_file.name, 'rb') as file_obj:
98+
data = {
99+
'content': None,
100+
'image': file_obj
101+
}
102+
response = self.client.post(url, data, format='multipart')
103+
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
104+
105+
106+
self.assertEqual(Status.objects.count(), 2)
107+
temp_img_dir = os.path.join(settings.MEDIA_ROOT, 'status', 'testcfeuser')
108+
if os.path.exists(temp_img_dir):
109+
shutil.rmtree(temp_img_dir)
110+
111+
def test_status_create(self):
112+
data = self.create_item()
113+
data_id = data.get("id")
114+
rud_url = api_reverse('api-status:detail', kwargs={"id": data_id})
115+
rud_data = {
116+
'content': "another new content"
117+
}
118+
119+
'''
120+
get method / retrieve
121+
'''
122+
get_response = self.client.get(rud_url, format='json')
123+
self.assertEqual(get_response.status_code, status.HTTP_200_OK)
124+
125+
def test_status_update(self):
126+
data = self.create_item()
127+
data_id = data.get("id")
128+
rud_url = api_reverse('api-status:detail', kwargs={"id": data_id})
129+
rud_data = {
130+
'content': "another new content"
131+
}
132+
'''
133+
put / update
134+
'''
135+
put_response = self.client.put(rud_url, rud_data, format='json')
136+
self.assertEqual(put_response.status_code, status.HTTP_200_OK)
137+
rud_response_data = put_response.data
138+
self.assertEqual(rud_response_data['content'], rud_data['content'])
139+
140+
def test_status_delete(self):
141+
data = self.create_item()
142+
data_id = data.get("id")
143+
rud_url = api_reverse('api-status:detail', kwargs={"id": data_id})
144+
rud_data = {
145+
'content': "another new content"
146+
}
147+
'''
148+
delete method / delete
149+
'''
150+
del_response = self.client.delete(rud_url, format='json')
151+
self.assertEqual(del_response.status_code, status.HTTP_204_NO_CONTENT)
152+
'''
153+
Not found
154+
'''
155+
get_response = self.client.get(rud_url, format='json')
156+
self.assertEqual(get_response.status_code, status.HTTP_404_NOT_FOUND)
157+
158+
159+
def test_status_no_token_create(self):
160+
url = api_reverse('api-status:list')
161+
data = {
162+
'content': "some cool test content"
163+
}
164+
response = self.client.post(url, data, format='json')
165+
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
166+
167+
168+
def test_other_user_permissions_api(self):
169+
data = self.create_item()
170+
data_id = data.get("id")
171+
user = User.objects.create(username='testjmitch')
172+
payload = jwt_payload_handler(user)
173+
token = jwt_encode_handler(payload)
174+
self.client.credentials(HTTP_AUTHORIZATION='JWT ' + token)
175+
rud_url = api_reverse('api-status:detail', kwargs={"id": data_id})
176+
rud_data = {
177+
'content': "smashing"
178+
}
179+
get_ = self.client.get(rud_url, format='json')
180+
put_ = self.client.put(rud_url, rud_data, format='json')
181+
delete_ = self.client.delete(rud_url, format='json')
182+
self.assertEqual(get_.status_code, status.HTTP_200_OK)
183+
self.assertEqual(put_.status_code, status.HTTP_403_FORBIDDEN)
184+
self.assertEqual(delete_.status_code, status.HTTP_403_FORBIDDEN)

src/status/api/urls.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66
)
77

88
urlpatterns = [
9-
url(r'^$', StatusAPIView.as_view()),
9+
url(r'^$', StatusAPIView.as_view(), name='list'),
1010
url(r'^(?P<id>\d+)/$', StatusAPIDetailView.as_view(), name='detail'),
1111
]

0 commit comments

Comments
 (0)