"""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