import unittest from types import SimpleNamespace from unittest.mock import MagicMock from app.crud.process_route import ( assert_route_writable, assert_step_route_writable, is_super_admin_user, ) class TestIsSuperAdminUser(unittest.TestCase): def test_super_admin(self): self.assertTrue(is_super_admin_user({"role": "super_admin"})) def test_admin_not_super(self): self.assertFalse(is_super_admin_user({"role": "admin"})) def test_none(self): self.assertFalse(is_super_admin_user(None)) class TestAssertRouteWritable(unittest.TestCase): def test_missing_route(self): db = MagicMock() db.query.return_value.filter.return_value.first.return_value = None with self.assertRaisesRegex(ValueError, "路线不存在"): assert_route_writable(db, "r1", {"role": "admin"}) def test_builtin_blocks_non_super(self): db = MagicMock() route = SimpleNamespace(id="r1", is_builtin="1", route_id=None) db.query.return_value.filter.return_value.first.return_value = route with self.assertRaisesRegex(ValueError, "内置模版"): assert_route_writable(db, "r1", {"role": "admin"}) def test_builtin_allows_super(self): db = MagicMock() route = SimpleNamespace(id="r1", is_builtin="1") db.query.return_value.filter.return_value.first.return_value = route self.assertIs(assert_route_writable(db, "r1", {"role": "super_admin"}), route) def test_normal_allows_admin(self): db = MagicMock() route = SimpleNamespace(id="r1", is_builtin="0") db.query.return_value.filter.return_value.first.return_value = route self.assertIs(assert_route_writable(db, "r1", {"role": "admin"}), route) class TestAssertStepRouteWritable(unittest.TestCase): def test_missing_step(self): db = MagicMock() db.query.return_value.filter.return_value.first.return_value = None with self.assertRaisesRegex(ValueError, "步骤不存在"): assert_step_route_writable(db, "s1", {"role": "admin"}) if __name__ == "__main__": unittest.main()