Add Docker-executed pytest suite with >90% coverage
This commit is contained in:
0
apps/comments/tests/__init__.py
Normal file
0
apps/comments/tests/__init__.py
Normal file
40
apps/comments/tests/test_models.py
Normal file
40
apps/comments/tests/test_models.py
Normal file
@@ -0,0 +1,40 @@
|
||||
import pytest
|
||||
from django.core.exceptions import ValidationError
|
||||
|
||||
from apps.blog.models import ArticleIndexPage, ArticlePage
|
||||
from apps.blog.tests.factories import AuthorFactory
|
||||
from apps.comments.models import Comment
|
||||
|
||||
|
||||
def create_article(home):
|
||||
index = ArticleIndexPage(title="Articles", slug="articles")
|
||||
home.add_child(instance=index)
|
||||
author = AuthorFactory()
|
||||
article = ArticlePage(title="A", slug="a", author=author, summary="s", body=[("rich_text", "<p>body</p>")])
|
||||
index.add_child(instance=article)
|
||||
article.save_revision().publish()
|
||||
return article
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_comment_defaults_and_absolute_url(home_page):
|
||||
article = create_article(home_page)
|
||||
comment = Comment.objects.create(article=article, author_name="N", author_email="n@example.com", body="hello")
|
||||
assert comment.is_approved is False
|
||||
assert comment.get_absolute_url().endswith(f"#comment-{comment.id}")
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_reply_depth_validation(home_page):
|
||||
article = create_article(home_page)
|
||||
parent = Comment.objects.create(article=article, author_name="P", author_email="p@example.com", body="p")
|
||||
child = Comment.objects.create(
|
||||
article=article,
|
||||
author_name="C",
|
||||
author_email="c@example.com",
|
||||
body="c",
|
||||
parent=parent,
|
||||
)
|
||||
nested = Comment(article=article, author_name="X", author_email="x@example.com", body="x", parent=child)
|
||||
with pytest.raises(ValidationError):
|
||||
nested.clean()
|
||||
26
apps/comments/tests/test_more.py
Normal file
26
apps/comments/tests/test_more.py
Normal file
@@ -0,0 +1,26 @@
|
||||
import pytest
|
||||
from django.core.cache import cache
|
||||
|
||||
from apps.comments.forms import CommentForm
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_comment_form_rejects_blank_body():
|
||||
form = CommentForm(data={"author_name": "A", "author_email": "a@a.com", "body": " ", "article_id": 1})
|
||||
assert not form.is_valid()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_comment_rate_limit(client, article_page):
|
||||
cache.clear()
|
||||
payload = {
|
||||
"article_id": article_page.id,
|
||||
"author_name": "T",
|
||||
"author_email": "t@example.com",
|
||||
"body": "Hi",
|
||||
"honeypot": "",
|
||||
}
|
||||
for _ in range(3):
|
||||
client.post("/comments/post/", payload)
|
||||
resp = client.post("/comments/post/", payload)
|
||||
assert resp.status_code == 429
|
||||
61
apps/comments/tests/test_views.py
Normal file
61
apps/comments/tests/test_views.py
Normal file
@@ -0,0 +1,61 @@
|
||||
import pytest
|
||||
from django.core.cache import cache
|
||||
|
||||
from apps.blog.models import ArticleIndexPage, ArticlePage
|
||||
from apps.blog.tests.factories import AuthorFactory
|
||||
from apps.comments.models import Comment
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_comment_post_flow(client, home_page):
|
||||
cache.clear()
|
||||
index = ArticleIndexPage(title="Articles", slug="articles")
|
||||
home_page.add_child(instance=index)
|
||||
author = AuthorFactory()
|
||||
article = ArticlePage(title="A", slug="a", author=author, summary="s", body=[("rich_text", "<p>body</p>")])
|
||||
index.add_child(instance=article)
|
||||
article.save_revision().publish()
|
||||
|
||||
resp = client.post(
|
||||
"/comments/post/",
|
||||
{
|
||||
"article_id": article.id,
|
||||
"author_name": "Test",
|
||||
"author_email": "test@example.com",
|
||||
"body": "Hello",
|
||||
"honeypot": "",
|
||||
},
|
||||
)
|
||||
assert resp.status_code == 302
|
||||
assert Comment.objects.count() == 1
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_comment_post_rejected_when_comments_disabled(client, home_page):
|
||||
cache.clear()
|
||||
index = ArticleIndexPage(title="Articles", slug="articles")
|
||||
home_page.add_child(instance=index)
|
||||
author = AuthorFactory()
|
||||
article = ArticlePage(
|
||||
title="A",
|
||||
slug="a",
|
||||
author=author,
|
||||
summary="s",
|
||||
body=[("rich_text", "<p>body</p>")],
|
||||
comments_enabled=False,
|
||||
)
|
||||
index.add_child(instance=article)
|
||||
article.save_revision().publish()
|
||||
|
||||
resp = client.post(
|
||||
"/comments/post/",
|
||||
{
|
||||
"article_id": article.id,
|
||||
"author_name": "Test",
|
||||
"author_email": "test@example.com",
|
||||
"body": "Hello",
|
||||
"honeypot": "",
|
||||
},
|
||||
)
|
||||
assert resp.status_code == 404
|
||||
assert Comment.objects.count() == 0
|
||||
Reference in New Issue
Block a user