Update
This commit is contained in:
+212
-2
@@ -1,14 +1,18 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
|
||||
from datetime import datetime, timezone
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from devplacepy.content import (
|
||||
is_owner,
|
||||
can_view_project,
|
||||
can_manage_instance,
|
||||
can_view_instance,
|
||||
can_view_project_containers,
|
||||
canonical_redirect,
|
||||
first_image_url,
|
||||
enrich_items,
|
||||
owns_instance,
|
||||
)
|
||||
from devplacepy.database import get_table, get_users_by_uids
|
||||
from devplacepy.database import get_table, get_users_by_uids, invalidate_admins_cache
|
||||
from devplacepy.utils import generate_uid
|
||||
import time
|
||||
import pytest
|
||||
@@ -145,6 +149,212 @@ def test_can_view_admin_private_visible_to_owner_admin_only(local_db):
|
||||
assert can_view_project(project, None) is False
|
||||
|
||||
|
||||
def _make_user_at(role, created_at):
|
||||
uid = generate_uid()
|
||||
username = f"cv_{uid[:8]}"
|
||||
get_table("users").insert(
|
||||
{
|
||||
"uid": uid,
|
||||
"username": username,
|
||||
"email": f"{username}@t.dev",
|
||||
"role": role,
|
||||
"created_at": created_at.isoformat(),
|
||||
}
|
||||
)
|
||||
invalidate_admins_cache()
|
||||
return get_table("users").find_one(uid=uid)
|
||||
|
||||
|
||||
def _demote_existing_admins():
|
||||
existing = [r["uid"] for r in get_table("users").find(role="Admin")]
|
||||
for uid in existing:
|
||||
get_table("users").update({"uid": uid, "role": "Member"}, ["uid"])
|
||||
invalidate_admins_cache()
|
||||
return existing
|
||||
|
||||
|
||||
def _restore_admins(uids):
|
||||
for uid in uids:
|
||||
get_table("users").update({"uid": uid, "role": "Admin"}, ["uid"])
|
||||
invalidate_admins_cache()
|
||||
|
||||
|
||||
def _purge_users(*rows):
|
||||
for row in rows:
|
||||
if row:
|
||||
get_table("users").delete(uid=row["uid"])
|
||||
|
||||
|
||||
def test_owns_instance_true_for_creator():
|
||||
owner = {"uid": "cnt-u1"}
|
||||
other = {"uid": "cnt-u2"}
|
||||
instance = {"created_by": owner["uid"]}
|
||||
project = {"user_uid": other["uid"]}
|
||||
assert owns_instance(instance, project, owner) is True
|
||||
assert owns_instance(instance, project, other) is False
|
||||
|
||||
|
||||
def test_owns_instance_true_for_project_owner():
|
||||
owner = {"uid": "cnt-u1"}
|
||||
creator = {"uid": "cnt-u2"}
|
||||
instance = {"created_by": creator["uid"]}
|
||||
project = {"user_uid": owner["uid"]}
|
||||
assert owns_instance(instance, project, owner) is True
|
||||
|
||||
|
||||
def test_owns_instance_false_when_missing_data():
|
||||
assert owns_instance(None, {}, {"uid": "cnt-u1"}) is False
|
||||
assert owns_instance({"created_by": "cnt-u1"}, {}, None) is False
|
||||
assert owns_instance({"created_by": "cnt-u1"}, {}, {}) is False
|
||||
assert owns_instance({"created_by": "cnt-u1"}, None, {"uid": "cnt-u2"}) is False
|
||||
|
||||
|
||||
def test_can_view_project_containers_requires_admin(local_db):
|
||||
owner = _make_user()
|
||||
project = {"user_uid": owner["uid"], "is_private": 0}
|
||||
try:
|
||||
assert can_view_project_containers(project, owner) is False
|
||||
assert can_view_project_containers(project, None) is False
|
||||
assert can_view_project_containers(None, owner) is False
|
||||
finally:
|
||||
_purge_users(owner)
|
||||
|
||||
|
||||
def test_can_view_project_containers_public_visible_to_any_admin(local_db):
|
||||
restore = _demote_existing_admins()
|
||||
owner_admin = other_admin = None
|
||||
try:
|
||||
base = datetime.now(timezone.utc)
|
||||
owner_admin = _make_user_at("Admin", base)
|
||||
other_admin = _make_user_at("Admin", base + timedelta(seconds=1))
|
||||
project = {"user_uid": owner_admin["uid"], "is_private": 0}
|
||||
assert can_view_project_containers(project, owner_admin) is True
|
||||
assert can_view_project_containers(project, other_admin) is True
|
||||
finally:
|
||||
_purge_users(owner_admin, other_admin)
|
||||
_restore_admins(restore)
|
||||
|
||||
|
||||
def test_can_view_project_containers_private_hidden_from_other_admin(local_db):
|
||||
restore = _demote_existing_admins()
|
||||
owner_admin = other_admin = None
|
||||
try:
|
||||
base = datetime.now(timezone.utc)
|
||||
owner_admin = _make_user_at("Admin", base)
|
||||
other_admin = _make_user_at("Admin", base + timedelta(seconds=1))
|
||||
project = {"user_uid": owner_admin["uid"], "is_private": 1}
|
||||
assert can_view_project_containers(project, owner_admin) is True
|
||||
assert can_view_project_containers(project, other_admin) is False
|
||||
finally:
|
||||
_purge_users(owner_admin, other_admin)
|
||||
_restore_admins(restore)
|
||||
|
||||
|
||||
def test_can_view_project_containers_primary_admin_sees_all(local_db):
|
||||
restore = _demote_existing_admins()
|
||||
primary = other_admin = None
|
||||
try:
|
||||
base = datetime.now(timezone.utc)
|
||||
primary = _make_user_at("Admin", base)
|
||||
other_admin = _make_user_at("Admin", base + timedelta(seconds=1))
|
||||
project = {"user_uid": other_admin["uid"], "is_private": 1}
|
||||
assert can_view_project_containers(project, primary) is True
|
||||
finally:
|
||||
_purge_users(primary, other_admin)
|
||||
_restore_admins(restore)
|
||||
|
||||
|
||||
def test_can_view_instance_requires_admin(local_db):
|
||||
owner = _make_user()
|
||||
instance = {"created_by": owner["uid"], "project_uid": "p1"}
|
||||
project = {"user_uid": owner["uid"], "is_private": 0}
|
||||
try:
|
||||
assert can_view_instance(instance, project, owner) is False
|
||||
assert can_manage_instance(instance, project, owner) is False
|
||||
finally:
|
||||
_purge_users(owner)
|
||||
|
||||
|
||||
def test_can_view_instance_owner_sees_own_private_hidden_from_other_admin(local_db):
|
||||
restore = _demote_existing_admins()
|
||||
owner_admin = other_admin = None
|
||||
try:
|
||||
base = datetime.now(timezone.utc)
|
||||
owner_admin = _make_user_at("Admin", base)
|
||||
other_admin = _make_user_at("Admin", base + timedelta(seconds=1))
|
||||
project = {"user_uid": owner_admin["uid"], "is_private": 1}
|
||||
instance = {"created_by": owner_admin["uid"], "project_uid": "p1"}
|
||||
assert can_view_instance(instance, project, owner_admin) is True
|
||||
assert can_view_instance(instance, project, other_admin) is False
|
||||
finally:
|
||||
_purge_users(owner_admin, other_admin)
|
||||
_restore_admins(restore)
|
||||
|
||||
|
||||
def test_can_view_instance_public_project_visible_to_any_admin(local_db):
|
||||
restore = _demote_existing_admins()
|
||||
creator = other_admin = None
|
||||
try:
|
||||
base = datetime.now(timezone.utc)
|
||||
creator = _make_user_at("Admin", base)
|
||||
other_admin = _make_user_at("Admin", base + timedelta(seconds=1))
|
||||
project = {"user_uid": creator["uid"], "is_private": 0}
|
||||
instance = {"created_by": creator["uid"], "project_uid": "p1"}
|
||||
assert can_view_instance(instance, project, other_admin) is True
|
||||
finally:
|
||||
_purge_users(creator, other_admin)
|
||||
_restore_admins(restore)
|
||||
|
||||
|
||||
def test_can_view_instance_primary_admin_sees_others_private_instance(local_db):
|
||||
restore = _demote_existing_admins()
|
||||
primary = owner_admin = None
|
||||
try:
|
||||
base = datetime.now(timezone.utc)
|
||||
primary = _make_user_at("Admin", base)
|
||||
owner_admin = _make_user_at("Admin", base + timedelta(seconds=1))
|
||||
project = {"user_uid": owner_admin["uid"], "is_private": 1}
|
||||
instance = {"created_by": owner_admin["uid"], "project_uid": "p1"}
|
||||
assert can_view_instance(instance, project, primary) is True
|
||||
finally:
|
||||
_purge_users(primary, owner_admin)
|
||||
_restore_admins(restore)
|
||||
|
||||
|
||||
def test_can_manage_instance_only_owner_or_primary_admin(local_db):
|
||||
restore = _demote_existing_admins()
|
||||
primary = owner_admin = other_admin = None
|
||||
try:
|
||||
base = datetime.now(timezone.utc)
|
||||
primary = _make_user_at("Admin", base)
|
||||
owner_admin = _make_user_at("Admin", base + timedelta(seconds=1))
|
||||
other_admin = _make_user_at("Admin", base + timedelta(seconds=2))
|
||||
project = {"user_uid": owner_admin["uid"], "is_private": 1}
|
||||
instance = {"created_by": owner_admin["uid"], "project_uid": "p1"}
|
||||
assert can_manage_instance(instance, project, owner_admin) is True
|
||||
assert can_manage_instance(instance, project, primary) is True
|
||||
assert can_manage_instance(instance, project, other_admin) is False
|
||||
finally:
|
||||
_purge_users(primary, owner_admin, other_admin)
|
||||
_restore_admins(restore)
|
||||
|
||||
|
||||
def test_can_manage_instance_other_admin_denied_even_on_public_project(local_db):
|
||||
restore = _demote_existing_admins()
|
||||
owner_admin = other_admin = None
|
||||
try:
|
||||
base = datetime.now(timezone.utc)
|
||||
owner_admin = _make_user_at("Admin", base)
|
||||
other_admin = _make_user_at("Admin", base + timedelta(seconds=1))
|
||||
project = {"user_uid": owner_admin["uid"], "is_private": 0}
|
||||
instance = {"created_by": owner_admin["uid"], "project_uid": "p1"}
|
||||
assert can_view_instance(instance, project, other_admin) is True
|
||||
assert can_manage_instance(instance, project, other_admin) is False
|
||||
finally:
|
||||
_purge_users(owner_admin, other_admin)
|
||||
_restore_admins(restore)
|
||||
|
||||
|
||||
def test_canonical_redirect_when_slug_differs():
|
||||
item = {"slug": "abcd1234-title", "uid": "abcd1234"}
|
||||
assert canonical_redirect("posts", item, "abcd1234-title") is None
|
||||
|
||||
Reference in New Issue
Block a user