mirror of
https://github.com/ae-utbm/sith.git
synced 2025-11-15 17:09:21 +00:00
157 lines
5.7 KiB
Python
157 lines
5.7 KiB
Python
from datetime import timedelta
|
|
|
|
import freezegun
|
|
import pytest
|
|
from bs4 import BeautifulSoup
|
|
from django.conf import settings
|
|
from django.contrib.auth.models import Permission
|
|
from django.test import Client
|
|
from django.urls import reverse
|
|
from django.utils.timezone import now
|
|
from model_bakery import baker
|
|
from pytest_django.asserts import assertHTMLEqual, assertRedirects
|
|
|
|
from club.models import Club
|
|
from core.baker_recipes import board_user, subscriber_user
|
|
from core.markdown import markdown
|
|
from core.models import AnonymousUser, Page, PageRev, User
|
|
|
|
|
|
@pytest.mark.django_db
|
|
class TestEditPage:
|
|
def test_edit_page(self, client: Client):
|
|
user = board_user.make()
|
|
page = baker.prepare(Page)
|
|
page.save(force_lock=True)
|
|
page.view_groups.add(user.groups.first())
|
|
page.edit_groups.add(user.groups.first())
|
|
client.force_login(user)
|
|
|
|
url = reverse("core:page_edit", kwargs={"page_name": page._full_name})
|
|
res = client.get(url)
|
|
assert res.status_code == 200
|
|
|
|
res = client.post(url, data={"content": "Hello World"})
|
|
assertRedirects(
|
|
res, reverse("core:page", kwargs={"page_name": page._full_name})
|
|
)
|
|
revision = page.revisions.last()
|
|
assert revision.content == "Hello World"
|
|
|
|
def test_pagerev_reused(self, client):
|
|
"""Test that the previous revision is edited, if same author and small time diff"""
|
|
user = baker.make(User, is_superuser=True)
|
|
page = baker.prepare(Page)
|
|
page.save(force_lock=True)
|
|
first_rev = baker.make(
|
|
PageRev, author=user, page=page, date=now(), content="Hello World"
|
|
)
|
|
client.force_login(user)
|
|
url = reverse("core:page_edit", kwargs={"page_name": page._full_name})
|
|
client.post(url, data={"content": "Hello World!"})
|
|
assert page.revisions.count() == 1
|
|
assert page.revisions.last() == first_rev
|
|
first_rev.refresh_from_db()
|
|
assert first_rev.author == user
|
|
assert first_rev.content == "Hello World!"
|
|
|
|
def test_pagerev_not_reused(self, client):
|
|
"""Test that a new revision is created if too much time
|
|
passed since the last one.
|
|
"""
|
|
user = baker.make(User, is_superuser=True)
|
|
page = baker.prepare(Page)
|
|
page.save(force_lock=True)
|
|
first_rev = baker.make(PageRev, author=user, page=page, date=now())
|
|
client.force_login(user)
|
|
url = reverse("core:page_edit", kwargs={"page_name": page._full_name})
|
|
with freezegun.freeze_time(now() + timedelta(minutes=30)):
|
|
client.post(url, data={"content": "Hello World"})
|
|
assert page.revisions.count() == 2
|
|
assert page.revisions.last() != first_rev
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_page_revision(client: Client):
|
|
"""Test the GET to request to a specific revision page."""
|
|
page = baker.prepare(Page)
|
|
page.save(force_lock=True)
|
|
page.view_groups.add(settings.SITH_GROUP_SUBSCRIBERS_ID)
|
|
revisions = baker.make(
|
|
PageRev, page=page, _quantity=3, content=iter(["foo", "bar", "baz"])
|
|
)
|
|
client.force_login(subscriber_user.make())
|
|
url = reverse(
|
|
"core:page_rev",
|
|
kwargs={"page_name": page._full_name, "rev": revisions[1].id},
|
|
)
|
|
res = client.get(url)
|
|
assert res.status_code == 200
|
|
soup = BeautifulSoup(res.text, "lxml")
|
|
detail_html = soup.find(class_="markdown")
|
|
assertHTMLEqual(detail_html.decode_contents(), markdown(revisions[1].content))
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_page_club_redirection(client: Client):
|
|
club = baker.make(Club)
|
|
url = reverse("core:page", kwargs={"page_name": club.page._full_name})
|
|
res = client.get(url)
|
|
redirection_url = reverse("club:club_view", kwargs={"club_id": club.id})
|
|
assertRedirects(res, redirection_url)
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_page_revision_club_redirection(client: Client):
|
|
client.force_login(subscriber_user.make())
|
|
club = baker.make(Club)
|
|
revisions = baker.make(
|
|
PageRev, page=club.page, _quantity=3, content=iter(["foo", "bar", "baz"])
|
|
)
|
|
url = reverse(
|
|
"core:page_rev",
|
|
kwargs={"page_name": club.page._full_name, "rev": revisions[1].id},
|
|
)
|
|
res = client.get(url)
|
|
redirection_url = reverse(
|
|
"club:club_view_rev", kwargs={"club_id": club.id, "rev_id": revisions[1].id}
|
|
)
|
|
assertRedirects(res, redirection_url)
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_viewable_by():
|
|
# remove existing pages to prevent side effect
|
|
Page.objects.all().delete()
|
|
view_groups = [
|
|
[settings.SITH_GROUP_PUBLIC_ID],
|
|
[settings.SITH_GROUP_PUBLIC_ID, settings.SITH_GROUP_SUBSCRIBERS_ID],
|
|
[settings.SITH_GROUP_SUBSCRIBERS_ID],
|
|
[settings.SITH_GROUP_SUBSCRIBERS_ID, settings.SITH_GROUP_OLD_SUBSCRIBERS_ID],
|
|
[],
|
|
]
|
|
pages = baker.make(Page, _quantity=len(view_groups), _bulk_create=True)
|
|
for page, groups in zip(pages, view_groups, strict=True):
|
|
page.view_groups.set(groups)
|
|
|
|
viewable = Page.objects.viewable_by(AnonymousUser()).values_list("id", flat=True)
|
|
assert set(viewable) == {pages[0].id, pages[1].id}
|
|
|
|
subscriber = subscriber_user.make()
|
|
viewable = Page.objects.viewable_by(subscriber).values_list("id", flat=True)
|
|
assert set(viewable) == {p.id for p in pages[0:4]}
|
|
|
|
root_user = baker.make(
|
|
User, user_permissions=[Permission.objects.get(codename="view_page")]
|
|
)
|
|
viewable = Page.objects.viewable_by(root_user).values_list("id", flat=True)
|
|
assert set(viewable) == {p.id for p in pages}
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_page_list_view(client: Client):
|
|
baker.make(Page, _quantity=10, _bulk_create=True)
|
|
client.force_login(subscriber_user.make())
|
|
res = client.get(reverse("core:page_list"))
|
|
assert res.status_code == 200
|