This repository has been archived on 2023-05-31. You can view files and clone it, but cannot push or open issues or pull requests.
python-blog/src/articles/tests/test_html_views.py
2021-12-31 12:08:35 +01:00

143 lines
4.5 KiB
Python

import pytest
from django.http import HttpResponse
from django.test import Client
from django.urls import reverse
from model_bakery import baker
from pytest_django.fixtures import SettingsWrapper
from articles.models import Article, User
@pytest.mark.django_db()
def test_can_access_list(client: Client, published_article: Article) -> None:
res = client.get(reverse("articles-list"))
assert res.status_code == 200
content = res.content.decode("utf-8")
assert published_article.title in content
assert published_article.get_abstract() not in content
@pytest.mark.django_db()
def test_only_title_shown_on_list(client: Client, author: User) -> None:
title = "This is a very long title mouahahaha"
abstract = "Some abstract"
after = "Some content after abstract"
baker.make(
Article,
title=title,
status=Article.PUBLISHED,
author=author,
content=f"{abstract}\n<!--more-->\n{after}",
)
res = client.get(reverse("articles-list"))
content = res.content.decode("utf-8")
assert title in content
assert abstract not in content
assert after not in content
@pytest.mark.django_db()
def test_access_article_by_slug(client: Client, published_article: Article) -> None:
_test_access_article_by_slug(client, published_article)
def _test_access_article_by_slug(client: Client, item: Article) -> None:
res = client.get(reverse("article-detail", kwargs={"slug": item.slug}))
_assert_article_is_rendered(item, res)
def _assert_article_is_rendered(item: Article, res: HttpResponse) -> None:
assert res.status_code == 200
content = res.content.decode("utf-8")
assert item.title in content
html = item.get_formatted_content
assert html in content
@pytest.mark.django_db()
def test_anonymous_cant_access_draft_detail(
client: Client, unpublished_article: Article
) -> None:
res = client.get(
reverse("article-detail", kwargs={"slug": unpublished_article.slug})
)
assert res.status_code == 404
@pytest.mark.django_db()
def test_anonymous_can_access_draft_detail_with_key(
client: Client, unpublished_article: Article
) -> None:
res = client.get(
reverse("article-detail", kwargs={"slug": unpublished_article.slug})
+ f"?draft_key={unpublished_article.draft_key}"
)
_assert_article_is_rendered(unpublished_article, res)
@pytest.mark.django_db()
def test_user_can_access_draft_detail(
client: Client, author: User, unpublished_article: Article
) -> None:
client.force_login(author)
_test_access_article_by_slug(client, unpublished_article)
@pytest.mark.django_db()
def test_anonymous_cant_access_drafts_list(
client: Client, unpublished_article: Article
) -> None:
res = client.get(reverse("drafts-list"))
assert res.status_code == 302
@pytest.mark.django_db()
def test_user_can_access_drafts_list(
client: Client, author: User, unpublished_article: Article
) -> None:
client.force_login(author)
res = client.get(reverse("drafts-list"))
assert res.status_code == 200
content = res.content.decode("utf-8")
assert unpublished_article.title in content
@pytest.mark.django_db()
def test_has_goatcounter_if_set(client: Client, settings: SettingsWrapper) -> None:
settings.GOATCOUNTER_DOMAIN = "gc.gabnotes.org"
res = client.get(reverse("articles-list"))
content = res.content.decode("utf-8")
assert "data-goatcounter" in content
assert f"{settings.GOATCOUNTER_DOMAIN}/count" in content
@pytest.mark.django_db()
def test_doesnt_have_goatcounter_if_unset(
client: Client, settings: SettingsWrapper
) -> None:
settings.GOATCOUNTER_DOMAIN = None
res = client.get(reverse("articles-list"))
content = res.content.decode("utf-8")
assert "window.goatcounter" not in content
assert f"{settings.GOATCOUNTER_DOMAIN}/count" not in content
@pytest.mark.django_db()
def test_logged_in_user_doesnt_have_goatcounter(
client: Client, author: User, settings: SettingsWrapper
) -> None:
client.force_login(author)
settings.GOATCOUNTER_DOMAIN = "gc.gabnotes.org"
res = client.get(reverse("articles-list"))
content = res.content.decode("utf-8")
assert "window.goatcounter" not in content
assert f"{settings.GOATCOUNTER_DOMAIN}/count" not in content
@pytest.mark.django_db()
def test_image_is_lazy(client: Client, published_article: Article) -> None:
res = client.get(reverse("article-detail", kwargs={"slug": published_article.slug}))
assert res.status_code == 200
content = res.content.decode("utf-8")
assert content.count('loading="lazy"') == 2