mirror of
https://github.com/boostorg/website-v2.git
synced 2026-01-19 04:42:17 +00:00
167 lines
4.8 KiB
Python
167 lines
4.8 KiB
Python
import datetime
|
|
|
|
from django.utils.timezone import now
|
|
from model_bakery import baker
|
|
|
|
from ..forms import BlogPostForm, EntryForm, LinkForm, NewsForm, PollForm, VideoForm
|
|
from ..models import Entry
|
|
|
|
|
|
def test_form_fields():
|
|
form = EntryForm()
|
|
assert sorted(form.fields.keys()) == ["content", "image", "publish_at", "title"]
|
|
|
|
|
|
def test_form_model_creates_entry(make_entry):
|
|
title = "The Title"
|
|
content = "Some content"
|
|
user = baker.make("users.User")
|
|
assert Entry.objects.filter(title=title).count() == 0
|
|
|
|
before = now()
|
|
form = EntryForm(
|
|
instance=None, data={"title": title, "content": content, "publish_at": before}
|
|
)
|
|
assert form.is_valid(), form.errors
|
|
form.instance.author = user
|
|
result = form.save()
|
|
after = now()
|
|
|
|
assert isinstance(result, Entry)
|
|
assert result.pk is not None
|
|
assert before <= result.created_at <= after
|
|
assert before <= result.modified_at <= after
|
|
assert result.publish_at == before
|
|
assert result.approved_at is None
|
|
assert result.title == title
|
|
assert result.content == content
|
|
assert result.author == user
|
|
assert result.moderator is None
|
|
assert result.author_needs_moderation() is True
|
|
assert Entry.objects.get(pk=result.pk) == result
|
|
|
|
|
|
def test_form_model_modifies_entry(make_entry):
|
|
# Guard against runs that are too fast and this modified_at would not change
|
|
right_now = now()
|
|
past = right_now - datetime.timedelta(minutes=1)
|
|
news = make_entry(title="Old title", modified_at=past)
|
|
form = EntryForm(
|
|
instance=news, data={"title": "New title", "publish_at": right_now}
|
|
)
|
|
assert form.is_valid(), form.errors
|
|
|
|
result = form.save()
|
|
|
|
# Modified fields
|
|
assert result.title == "New title"
|
|
assert result.modified_at > past
|
|
# Unchanged fields
|
|
assert result.pk == news.pk
|
|
assert result.created_at == news.created_at
|
|
assert result.approved_at == news.approved_at
|
|
assert result.publish_at == right_now
|
|
assert result.content == news.content
|
|
assert result.author == news.author
|
|
assert result.moderator == news.moderator
|
|
assert result.author_needs_moderation() is True
|
|
|
|
|
|
def test_form_save_unapproved_news_author_needs_moderation(make_entry):
|
|
entry = make_entry(approved=False)
|
|
assert entry.author_needs_moderation() is True
|
|
|
|
form = EntryForm(instance=entry)
|
|
result = form.save()
|
|
|
|
result.refresh_from_db()
|
|
assert not entry.is_approved # No automatic news approval.
|
|
assert entry.author_needs_moderation() is True
|
|
|
|
|
|
def test_form_save_unapproved_news_author_does_not_need_moderation(
|
|
make_entry, settings
|
|
):
|
|
user = baker.make("users.User")
|
|
settings.NEWS_MODERATION_ALLOWLIST = [user.email]
|
|
entry = make_entry(approved=False, author=user)
|
|
assert entry.author_needs_moderation() is False
|
|
|
|
before = now()
|
|
form = EntryForm(instance=entry)
|
|
result = form.save()
|
|
after = now()
|
|
|
|
result.refresh_from_db()
|
|
assert entry.is_approved # Automatic news approval!
|
|
assert entry.author_needs_moderation() is False
|
|
assert before <= result.modified_at <= after
|
|
assert before <= result.approved_at <= after
|
|
assert result.moderator == result.author
|
|
assert Entry.objects.get(pk=result.pk) == result
|
|
|
|
|
|
def test_form_save_approved_news(make_entry, settings):
|
|
entry = make_entry(approved=True)
|
|
assert entry.author_needs_moderation() is True
|
|
|
|
form = EntryForm(instance=entry)
|
|
result = form.save()
|
|
|
|
result.refresh_from_db()
|
|
assert entry.is_approved # No entry status change.
|
|
assert entry.author_needs_moderation() is True
|
|
|
|
# when author can post without moderation, no double approve happens
|
|
settings.NEWS_MODERATION_ALLOWLIST = [entry.author.email]
|
|
assert entry.author_needs_moderation() is False
|
|
|
|
result = form.save()
|
|
result.refresh_from_db()
|
|
assert entry.is_approved # No entry status change and no exception.
|
|
|
|
|
|
def test_blogpost_form():
|
|
form = BlogPostForm()
|
|
assert isinstance(form, EntryForm)
|
|
assert sorted(form.fields.keys()) == ["content", "image", "publish_at", "title"]
|
|
|
|
|
|
def test_link_form():
|
|
form = LinkForm()
|
|
assert isinstance(form, EntryForm)
|
|
assert sorted(form.fields.keys()) == [
|
|
"external_url",
|
|
"image",
|
|
"publish_at",
|
|
"title",
|
|
]
|
|
|
|
|
|
def test_news_form():
|
|
form = NewsForm()
|
|
assert isinstance(form, EntryForm)
|
|
assert sorted(form.fields.keys()) == [
|
|
"content",
|
|
"image",
|
|
"publish_at",
|
|
"title",
|
|
]
|
|
|
|
|
|
def test_poll_form():
|
|
form = PollForm()
|
|
assert isinstance(form, EntryForm)
|
|
assert sorted(form.fields.keys()) == ["content", "image", "publish_at", "title"]
|
|
|
|
|
|
def test_video_form():
|
|
form = VideoForm()
|
|
assert isinstance(form, EntryForm)
|
|
assert sorted(form.fields.keys()) == [
|
|
"external_url",
|
|
"image",
|
|
"publish_at",
|
|
"title",
|
|
]
|