52 lines
1.5 KiB
Python
52 lines
1.5 KiB
Python
"""delete_guard 单元测试。"""
|
|
from __future__ import annotations
|
|
|
|
from types import SimpleNamespace
|
|
|
|
import pytest
|
|
from fastapi import HTTPException
|
|
|
|
from app.core.delete_guard import (
|
|
assert_row_deletable_by_creator,
|
|
can_delete_by_creator,
|
|
row_creator_id,
|
|
)
|
|
|
|
|
|
def test_row_creator_id_from_object():
|
|
row = SimpleNamespace(create_by="u-1")
|
|
assert row_creator_id(row) == "u-1"
|
|
|
|
|
|
def test_creator_can_delete():
|
|
row = SimpleNamespace(create_by="u-1")
|
|
assert can_delete_by_creator(row, {"user_id": "u-1", "role": "admin"}) is True
|
|
|
|
|
|
def test_non_creator_cannot_delete():
|
|
row = SimpleNamespace(create_by="u-1")
|
|
assert can_delete_by_creator(row, {"user_id": "u-2", "role": "admin"}) is False
|
|
|
|
|
|
def test_super_admin_can_delete_any():
|
|
row = SimpleNamespace(create_by="u-1")
|
|
assert can_delete_by_creator(row, {"user_id": "u-2", "role": "super_admin"}) is True
|
|
|
|
|
|
def test_empty_create_by_only_super_admin():
|
|
row = SimpleNamespace(create_by="")
|
|
assert can_delete_by_creator(row, {"user_id": "u-2", "role": "admin"}) is False
|
|
assert can_delete_by_creator(row, {"user_id": "u-2", "role": "super_admin"}) is True
|
|
|
|
|
|
def test_assert_raises_for_non_creator():
|
|
row = SimpleNamespace(create_by="u-1")
|
|
with pytest.raises(HTTPException) as exc:
|
|
assert_row_deletable_by_creator(row, {"user_id": "u-2"})
|
|
assert exc.value.status_code == 403
|
|
|
|
|
|
def test_legacy_name_match():
|
|
row = SimpleNamespace(create_by="张三")
|
|
assert can_delete_by_creator(row, {"user_id": "u-2", "real_name": "张三"}) is True
|