annotate 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
rev   line source
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>')