from django.conf import settings from django.test import TestCase from django.urls import reverse from main import models class CommentCreateAuthorTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice", comments_on=True) self.post = models.Post.objects.create( title="Hello world", slug="hello-world", owner=self.user, ) self.client.force_login(self.user) def test_comment_create_author(self): data = { "body": "Content sentence.", } response = self.client.post( reverse("comment_create_author", args=(self.post.slug,)), HTTP_HOST="alice." + settings.CANONICAL_HOST, data=data, ) self.assertEqual(response.status_code, 302) self.assertEqual(models.Comment.objects.all().count(), 1) self.assertEqual(models.Comment.objects.all().first().name, self.user.username) self.assertIsNone(models.Comment.objects.all().first().email) self.assertEqual(models.Comment.objects.all().first().body, data["body"]) self.assertEqual(models.Comment.objects.all().first().post, self.post) response = self.client.get( reverse("post_detail", args=(self.post.slug,)), HTTP_HOST="alice." + settings.CANONICAL_HOST, ) self.assertEqual(response.status_code, 200) self.assertContains(response, "your comment is public") class CommentCreateTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice", comments_on=True) self.post = models.Post.objects.create( title="Hello world", slug="hello-world", owner=self.user, ) def test_comment_create(self): data = { "name": "Jon", "email": "jon@wick.com", "body": "Content sentence.", } response = self.client.post( reverse("comment_create", args=(self.post.slug,)), HTTP_HOST="alice." + settings.CANONICAL_HOST, data=data, ) self.assertEqual(response.status_code, 302) self.assertEqual(models.Comment.objects.all().count(), 1) self.assertEqual(models.Comment.objects.all().first().name, data["name"]) self.assertEqual(models.Comment.objects.all().first().email, data["email"]) self.assertEqual(models.Comment.objects.all().first().body, data["body"]) self.assertEqual(models.Comment.objects.all().first().post, self.post) response = self.client.get( reverse("post_detail", args=(self.post.slug,)), HTTP_HOST="alice." + settings.CANONICAL_HOST, ) self.assertEqual(response.status_code, 200) self.assertContains(response, "your comment will be published soon") class CommentApprovedCreateTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice", comments_on=True) self.post = models.Post.objects.create( title="Hello world", slug="hello-world", owner=self.user, ) self.comment = models.Comment.objects.create( post=self.post, name="Jon", email="jon@wick.com", body="Content sentence.", is_approved=True, ) def test_comment_create(self): response = self.client.get( reverse("post_detail", args=(self.post.slug,)), HTTP_HOST="alice." + settings.CANONICAL_HOST, ) self.assertEqual(response.status_code, 200) self.assertContains(response, "Jon") self.assertContains(response, "Content sentence.") class CommentNotApprovedCreateTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice", comments_on=True) self.post = models.Post.objects.create( title="Hello world", slug="hello-world", owner=self.user, ) self.comment = models.Comment.objects.create( post=self.post, name="Jon", email="jon@wick.com", body="Content sentence.", is_approved=False, ) def test_comment_create(self): response = self.client.get( reverse("post_detail", args=(self.post.slug,)), HTTP_HOST="alice." + settings.CANONICAL_HOST, ) self.assertEqual(response.status_code, 200) self.assertNotContains(response, "Jon") self.assertNotContains(response, "Content sentence.") class CommentNameCreateTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice", comments_on=True) self.post = models.Post.objects.create( title="Hello world", slug="hello-world", owner=self.user, ) def test_comment_create(self): data = { "name": "Jon", "body": "Content sentence.", } response = self.client.post( reverse("comment_create", args=(self.post.slug,)), HTTP_HOST="alice." + settings.CANONICAL_HOST, data=data, ) self.assertEqual(response.status_code, 302) self.assertEqual(models.Comment.objects.all().count(), 1) self.assertEqual(models.Comment.objects.all().first().name, data["name"]) self.assertEqual(models.Comment.objects.all().first().body, data["body"]) self.assertEqual(models.Comment.objects.all().first().post, self.post) class CommentEmailCreateTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice", comments_on=True) self.post = models.Post.objects.create( title="Hello world", slug="hello-world", owner=self.user, ) def test_comment_create(self): data = { "email": "jon@wick.com", "body": "Content sentence.", } response = self.client.post( reverse("comment_create", args=(self.post.slug,)), HTTP_HOST="alice." + settings.CANONICAL_HOST, data=data, ) self.assertEqual(response.status_code, 302) self.assertEqual(models.Comment.objects.all().count(), 1) self.assertEqual(models.Comment.objects.all().first().name, "Anonymous") self.assertEqual(models.Comment.objects.all().first().email, data["email"]) self.assertEqual(models.Comment.objects.all().first().body, data["body"]) self.assertEqual(models.Comment.objects.all().first().post, self.post) class CommentNoAuthCreateTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice", comments_on=True) self.post = models.Post.objects.create( title="Hello world", slug="hello-world", owner=self.user, ) def test_comment_create(self): data = { "body": "Content sentence.", } response = self.client.post( reverse("comment_create", args=(self.post.slug,)), HTTP_HOST="alice." + settings.CANONICAL_HOST, data=data, ) self.assertEqual(response.status_code, 302) self.assertEqual(models.Comment.objects.all().count(), 1) self.assertEqual(models.Comment.objects.all().first().name, "Anonymous") self.assertEqual(models.Comment.objects.all().first().body, data["body"]) self.assertEqual(models.Comment.objects.all().first().post, self.post) class CommentNoBodyCreateTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice", comments_on=True) self.post = models.Post.objects.create( title="Hello world", slug="hello-world", owner=self.user, ) def test_comment_create(self): data = { "body": "", } response = self.client.post( reverse("comment_create", args=(self.post.slug,)), HTTP_HOST="alice." + settings.CANONICAL_HOST, data=data, ) self.assertEqual(response.status_code, 200) self.assertEqual(models.Comment.objects.all().count(), 0) class CommentDisallowedCreateTestCase(TestCase): def setUp(self): # user.comments_on=False is the default self.user = models.User.objects.create(username="alice") self.post = models.Post.objects.create( title="Hello world", slug="hello-world", owner=self.user, ) def test_comment_create(self): data = { "body": "", } response = self.client.post( reverse("comment_create", args=(self.post.slug,)), HTTP_HOST="alice." + settings.CANONICAL_HOST, data=data, ) self.assertEqual(response.status_code, 200) self.assertEqual(models.Comment.objects.all().count(), 0) class CommentDeleteTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice", comments_on=True) self.client.force_login(self.user) self.post = models.Post.objects.create( title="Hello world", slug="hello-world", owner=self.user, ) self.comment = models.Comment.objects.create( name="Jon", email="jon@wick.com", body="Content sentence.", post=self.post, ) def test_comment_delete(self): response = self.client.post( reverse("comment_delete", args=(self.post.slug, self.comment.id)), HTTP_HOST="alice." + settings.CANONICAL_HOST, ) self.assertEqual(response.status_code, 302) self.assertEqual(models.Comment.objects.all().count(), 0) class CommentNonOwnerDeleteTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice", comments_on=True) self.post = models.Post.objects.create( title="Hello world", slug="hello-world", owner=self.user, ) self.comment = models.Comment.objects.create( name="Jon", email="jon@wick.com", body="Content sentence.", post=self.post, ) self.non_owner = models.User.objects.create(username="bob") self.client.force_login(self.non_owner) def test_comment_delete(self): response = self.client.post( reverse("comment_delete", args=(self.post.slug, self.comment.id)), HTTP_HOST="alice." + settings.CANONICAL_HOST, ) self.assertEqual(response.status_code, 403) self.assertEqual(models.Comment.objects.all().count(), 1) class CommentNoAuthDeleteTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice", comments_on=True) self.post = models.Post.objects.create( title="Hello world", slug="hello-world", owner=self.user, ) self.comment = models.Comment.objects.create( name="Jon", email="jon@wick.com", body="Content sentence.", post=self.post, ) def test_comment_delete(self): response = self.client.post( reverse("comment_delete", args=(self.post.slug, self.comment.id)), HTTP_HOST="alice." + settings.CANONICAL_HOST, ) self.assertEqual(response.status_code, 403) self.assertEqual(models.Comment.objects.all().count(), 1) class CommentsApproveTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice", comments_on=True) self.post = models.Post.objects.create( owner=self.user, title="Welcome post", slug="welcome-post", body="Content sentence.", published_at="2020-02-06", ) data = { "body": "Hey, I am a comment.", } self.client.post( reverse("comment_create", args=(self.post.slug,)), HTTP_HOST="alice." + settings.CANONICAL_HOST, data=data, ) self.assertEqual(models.Comment.objects.all().count(), 1) def test_comment_approve(self): self.comment = models.Comment.objects.all().first() self.client.force_login(self.user) data = { "is_approved": True, } response = self.client.post( reverse( "comment_approve", args=( self.comment.post.slug, self.comment.id, ), ), HTTP_HOST=f"{self.user.username}.{settings.CANONICAL_HOST}", data=data, ) self.assertEqual(response.status_code, 302) self.assertEqual(models.Comment.objects.all().count(), 1) self.assertEqual(models.Comment.objects.all().first().is_approved, True) class CommentsApproveNoAuthTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice", comments_on=True) self.post = models.Post.objects.create( owner=self.user, title="Welcome post", slug="welcome-post", body="Content sentence.", published_at="2020-02-06", ) data = { "body": "Hey, I am a comment.", } self.client.post( reverse("comment_create", args=(self.post.slug,)), HTTP_HOST="alice." + settings.CANONICAL_HOST, data=data, ) self.assertEqual(models.Comment.objects.all().count(), 1) def test_comment_approve_not_authorized(self): self.comment = models.Comment.objects.all().first() data = { "is_approved": True, } response = self.client.post( reverse( "comment_approve", args=( self.comment.post.slug, self.comment.id, ), ), HTTP_HOST=f"{self.user.username}.{settings.CANONICAL_HOST}", data=data, ) self.assertEqual(response.status_code, 403) self.assertEqual(models.Comment.objects.all().count(), 1) self.assertEqual(models.Comment.objects.all().first().is_approved, False) class CommentsApproveNonOwnerTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice", comments_on=True) self.post = models.Post.objects.create( owner=self.user, title="Welcome post", slug="welcome-post", body="Content sentence.", published_at="2020-02-06", ) data = { "body": "Hey, I am a comment.", } self.client.post( reverse("comment_create", args=(self.post.slug,)), HTTP_HOST="alice." + settings.CANONICAL_HOST, data=data, ) self.assertEqual(models.Comment.objects.all().count(), 1) def test_comment_approve_not_owner(self): self.comment = models.Comment.objects.all().first() self.second_user = models.User.objects.create(username="bob", comments_on=True) self.client.force_login(self.second_user) data = { "is_approved": True, } response = self.client.post( reverse( "comment_approve", args=( self.comment.post.slug, self.comment.id, ), ), HTTP_HOST=f"{self.user.username}.{settings.CANONICAL_HOST}", data=data, ) self.assertEqual(response.status_code, 403) self.assertEqual(models.Comment.objects.all().count(), 1) self.assertEqual(models.Comment.objects.all().first().is_approved, False) class CommentsDeleteTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice", comments_on=True) self.post = models.Post.objects.create( owner=self.user, title="Welcome post", slug="welcome-post", body="Content sentence.", published_at="2020-02-06", ) data = { "body": "Hey, I am a comment.", } self.client.post( reverse("comment_create", args=(self.post.slug,)), HTTP_HOST="alice." + settings.CANONICAL_HOST, data=data, ) self.assertEqual(models.Comment.objects.all().count(), 1) def test_comment_delete(self): self.comment = models.Comment.objects.all().first() self.client.force_login(self.user) response = self.client.post( reverse( "comment_delete", args=( self.comment.post.slug, self.comment.id, ), ), HTTP_HOST=f"{self.user.username}.{settings.CANONICAL_HOST}", ) self.assertEqual(response.status_code, 302) self.assertEqual(models.Comment.objects.all().count(), 0) class CommentsDeleteNoAuthTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice", comments_on=True) self.post = models.Post.objects.create( owner=self.user, title="Welcome post", slug="welcome-post", body="Content sentence.", published_at="2020-02-06", ) data = { "body": "Hey, I am a comment.", } self.client.post( reverse("comment_create", args=(self.post.slug,)), HTTP_HOST="alice." + settings.CANONICAL_HOST, data=data, ) self.assertEqual(models.Comment.objects.all().count(), 1) def test_comment_delete_not_authorized(self): self.comment = models.Comment.objects.all().first() response = self.client.post( reverse( "comment_delete", args=( self.comment.post.slug, self.comment.id, ), ), HTTP_HOST=f"{self.user.username}.{settings.CANONICAL_HOST}", ) self.assertEqual(response.status_code, 403) self.assertEqual(models.Comment.objects.all().count(), 1) class CommentsDeleteNonOwnerTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice", comments_on=True) self.post = models.Post.objects.create( owner=self.user, title="Welcome post", slug="welcome-post", body="Content sentence.", published_at="2020-02-06", ) data = { "body": "Hey, I am a comment.", } self.client.post( reverse("comment_create", args=(self.post.slug,)), HTTP_HOST="alice." + settings.CANONICAL_HOST, data=data, ) self.assertEqual(models.Comment.objects.all().count(), 1) def test_comment_delete_not_owner(self): self.comment = models.Comment.objects.all().first() self.second_user = models.User.objects.create(username="bob", comments_on=True) self.client.force_login(self.second_user) response = self.client.post( reverse( "comment_delete", args=( self.comment.post.slug, self.comment.id, ), ), HTTP_HOST=f"{self.user.username}.{settings.CANONICAL_HOST}", ) self.assertEqual(response.status_code, 403) self.assertEqual(models.Comment.objects.all().count(), 1)