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