Skip to content

Commit c464981

Browse files
committed
Add Post related views tests
1 parent 970d999 commit c464981

20 files changed

+167
-14
lines changed

blog/__pycache__/admin.cpython-38.pyc

0 Bytes
Binary file not shown.

blog/__pycache__/forms.cpython-38.pyc

0 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.
268 Bytes
Binary file not shown.

blog/__pycache__/urls.cpython-38.pyc

-8 Bytes
Binary file not shown.

blog/__pycache__/utils.cpython-38.pyc

34 Bytes
Binary file not shown.

blog/__pycache__/views.cpython-38.pyc

0 Bytes
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

blog/signals.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,22 @@
1111

1212
@receiver(post_delete, sender=Post)
1313
def clear_files(sender, instance, **kwargs):
14-
media_path = MEDIA_ROOT + f'/{instance.__class__.__name__}/{instance.slug}/'
14+
media_path = MEDIA_ROOT + f'/{instance.__class__.__name__}/{instance.title}/'
15+
print(f'Trying to delete {media_path}')
1516
if os.path.exists(media_path):
1617
root = Path(BASE_DIR)
1718
directory = Path(media_path)
1819
if root in directory.parents: # Extra safety option to guarantee safety to files outside django dir
1920
print(f'Deleting media folder: {media_path}')
20-
shutil.rmtree(media_path)
21+
try:
22+
shutil.rmtree(media_path)
23+
print('Successfully deleted media folder')
24+
except Exception as e:
25+
print(f'An error occured during folder deletion {e}')
26+
else:
27+
print('Folder is in incorrect path')
28+
else:
29+
print('Folder dont exist')
2130

2231

2332
@receiver(post_save, sender=Post)

blog/tests/test_urls.py

+14-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,22 @@
1-
from django.test import SimpleTestCase
1+
from django.test import TestCase
22
from django.urls import reverse, resolve
33
from blog.views import *
44

55

6-
class TestUrls(SimpleTestCase):
6+
class TestUrls(TestCase):
77

88
def test_index_url_is_resolved(self):
99
url = reverse('blog:index')
1010
self.assertEquals(resolve(url).func, index)
11+
12+
def test_post_create_url_resolves(self):
13+
url = reverse('blog:post_create')
14+
self.assertEquals(resolve(url).func.view_class, PostCreate)
15+
16+
def test_post_update_url_resolves(self):
17+
url = reverse('blog:post_update', args=['test_case'])
18+
self.assertEquals(resolve(url).func.view_class, PostUpdate)
19+
20+
def test_post_delete_url_resolves(self):
21+
url = reverse('blog:post_delete', args=['test_case'])
22+
self.assertEquals(resolve(url).func, post_delete)

blog/tests/test_views.py

+105
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
from django.test import TestCase, Client
2+
from django.urls import reverse
3+
from blog.urls import *
4+
from blog.views import *
5+
from blog.models import *
6+
from django.contrib.auth.models import User
7+
8+
9+
class ViewsMixin(object):
10+
11+
def get_response(self, url, method):
12+
# client = Client()
13+
if method == 'GET':
14+
resp = self.client.get(reverse(url[0], args=url[1]))
15+
elif method == 'POST':
16+
resp = self.client.post(reverse(url[0], args=url[1]))
17+
else:
18+
resp = ''
19+
return resp
20+
21+
def is_callable(self, url, user=None, post=None, fail=None, accept_redir=None):
22+
if user:
23+
self.client.force_login(user, backend=None)
24+
if post:
25+
method = 'POST'
26+
else:
27+
method = 'GET'
28+
if fail:
29+
resp = self.get_response(url, method=method)
30+
status = resp.status_code in [404, 302]
31+
self.assertTrue(status)
32+
else:
33+
resp = self.get_response(url, method=method)
34+
if accept_redir:
35+
print(resp.status_code)
36+
status = resp.status_code in [200, 302]
37+
print(status)
38+
self.assertTrue(status)
39+
else:
40+
self.assertEquals(resp.status_code, 200)
41+
42+
43+
class TestViews(ViewsMixin, TestCase):
44+
45+
def setUp(self):
46+
self.client = Client()
47+
post_args = ['test_case']
48+
self.urls = {
49+
'index': ['blog:index', []],
50+
'post_create': ['blog:post_create', []],
51+
'post_detail': ['blog:post_detail', ['test_case']],
52+
'post_update': ['blog:post_update', ['test_case']],
53+
'post_delete': ['blog:post_delete', ['test_case']]
54+
}
55+
self.admin = User.objects.create_superuser(
56+
username='test_admin',
57+
58+
password='test_admin'
59+
)
60+
self.admin.save()
61+
self.test_post = Post.objects.create(
62+
title='test_case',
63+
text='test_case',
64+
slug='test_case',
65+
tags='test,case'
66+
)
67+
68+
def test_index(self):
69+
self.is_callable(url=self.urls['index'])
70+
self.is_callable(url=self.urls['index'], post=True, accept_redir=True)
71+
72+
def test_post_create_callable_authorized(self):
73+
# Test authorized get and post request
74+
self.is_callable(url=self.urls['post_create'], user=self.admin)
75+
self.is_callable(url=self.urls['post_create'], user=self.admin, post=True)
76+
77+
def test_post_create_callable_unauthorized(self):
78+
# Test unauthorized get and post request
79+
self.is_callable(url=self.urls['post_create'], user=None, fail=True)
80+
self.is_callable(url=self.urls['post_create'], user=None, post=True, fail=True)
81+
82+
def test_post_detail_callable(self):
83+
self.is_callable(url=self.urls['post_detail'])
84+
85+
def test_post_update_callable_authorized(self):
86+
# Test authorized get and post request
87+
self.is_callable(url=self.urls['post_update'], user=self.admin)
88+
self.is_callable(url=self.urls['post_update'], user=self.admin, post=True)
89+
90+
def test_post_update_callable_unauthorized(self):
91+
# Test unauthorized get and post request
92+
self.is_callable(url=self.urls['post_update'], user=None, fail=True)
93+
self.is_callable(url=self.urls['post_update'], user=None, post=True, fail=True)
94+
95+
def test_post_delete_callable_authorized(self):
96+
# Test authorized get and post request
97+
self.is_callable(url=self.urls['post_delete'], user=self.admin, accept_redir=True)
98+
99+
def test_post_delete_callable_authorized_POST(self):
100+
self.is_callable(url=self.urls['post_delete'], user=self.admin, post=True, accept_redir=True)
101+
102+
def test_post_delete_callable_unauthorized(self):
103+
# Test unauthorized get and post request
104+
self.is_callable(url=self.urls['post_delete'], user=None, fail=True)
105+
self.is_callable(url=self.urls['post_delete'], user=None, post=True, fail=True)

blog/urls.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
path('', views.index, name='index'),
99
# post related routes
1010
path('post/detail/<slug:slug>/', views.post_detail, name='post_detail'),
11-
path('post/delete/<slug:slug>/', views.delete_post, name='post_delete'),
11+
path('post/delete/<slug:slug>/', views.post_delete, name='post_delete'),
1212
path('post/create/', staff_member_required(views.PostCreate.as_view()), name='post_create'),
1313
path('post/update/<slug:slug>/', staff_member_required(views.PostUpdate.as_view()), name='post_update'),
1414
# comments related routes

blog/utils.py

+10-8
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
def file_path_gen(instance, filename):
1010
file = filename
1111
class_name = instance.__class__.__name__
12-
slug = instance.slug if instance.slug else instance.title if instance.title else instance.id
12+
slug = instance.title
1313
file_type = "media" if file.endswith(('.png', '.jpg', '.jpeg')) else "files"
1414

1515
return f'{class_name}/{slug}/{file_type}/{file}'
@@ -18,14 +18,16 @@ def file_path_gen(instance, filename):
1818

1919

2020
def compress_image(uploadedImage):
21-
imageTemproary = Image.open(uploadedImage)
21+
image_temporary = Image.open(uploadedImage)
2222
outputIoStream = BytesIO()
23-
imageTemproaryResized = imageTemproary.resize((1020, 573))
24-
try:
25-
imageTemproary = pure_pil_alpha_to_color_v2(imageTemproary)
26-
except:
27-
pass
28-
imageTemproary.save(outputIoStream, format='JPEG', quality=80)
23+
image_temproary_resized = image_temporary.resize((1020, 573))
24+
if image_temporary.mode != 'RGB':
25+
try:
26+
image_temporary = pure_pil_alpha_to_color_v2(image_temporary)
27+
except IndexError:
28+
pass
29+
image_temporary = image_temporary.convert('RGB')
30+
image_temporary.save(outputIoStream, format='JPEG', quality=80)
2931
outputIoStream.seek(0)
3032
uploadedImage = InMemoryUploadedFile(outputIoStream, 'ImageField', "%s.jpg" % uploadedImage.name.split('.')[0],
3133
'image/jpeg', sys.getsizeof(outputIoStream), None)

blog/views.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ class PostUpdate(UpdateView):
8484

8585

8686
@staff_member_required
87-
def delete_post(request, slug):
87+
def post_delete(request, slug):
8888
post = get_object_or_404(Post, slug=slug)
8989
messages.success(request, f'Post "{post.title[:15]}" id:{post.id} został usunięty')
9090
post.delete()
0 Bytes
Binary file not shown.

requirements.txt

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
asgiref==3.2.5
2+
certifi==2019.11.28
3+
chardet==3.0.4
4+
coverage==5.0.4
5+
Django==3.0.4
6+
django-admin-interface==0.12.1
7+
django-ckeditor==5.9.0
8+
django-cleanup==4.0.0
9+
django-colorfield==0.2.1
10+
django-crispy-forms==1.9.0
11+
django-flat-responsive==2.0
12+
django-flat-theme==1.1.4
13+
django-image-optimizer==1.0.0
14+
django-js-asset==1.2.2
15+
django-taggit==1.2.0
16+
idna==2.9
17+
Pillow==7.0.0
18+
pipfile==0.0.2
19+
pytz==2019.3
20+
requests==2.23.0
21+
six==1.14.0
22+
sqlparse==0.3.1
23+
tinify==1.5.1
24+
toml==0.10.0
25+
urllib3==1.25.8

0 commit comments

Comments
 (0)