- 50 命令:patrol/health/board/recall/poke/who/inbox/mind/message/team 等 - 异步并行 SSH (asyncio subprocess) - 命令注册表 + @command decorator + 插件扩展架构 - 环境检测 (Mac/VM/agent 身份) - JSON 输出契约 (stdout=成功, stderr=错误 code) - 权限模型 (agent 身份检测 + 环境限制) - pytest 23/23 通过 - deploy-joy.sh 全集群 16 VM 部署脚本 (含 PEP 668 兼容) - 旧 bash 版归档到 archive/commands.bash/ Closes: joy CLI 2.0 迁移
95 lines
2.5 KiB
Python
95 lines
2.5 KiB
Python
"""test_core.py — core 模块测试"""
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent.parent / "src"))
|
|
|
|
|
|
def test_env_singleton():
|
|
from joy.core.env import Env
|
|
e1 = Env()
|
|
e2 = Env()
|
|
assert e1 is e2
|
|
|
|
|
|
def test_env_paths():
|
|
from joy.core.env import Env
|
|
env = Env()
|
|
assert "office" in env.paths
|
|
assert "linuxjoy" in env.paths
|
|
assert env.home.exists()
|
|
|
|
|
|
def test_env_permission():
|
|
from joy.core.env import Env
|
|
env = Env()
|
|
# None 权限 = 所有人可用
|
|
assert env.has_permission(None) is True
|
|
# 当前 identity 在列表中
|
|
assert env.has_permission([env.identity]) is True
|
|
# 不在列表中
|
|
assert env.has_permission(["nonexistent-role"]) is False
|
|
|
|
|
|
def test_env_env_allowed():
|
|
from joy.core.env import Env
|
|
env = Env()
|
|
# None = 全环境
|
|
assert env.env_allowed(None) is True
|
|
# 当前环境
|
|
if env.is_mac:
|
|
assert env.env_allowed(["mac"]) is True
|
|
assert env.env_allowed(["vm"]) is False
|
|
else:
|
|
assert env.env_allowed(["vm"]) is True
|
|
assert env.env_allowed(["mac"]) is False
|
|
|
|
|
|
def test_joy_error_to_json():
|
|
from joy.core.errors import JoyError
|
|
err = JoyError("test error", code="E_TEST", detail="some detail")
|
|
import json
|
|
d = json.loads(err.to_json())
|
|
assert d["error"] == "test error"
|
|
assert d["code"] == "E_TEST"
|
|
assert d["detail"] == "some detail"
|
|
|
|
|
|
def test_joy_usage_error():
|
|
from joy.core.errors import JoyUsageError
|
|
err = JoyUsageError("bad usage")
|
|
import json
|
|
d = json.loads(err.to_json())
|
|
assert d["code"] == "E_USAGE"
|
|
|
|
|
|
def test_ssh_result_ok():
|
|
from joy.core.ssh import SSHResult
|
|
r = SSHResult(vm="test", rc=0, stdout="ok", stderr="")
|
|
assert r.ok is True
|
|
r2 = SSHResult(vm="test", rc=1, stdout="", stderr="fail")
|
|
assert r2.ok is False
|
|
r3 = SSHResult(vm="test", rc=0, stdout="", stderr="", timed_out=True)
|
|
assert r3.ok is False
|
|
|
|
|
|
def test_config_load():
|
|
from joy.core.config import Config
|
|
c = Config()
|
|
# 不存在的 key 返回 default
|
|
assert c.get("nonexistent", "default") == "default"
|
|
|
|
|
|
def test_command_registration():
|
|
"""命令注册 decorator 正常工作"""
|
|
from joy.cli import command, COMMANDS, _import_all_commands
|
|
_import_all_commands()
|
|
# help 应该注册了
|
|
assert "help" in COMMANDS
|
|
assert "patrol" in COMMANDS
|
|
assert "board" in COMMANDS
|
|
assert "recall" in COMMANDS
|
|
assert "message" in COMMANDS
|
|
assert "team" in COMMANDS
|
|
assert "mind" in COMMANDS
|