Mercurial > public > sg101
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>') |