test_delete_guard.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. """delete_guard 单元测试。"""
  2. from __future__ import annotations
  3. from types import SimpleNamespace
  4. import pytest
  5. from fastapi import HTTPException
  6. from app.core.delete_guard import (
  7. assert_row_deletable_by_creator,
  8. can_delete_by_creator,
  9. row_creator_id,
  10. )
  11. def test_row_creator_id_from_object():
  12. row = SimpleNamespace(create_by="u-1")
  13. assert row_creator_id(row) == "u-1"
  14. def test_creator_can_delete():
  15. row = SimpleNamespace(create_by="u-1")
  16. assert can_delete_by_creator(row, {"user_id": "u-1", "role": "admin"}) is True
  17. def test_non_creator_cannot_delete():
  18. row = SimpleNamespace(create_by="u-1")
  19. assert can_delete_by_creator(row, {"user_id": "u-2", "role": "admin"}) is False
  20. def test_super_admin_can_delete_any():
  21. row = SimpleNamespace(create_by="u-1")
  22. assert can_delete_by_creator(row, {"user_id": "u-2", "role": "super_admin"}) is True
  23. def test_empty_create_by_only_super_admin():
  24. row = SimpleNamespace(create_by="")
  25. assert can_delete_by_creator(row, {"user_id": "u-2", "role": "admin"}) is False
  26. assert can_delete_by_creator(row, {"user_id": "u-2", "role": "super_admin"}) is True
  27. def test_assert_raises_for_non_creator():
  28. row = SimpleNamespace(create_by="u-1")
  29. with pytest.raises(HTTPException) as exc:
  30. assert_row_deletable_by_creator(row, {"user_id": "u-2"})
  31. assert exc.value.status_code == 403
  32. def test_legacy_name_match():
  33. row = SimpleNamespace(create_by="张三")
  34. assert can_delete_by_creator(row, {"user_id": "u-2", "real_name": "张三"}) is True