Mercurial > public > sg101
view 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 |
line wrap: on
line source
""" Unit tests for the comments app views. """ from datetime import datetime, timedelta from django.contrib.auth.models import User from django.contrib.contenttypes.models import ContentType from django.core.urlresolvers import reverse from django.test import TestCase from mock import ANY, call, patch from comments.models import Comment, CommentFlag from potd.models import Current, Photo class PostCommentTestCase(TestCase): def setUp(self): self.user = User.objects.create_user('pjmoto', '', 'pw') self.user.save() self.client.login(username='pjmoto', password='pw') self.post_url = reverse('comments-post') potd1 = Photo(pk=4096, user=self.user, date_added=datetime.today()) potd1.save() potd2 = Photo(pk=8192, user=self.user, date_added=datetime.today()) potd2.save() current = Current(potd=potd2) current.save() def test_no_ctype_or_object(self): response = self.client.post(self.post_url, data={}) self.assertEqual(response.status_code, 400) def test_no_ctype(self): response = self.client.post(self.post_url, data={ 'object_pk': '4096', }) self.assertEqual(response.status_code, 400) def test_no_object(self): response = self.client.post(self.post_url, data={ 'content_type': 'bulletins.Bulletin', }) self.assertEqual(response.status_code, 400) def test_invalid_model(self): response = self.client.post(self.post_url, data={ 'content_type': 'wut.Model', 'object_pk': '4096', }) self.assertEqual(response.status_code, 400) def test_bad_content_type(self): response = self.client.post(self.post_url, data={ 'content_type': 'wut', 'object_pk': '4096', }) self.assertEqual(response.status_code, 400) def test_object_does_not_exist(self): response = self.client.post(self.post_url, data={ 'content_type': 'potd.Photo', 'object_pk': '1024', }) self.assertEqual(response.status_code, 400) def test_cannot_comment_on_object(self): response = self.client.post(self.post_url, data={ 'content_type': 'potd.Photo', 'object_pk': '4096', }) self.assertEqual(response.status_code, 403) def test_form_is_not_valid(self): response = self.client.post(self.post_url, data={ 'content_type': 'potd.Photo', 'object_pk': '8192', 'comment': '', }) self.assertEqual(response.status_code, 400) @patch('comments.views.antispam.utils.spam_check') def test_comment_fails_spam_check(self, spam_check_mock): spam_check_mock.return_value = True response = self.client.post(self.post_url, data={ 'content_type': 'potd.Photo', 'object_pk': '8192', 'comment': 'spam!', }) self.assertEqual(response.status_code, 403) self.assertEqual(spam_check_mock.mock_calls, [ call(ANY, 'spam!'), ]) @patch('comments.views.antispam.utils.spam_check') def test_happy_path(self, spam_check_mock): spam_check_mock.return_value = False response = self.client.post(self.post_url, data={ 'content_type': 'potd.Photo', 'object_pk': '8192', 'comment': '**Nice**', }) self.assertEqual(response.status_code, 200) self.assertEqual(spam_check_mock.mock_calls, [ call(ANY, '**Nice**'), ]) self.assertIn('<strong>Nice</strong>', response.content) self.assertEqual(Comment.objects.count(), 1) comments = Comment.objects.for_object(Photo.objects.get(pk=8192)) self.assertEqual(comments.count(), 1) comment = comments[0] self.assertEqual(comment.content_type.model, 'photo') self.assertEqual(comment.object_id, 8192) self.assertEqual(comment.user, self.user) self.assertEqual(comment.comment, '**Nice**') self.assertIn('<strong>Nice</strong>', comment.html) now = datetime.now() delta = timedelta(seconds=1) self.assertGreater(comment.creation_date, now - delta) self.assertLess(comment.creation_date, now + delta) self.assertTrue(comment.is_public) self.assertFalse(comment.is_removed) class FlagCommentTestCase(TestCase): def setUp(self): self.user = User.objects.create_user('pjmoto', '', 'pw') self.user.save() self.client.login(username='pjmoto', password='pw') self.post_url = reverse('comments-flag') def test_not_logged_in(self): self.client.logout() response = self.client.post(self.post_url, data={ 'id': '8192', }) self.assertEqual(response.status_code, 403) def test_no_id_supplied(self): response = self.client.post(self.post_url, data={}) self.assertEqual(response.status_code, 400) def test_invalid_comment(self): response = self.client.post(self.post_url, data={ 'id': '8192', }) self.assertEqual(response.status_code, 400) @patch('comments.views.email_admins') def test_happy_path(self, email_mock): content_type = ContentType.objects.get(app_label='potd', model='photo') c = Comment(content_type=content_type, object_id=512, user=self.user, comment='Nice', ip_address='127.0.0.1') c.save() response = self.client.post(self.post_url, data={ 'id': str(c.pk) }) self.assertEqual(response.status_code, 200) self.assertEqual(email_mock.mock_calls, [ call('A Comment Has Been Flagged', 'Hello,\n\nA user has flagged a comment for review.\n'), ]) self.assertEqual(CommentFlag.objects.count(), 1) flag = CommentFlag.objects.all()[0] self.assertEqual(flag.user, self.user) self.assertEqual(flag.comment.pk, c.pk) now = datetime.now() delta = timedelta(seconds=1) self.assertGreater(flag.flag_date, now - delta) self.assertLess(flag.flag_date, now + delta) class MarkdownPreviewTestCase(TestCase): def setUp(self): self.user = User.objects.create_user('pjmoto', '', 'pw') self.user.save() self.client.login(username='pjmoto', password='pw') self.post_url = reverse('comments-markdown_preview') def test_not_logged_in(self): self.client.logout() response = self.client.post(self.post_url, data={ 'data': 'Test', }) self.assertEqual(response.status_code, 403) def test_no_data_supplied(self): response = self.client.post(self.post_url, data={}) self.assertEqual(response.status_code, 400) def test_happy_path(self): response = self.client.post(self.post_url, data={ 'data': 'Test', }) self.assertEqual(response.status_code, 200) expected_content = ( '<!DOCTYPE html>\n' '<html lang="en">\n' '<head>\n' '<meta charset="utf-8" />\n' '<title>Markdown Preview</title>\n' '<link rel="stylesheet" href="/static/js/markitup/templates/preview.css" />\n' '</head>\n' '<p>Test</p>\n' '</body>\n' '</html>') self.assertEqual(response.content.strip(), expected_content) class MarkdownPreviewV3TestCase(TestCase): def setUp(self): self.user = User.objects.create_user('pjmoto', '', 'pw') self.user.save() self.client.login(username='pjmoto', password='pw') self.post_url = reverse('comments-markdown_preview_v3') def test_not_logged_in(self): self.client.logout() response = self.client.post(self.post_url, data={ 'data': 'Test', }) self.assertEqual(response.status_code, 403) def test_no_data_supplied(self): response = self.client.post(self.post_url, data={}) self.assertEqual(response.status_code, 200) self.assertEqual(response.content, '') def test_happy_path(self): response = self.client.post(self.post_url, data={ 'data': 'Test', }) self.assertEqual(response.status_code, 200) self.assertEqual(response.content.strip(), '<p>Test</p>')