comparison comments/tests/test_views.py @ 1221:d6b3f7e77f6c modernize tip

Add unit tests for comments views.
author Brian Neal <bgneal@gmail.com>
date Sat, 01 Mar 2025 15:52:11 -0600
parents
children
comparison
equal deleted inserted replaced
1220:d63f9ece1129 1221:d6b3f7e77f6c
1 """
2 Unit tests for the comments app views.
3
4 """
5 from datetime import datetime, timedelta
6
7 from django.contrib.auth.models import User
8 from django.contrib.contenttypes.models import ContentType
9 from django.core.urlresolvers import reverse
10 from django.test import TestCase
11 from mock import ANY, call, patch
12
13 from comments.models import Comment, CommentFlag
14 from potd.models import Current, Photo
15
16
17 class PostCommentTestCase(TestCase):
18 def setUp(self):
19 self.user = User.objects.create_user('pjmoto', '', 'pw')
20 self.user.save()
21 self.client.login(username='pjmoto', password='pw')
22 self.post_url = reverse('comments-post')
23 potd1 = Photo(pk=4096, user=self.user, date_added=datetime.today())
24 potd1.save()
25 potd2 = Photo(pk=8192, user=self.user, date_added=datetime.today())
26 potd2.save()
27 current = Current(potd=potd2)
28 current.save()
29
30 def test_no_ctype_or_object(self):
31 response = self.client.post(self.post_url, data={})
32 self.assertEqual(response.status_code, 400)
33
34 def test_no_ctype(self):
35 response = self.client.post(self.post_url, data={
36 'object_pk': '4096',
37 })
38 self.assertEqual(response.status_code, 400)
39
40 def test_no_object(self):
41 response = self.client.post(self.post_url, data={
42 'content_type': 'bulletins.Bulletin',
43 })
44 self.assertEqual(response.status_code, 400)
45
46 def test_invalid_model(self):
47 response = self.client.post(self.post_url, data={
48 'content_type': 'wut.Model',
49 'object_pk': '4096',
50 })
51 self.assertEqual(response.status_code, 400)
52
53 def test_bad_content_type(self):
54 response = self.client.post(self.post_url, data={
55 'content_type': 'wut',
56 'object_pk': '4096',
57 })
58 self.assertEqual(response.status_code, 400)
59
60 def test_object_does_not_exist(self):
61 response = self.client.post(self.post_url, data={
62 'content_type': 'potd.Photo',
63 'object_pk': '1024',
64 })
65 self.assertEqual(response.status_code, 400)
66
67 def test_cannot_comment_on_object(self):
68 response = self.client.post(self.post_url, data={
69 'content_type': 'potd.Photo',
70 'object_pk': '4096',
71 })
72 self.assertEqual(response.status_code, 403)
73
74 def test_form_is_not_valid(self):
75 response = self.client.post(self.post_url, data={
76 'content_type': 'potd.Photo',
77 'object_pk': '8192',
78 'comment': '',
79 })
80 self.assertEqual(response.status_code, 400)
81
82 @patch('comments.views.antispam.utils.spam_check')
83 def test_comment_fails_spam_check(self, spam_check_mock):
84 spam_check_mock.return_value = True
85 response = self.client.post(self.post_url, data={
86 'content_type': 'potd.Photo',
87 'object_pk': '8192',
88 'comment': 'spam!',
89 })
90 self.assertEqual(response.status_code, 403)
91 self.assertEqual(spam_check_mock.mock_calls, [
92 call(ANY, 'spam!'),
93 ])
94
95 @patch('comments.views.antispam.utils.spam_check')
96 def test_happy_path(self, spam_check_mock):
97 spam_check_mock.return_value = False
98 response = self.client.post(self.post_url, data={
99 'content_type': 'potd.Photo',
100 'object_pk': '8192',
101 'comment': '**Nice**',
102 })
103 self.assertEqual(response.status_code, 200)
104 self.assertEqual(spam_check_mock.mock_calls, [
105 call(ANY, '**Nice**'),
106 ])
107 self.assertIn('<strong>Nice</strong>', response.content)
108
109 self.assertEqual(Comment.objects.count(), 1)
110 comments = Comment.objects.for_object(Photo.objects.get(pk=8192))
111 self.assertEqual(comments.count(), 1)
112 comment = comments[0]
113 self.assertEqual(comment.content_type.model, 'photo')
114 self.assertEqual(comment.object_id, 8192)
115 self.assertEqual(comment.user, self.user)
116 self.assertEqual(comment.comment, '**Nice**')
117 self.assertIn('<strong>Nice</strong>', comment.html)
118
119 now = datetime.now()
120 delta = timedelta(seconds=1)
121 self.assertGreater(comment.creation_date, now - delta)
122 self.assertLess(comment.creation_date, now + delta)
123 self.assertTrue(comment.is_public)
124 self.assertFalse(comment.is_removed)
125
126 class FlagCommentTestCase(TestCase):
127 def setUp(self):
128 self.user = User.objects.create_user('pjmoto', '', 'pw')
129 self.user.save()
130 self.client.login(username='pjmoto', password='pw')
131 self.post_url = reverse('comments-flag')
132
133 def test_not_logged_in(self):
134 self.client.logout()
135 response = self.client.post(self.post_url, data={
136 'id': '8192',
137 })
138 self.assertEqual(response.status_code, 403)
139
140 def test_no_id_supplied(self):
141 response = self.client.post(self.post_url, data={})
142 self.assertEqual(response.status_code, 400)
143
144 def test_invalid_comment(self):
145 response = self.client.post(self.post_url, data={
146 'id': '8192',
147 })
148 self.assertEqual(response.status_code, 400)
149
150 @patch('comments.views.email_admins')
151 def test_happy_path(self, email_mock):
152 content_type = ContentType.objects.get(app_label='potd', model='photo')
153 c = Comment(content_type=content_type, object_id=512, user=self.user,
154 comment='Nice', ip_address='127.0.0.1')
155 c.save()
156 response = self.client.post(self.post_url, data={
157 'id': str(c.pk)
158 })
159 self.assertEqual(response.status_code, 200)
160
161 self.assertEqual(email_mock.mock_calls, [
162 call('A Comment Has Been Flagged',
163 'Hello,\n\nA user has flagged a comment for review.\n'),
164 ])
165
166 self.assertEqual(CommentFlag.objects.count(), 1)
167 flag = CommentFlag.objects.all()[0]
168 self.assertEqual(flag.user, self.user)
169 self.assertEqual(flag.comment.pk, c.pk)
170
171 now = datetime.now()
172 delta = timedelta(seconds=1)
173 self.assertGreater(flag.flag_date, now - delta)
174 self.assertLess(flag.flag_date, now + delta)
175
176 class MarkdownPreviewTestCase(TestCase):
177 def setUp(self):
178 self.user = User.objects.create_user('pjmoto', '', 'pw')
179 self.user.save()
180 self.client.login(username='pjmoto', password='pw')
181 self.post_url = reverse('comments-markdown_preview')
182
183 def test_not_logged_in(self):
184 self.client.logout()
185 response = self.client.post(self.post_url, data={
186 'data': 'Test',
187 })
188 self.assertEqual(response.status_code, 403)
189
190 def test_no_data_supplied(self):
191 response = self.client.post(self.post_url, data={})
192 self.assertEqual(response.status_code, 400)
193
194 def test_happy_path(self):
195 response = self.client.post(self.post_url, data={
196 'data': 'Test',
197 })
198 self.assertEqual(response.status_code, 200)
199 expected_content = (
200 '<!DOCTYPE html>\n'
201 '<html lang="en">\n'
202 '<head>\n'
203 '<meta charset="utf-8" />\n'
204 '<title>Markdown Preview</title>\n'
205 '<link rel="stylesheet" href="/static/js/markitup/templates/preview.css" />\n'
206 '</head>\n'
207 '<p>Test</p>\n'
208 '</body>\n'
209 '</html>')
210 self.assertEqual(response.content.strip(), expected_content)
211
212 class MarkdownPreviewV3TestCase(TestCase):
213 def setUp(self):
214 self.user = User.objects.create_user('pjmoto', '', 'pw')
215 self.user.save()
216 self.client.login(username='pjmoto', password='pw')
217 self.post_url = reverse('comments-markdown_preview_v3')
218
219 def test_not_logged_in(self):
220 self.client.logout()
221 response = self.client.post(self.post_url, data={
222 'data': 'Test',
223 })
224 self.assertEqual(response.status_code, 403)
225
226 def test_no_data_supplied(self):
227 response = self.client.post(self.post_url, data={})
228 self.assertEqual(response.status_code, 200)
229 self.assertEqual(response.content, '')
230
231 def test_happy_path(self):
232 response = self.client.post(self.post_url, data={
233 'data': 'Test',
234 })
235 self.assertEqual(response.status_code, 200)
236 self.assertEqual(response.content.strip(), '<p>Test</p>')