75 lines
2.7 KiB
Python
75 lines
2.7 KiB
Python
import pytest
|
|
from taggit.models import Tag
|
|
from wagtail.models import Site
|
|
|
|
from apps.blog.models import ArticleIndexPage, ArticlePage, HomePage, TagMetadata
|
|
from apps.blog.tests.factories import AuthorFactory
|
|
|
|
|
|
def _build_article_tree(home_page: HomePage, count: int = 12):
|
|
index = ArticleIndexPage(title="Articles", slug="articles")
|
|
home_page.add_child(instance=index)
|
|
author = AuthorFactory()
|
|
tag = Tag.objects.create(name="Bench", slug="bench")
|
|
TagMetadata.objects.create(tag=tag, colour="cyan")
|
|
|
|
for n in range(count):
|
|
article = ArticlePage(
|
|
title=f"Article {n}",
|
|
slug=f"article-{n}",
|
|
author=author,
|
|
summary="summary",
|
|
body=[("rich_text", "<p>body words</p>")],
|
|
)
|
|
index.add_child(instance=article)
|
|
article.tags.add(tag)
|
|
article.save_revision().publish()
|
|
return index
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_homepage_query_budget(rf, home_page, django_assert_num_queries):
|
|
_build_article_tree(home_page, count=8)
|
|
request = rf.get("/")
|
|
request.site = Site.objects.get(is_default_site=True)
|
|
with django_assert_num_queries(10, exact=False):
|
|
context = home_page.get_context(request)
|
|
list(context["latest_articles"])
|
|
list(context["more_articles"])
|
|
assert len(context["latest_articles"]) <= 5
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_article_index_query_budget(rf, home_page, django_assert_num_queries):
|
|
index = _build_article_tree(home_page, count=12)
|
|
request = rf.get("/articles/")
|
|
request.site = Site.objects.get(is_default_site=True)
|
|
with django_assert_num_queries(12, exact=False):
|
|
context = index.get_context(request)
|
|
list(context["articles"])
|
|
list(context["available_tags"])
|
|
assert context["paginator"].count == 12
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_article_read_query_budget(rf, home_page, django_assert_num_queries):
|
|
index = _build_article_tree(home_page, count=4)
|
|
article = ArticlePage.objects.child_of(index).live().first()
|
|
assert article is not None
|
|
request = rf.get(article.url)
|
|
request.site = Site.objects.get(is_default_site=True)
|
|
with django_assert_num_queries(8, exact=False):
|
|
context = article.get_context(request)
|
|
list(context["related_articles"])
|
|
list(context["approved_comments"])
|
|
assert context["related_articles"] is not None
|
|
|
|
|
|
def test_read_time_benchmark(benchmark):
|
|
author = AuthorFactory.build()
|
|
body = [("rich_text", "<p>" + "word " * 1000 + "</p>")]
|
|
article = ArticlePage(title="Bench", slug="bench", author=author, summary="summary", body=body)
|
|
|
|
result = benchmark(article._compute_read_time)
|
|
assert result >= 1
|