bgneal@1221: """ bgneal@1221: Unit tests for the comments app views. bgneal@1221: bgneal@1221: """ bgneal@1221: from datetime import datetime, timedelta bgneal@1221: bgneal@1221: from django.contrib.auth.models import User bgneal@1221: from django.contrib.contenttypes.models import ContentType bgneal@1221: from django.core.urlresolvers import reverse bgneal@1221: from django.test import TestCase bgneal@1221: from mock import ANY, call, patch bgneal@1221: bgneal@1221: from comments.models import Comment, CommentFlag bgneal@1221: from potd.models import Current, Photo bgneal@1221: bgneal@1221: bgneal@1221: class PostCommentTestCase(TestCase): bgneal@1221: def setUp(self): bgneal@1221: self.user = User.objects.create_user('pjmoto', '', 'pw') bgneal@1221: self.user.save() bgneal@1221: self.client.login(username='pjmoto', password='pw') bgneal@1221: self.post_url = reverse('comments-post') bgneal@1221: potd1 = Photo(pk=4096, user=self.user, date_added=datetime.today()) bgneal@1221: potd1.save() bgneal@1221: potd2 = Photo(pk=8192, user=self.user, date_added=datetime.today()) bgneal@1221: potd2.save() bgneal@1221: current = Current(potd=potd2) bgneal@1221: current.save() bgneal@1221: bgneal@1221: def test_no_ctype_or_object(self): bgneal@1221: response = self.client.post(self.post_url, data={}) bgneal@1221: self.assertEqual(response.status_code, 400) bgneal@1221: bgneal@1221: def test_no_ctype(self): bgneal@1221: response = self.client.post(self.post_url, data={ bgneal@1221: 'object_pk': '4096', bgneal@1221: }) bgneal@1221: self.assertEqual(response.status_code, 400) bgneal@1221: bgneal@1221: def test_no_object(self): bgneal@1221: response = self.client.post(self.post_url, data={ bgneal@1221: 'content_type': 'bulletins.Bulletin', bgneal@1221: }) bgneal@1221: self.assertEqual(response.status_code, 400) bgneal@1221: bgneal@1221: def test_invalid_model(self): bgneal@1221: response = self.client.post(self.post_url, data={ bgneal@1221: 'content_type': 'wut.Model', bgneal@1221: 'object_pk': '4096', bgneal@1221: }) bgneal@1221: self.assertEqual(response.status_code, 400) bgneal@1221: bgneal@1221: def test_bad_content_type(self): bgneal@1221: response = self.client.post(self.post_url, data={ bgneal@1221: 'content_type': 'wut', bgneal@1221: 'object_pk': '4096', bgneal@1221: }) bgneal@1221: self.assertEqual(response.status_code, 400) bgneal@1221: bgneal@1221: def test_object_does_not_exist(self): bgneal@1221: response = self.client.post(self.post_url, data={ bgneal@1221: 'content_type': 'potd.Photo', bgneal@1221: 'object_pk': '1024', bgneal@1221: }) bgneal@1221: self.assertEqual(response.status_code, 400) bgneal@1221: bgneal@1221: def test_cannot_comment_on_object(self): bgneal@1221: response = self.client.post(self.post_url, data={ bgneal@1221: 'content_type': 'potd.Photo', bgneal@1221: 'object_pk': '4096', bgneal@1221: }) bgneal@1221: self.assertEqual(response.status_code, 403) bgneal@1221: bgneal@1221: def test_form_is_not_valid(self): bgneal@1221: response = self.client.post(self.post_url, data={ bgneal@1221: 'content_type': 'potd.Photo', bgneal@1221: 'object_pk': '8192', bgneal@1221: 'comment': '', bgneal@1221: }) bgneal@1221: self.assertEqual(response.status_code, 400) bgneal@1221: bgneal@1221: @patch('comments.views.antispam.utils.spam_check') bgneal@1221: def test_comment_fails_spam_check(self, spam_check_mock): bgneal@1221: spam_check_mock.return_value = True bgneal@1221: response = self.client.post(self.post_url, data={ bgneal@1221: 'content_type': 'potd.Photo', bgneal@1221: 'object_pk': '8192', bgneal@1221: 'comment': 'spam!', bgneal@1221: }) bgneal@1221: self.assertEqual(response.status_code, 403) bgneal@1221: self.assertEqual(spam_check_mock.mock_calls, [ bgneal@1221: call(ANY, 'spam!'), bgneal@1221: ]) bgneal@1221: bgneal@1221: @patch('comments.views.antispam.utils.spam_check') bgneal@1221: def test_happy_path(self, spam_check_mock): bgneal@1221: spam_check_mock.return_value = False bgneal@1221: response = self.client.post(self.post_url, data={ bgneal@1221: 'content_type': 'potd.Photo', bgneal@1221: 'object_pk': '8192', bgneal@1221: 'comment': '**Nice**', bgneal@1221: }) bgneal@1221: self.assertEqual(response.status_code, 200) bgneal@1221: self.assertEqual(spam_check_mock.mock_calls, [ bgneal@1221: call(ANY, '**Nice**'), bgneal@1221: ]) bgneal@1221: self.assertIn('Nice', response.content) bgneal@1221: bgneal@1221: self.assertEqual(Comment.objects.count(), 1) bgneal@1221: comments = Comment.objects.for_object(Photo.objects.get(pk=8192)) bgneal@1221: self.assertEqual(comments.count(), 1) bgneal@1221: comment = comments[0] bgneal@1221: self.assertEqual(comment.content_type.model, 'photo') bgneal@1221: self.assertEqual(comment.object_id, 8192) bgneal@1221: self.assertEqual(comment.user, self.user) bgneal@1221: self.assertEqual(comment.comment, '**Nice**') bgneal@1221: self.assertIn('Nice', comment.html) bgneal@1221: bgneal@1221: now = datetime.now() bgneal@1221: delta = timedelta(seconds=1) bgneal@1221: self.assertGreater(comment.creation_date, now - delta) bgneal@1221: self.assertLess(comment.creation_date, now + delta) bgneal@1221: self.assertTrue(comment.is_public) bgneal@1221: self.assertFalse(comment.is_removed) bgneal@1221: bgneal@1221: class FlagCommentTestCase(TestCase): bgneal@1221: def setUp(self): bgneal@1221: self.user = User.objects.create_user('pjmoto', '', 'pw') bgneal@1221: self.user.save() bgneal@1221: self.client.login(username='pjmoto', password='pw') bgneal@1221: self.post_url = reverse('comments-flag') bgneal@1221: bgneal@1221: def test_not_logged_in(self): bgneal@1221: self.client.logout() bgneal@1221: response = self.client.post(self.post_url, data={ bgneal@1221: 'id': '8192', bgneal@1221: }) bgneal@1221: self.assertEqual(response.status_code, 403) bgneal@1221: bgneal@1221: def test_no_id_supplied(self): bgneal@1221: response = self.client.post(self.post_url, data={}) bgneal@1221: self.assertEqual(response.status_code, 400) bgneal@1221: bgneal@1221: def test_invalid_comment(self): bgneal@1221: response = self.client.post(self.post_url, data={ bgneal@1221: 'id': '8192', bgneal@1221: }) bgneal@1221: self.assertEqual(response.status_code, 400) bgneal@1221: bgneal@1221: @patch('comments.views.email_admins') bgneal@1221: def test_happy_path(self, email_mock): bgneal@1221: content_type = ContentType.objects.get(app_label='potd', model='photo') bgneal@1221: c = Comment(content_type=content_type, object_id=512, user=self.user, bgneal@1221: comment='Nice', ip_address='127.0.0.1') bgneal@1221: c.save() bgneal@1221: response = self.client.post(self.post_url, data={ bgneal@1221: 'id': str(c.pk) bgneal@1221: }) bgneal@1221: self.assertEqual(response.status_code, 200) bgneal@1221: bgneal@1221: self.assertEqual(email_mock.mock_calls, [ bgneal@1221: call('A Comment Has Been Flagged', bgneal@1221: 'Hello,\n\nA user has flagged a comment for review.\n'), bgneal@1221: ]) bgneal@1221: bgneal@1221: self.assertEqual(CommentFlag.objects.count(), 1) bgneal@1221: flag = CommentFlag.objects.all()[0] bgneal@1221: self.assertEqual(flag.user, self.user) bgneal@1221: self.assertEqual(flag.comment.pk, c.pk) bgneal@1221: bgneal@1221: now = datetime.now() bgneal@1221: delta = timedelta(seconds=1) bgneal@1221: self.assertGreater(flag.flag_date, now - delta) bgneal@1221: self.assertLess(flag.flag_date, now + delta) bgneal@1221: bgneal@1221: class MarkdownPreviewTestCase(TestCase): bgneal@1221: def setUp(self): bgneal@1221: self.user = User.objects.create_user('pjmoto', '', 'pw') bgneal@1221: self.user.save() bgneal@1221: self.client.login(username='pjmoto', password='pw') bgneal@1221: self.post_url = reverse('comments-markdown_preview') bgneal@1221: bgneal@1221: def test_not_logged_in(self): bgneal@1221: self.client.logout() bgneal@1221: response = self.client.post(self.post_url, data={ bgneal@1221: 'data': 'Test', bgneal@1221: }) bgneal@1221: self.assertEqual(response.status_code, 403) bgneal@1221: bgneal@1221: def test_no_data_supplied(self): bgneal@1221: response = self.client.post(self.post_url, data={}) bgneal@1221: self.assertEqual(response.status_code, 400) bgneal@1221: bgneal@1221: def test_happy_path(self): bgneal@1221: response = self.client.post(self.post_url, data={ bgneal@1221: 'data': 'Test', bgneal@1221: }) bgneal@1221: self.assertEqual(response.status_code, 200) bgneal@1221: expected_content = ( bgneal@1221: '\n' bgneal@1221: '\n' bgneal@1221: '
\n' bgneal@1221: '\n' bgneal@1221: 'Test
\n' bgneal@1221: '\n' bgneal@1221: '