Skip to content

Commit

Permalink
Add tests for edit thread permission check
Browse files Browse the repository at this point in the history
  • Loading branch information
rafalp committed Sep 25, 2024
1 parent fff5d09 commit ea4e89d
Show file tree
Hide file tree
Showing 3 changed files with 147 additions and 4 deletions.
144 changes: 144 additions & 0 deletions misago/permissions/tests/test_threads_permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from ..models import CategoryGroupPermission, Moderator
from ..proxy import UserPermissionsProxy
from ..threads import (
check_edit_thread_permission,
check_post_in_closed_category_permission,
check_post_in_closed_thread_permission,
check_reply_thread_permission,
Expand All @@ -14,6 +15,149 @@
)


def test_check_edit_thread_permission_passes_if_user_is_starter(
user, user_thread, cache_versions, default_category
):
permissions = UserPermissionsProxy(user, cache_versions)
check_edit_thread_permission(permissions, default_category, user_thread)


def test_check_edit_thread_permission_passes_if_user_is_starter_in_time_limit(
user, user_thread, cache_versions, default_category
):
user.group.own_threads_edit_time_limit = 5
user.group.save()

permissions = UserPermissionsProxy(user, cache_versions)
check_edit_thread_permission(permissions, default_category, user_thread)


def test_check_edit_thread_permission_fails_if_user_is_not_starter(
user, thread, cache_versions, default_category
):
permissions = UserPermissionsProxy(user, cache_versions)

with pytest.raises(PermissionDenied):
check_edit_thread_permission(permissions, default_category, thread)


def test_check_edit_thread_permission_fails_if_user_is_starter_out_of_time_limit(
user, user_thread, cache_versions, default_category
):
user.group.own_threads_edit_time_limit = 1
user.group.save()

user_thread.started_on = user_thread.started_on.replace(year=2015)
user_thread.save()

permissions = UserPermissionsProxy(user, cache_versions)

with pytest.raises(PermissionDenied):
check_edit_thread_permission(permissions, default_category, user_thread)


def test_check_edit_thread_permission_fails_if_category_is_closed(
user, user_thread, cache_versions, default_category
):
default_category.is_closed = True
default_category.save()

permissions = UserPermissionsProxy(user, cache_versions)

with pytest.raises(PermissionDenied):
check_edit_thread_permission(permissions, default_category, user_thread)


def test_check_edit_thread_permission_fails_if_thread_is_closed(
user, user_thread, cache_versions, default_category
):
user_thread.is_closed = True
user_thread.save()

permissions = UserPermissionsProxy(user, cache_versions)

with pytest.raises(PermissionDenied):
check_edit_thread_permission(permissions, default_category, user_thread)


def test_check_edit_thread_in_closed_category_permission_passes_if_user_is_global_moderator(
moderator, user_thread, cache_versions, default_category
):
default_category.is_closed = True
default_category.save()

permissions = UserPermissionsProxy(moderator, cache_versions)
check_edit_thread_permission(permissions, default_category, user_thread)


def test_check_edit_thread_in_closed_category_permission_passes_if_user_is_category_moderator(
user, thread, cache_versions, default_category
):
Moderator.objects.create(
user=user,
is_global=False,
categories=[default_category.id],
)

default_category.is_closed = True
default_category.save()

permissions = UserPermissionsProxy(user, cache_versions)
check_edit_thread_permission(permissions, default_category, thread)


def test_check_edit_thread_closed_permission_passes_if_user_is_global_moderator(
moderator, user_thread, cache_versions, default_category
):
user_thread.is_closed = True
user_thread.save()

permissions = UserPermissionsProxy(moderator, cache_versions)
check_edit_thread_permission(permissions, default_category, user_thread)


def test_check_edit_thread_closed_permission_passes_if_user_is_category_moderator(
user, thread, cache_versions, default_category
):
Moderator.objects.create(
user=user,
is_global=False,
categories=[default_category.id],
)

thread.is_closed = True
thread.save()

permissions = UserPermissionsProxy(user, cache_versions)
check_edit_thread_permission(permissions, default_category, thread)


def test_check_edit_thread_out_of_time_permission_passes_if_user_is_global_moderator(
moderator, thread, cache_versions, default_category
):
thread.started_on = thread.started_on.replace(year=2015)
thread.save()

permissions = UserPermissionsProxy(moderator, cache_versions)
check_edit_thread_permission(permissions, default_category, thread)


def test_check_edit_thread_out_of_time_permission_passes_if_user_is_category_moderator(
user, thread, cache_versions, default_category
):
Moderator.objects.create(
user=user,
is_global=False,
categories=[default_category.id],
)

thread.started_on = thread.started_on.replace(year=2015)
thread.save()

permissions = UserPermissionsProxy(user, cache_versions)
check_edit_thread_permission(permissions, default_category, thread)


def test_check_post_in_closed_category_permission_passes_if_category_is_open(
user, cache_versions, default_category
):
Expand Down
2 changes: 2 additions & 0 deletions misago/permissions/threads/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from .checks import (
check_edit_thread_permission,
check_post_in_closed_category_permission,
check_post_in_closed_thread_permission,
check_reply_thread_permission,
Expand All @@ -15,6 +16,7 @@
__all__ = [
"CategoryThreadsQuerysetFilter",
"ThreadsQuerysetFilter",
"check_edit_thread_permission",
"check_post_in_closed_category_permission",
"check_post_in_closed_thread_permission",
"check_reply_thread_permission",
Expand Down
5 changes: 1 addition & 4 deletions misago/permissions/threads/checks.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,10 +210,7 @@ def _check_edit_thread_permission_action(

time_limit = permissions.own_threads_edit_time_limit * 60

if (
permissions.own_threads_edit_time_limit
and (timezone.now() - thread.started_on).seconds > time_limit
):
if time_limit and (timezone.now() - thread.started_on).total_seconds() > time_limit:
raise PermissionDenied(
npgettext(
"threads permission error",
Expand Down

0 comments on commit ea4e89d

Please sign in to comment.