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", "

body words

")], ) 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", "

" + "word " * 1000 + "

")] article = ArticlePage(title="Bench", slug="bench", author=author, summary="summary", body=body) result = benchmark(article._compute_read_time) assert result >= 1 assert benchmark.stats.stats.mean < 0.05