Files
2026-06-05 11:03:30 +08:00

143 lines
4.6 KiB
Python

"""F4 测试:CLI 工具"""
import json
import os
from pathlib import Path
import pytest
pytestmark = pytest.mark.unit
from src.cli.blackboard import run_blackboard_cli, run_admin_cli
from src.blackboard.operations import Blackboard
from src.blackboard.models import Task
@pytest.fixture
def project_env(tmp_path):
"""创建临时项目环境"""
project_root = tmp_path / "projects"
project_root.mkdir()
os.environ["BLACKBOARD_ROOT"] = str(project_root)
# Create a test project with DB
proj_dir = project_root / "test-proj"
proj_dir.mkdir()
bb = Blackboard(proj_dir / "blackboard.db")
bb.create_task(Task(id="t1", title="Existing Task", task_type="coding"))
yield project_root
del os.environ["BLACKBOARD_ROOT"]
class TestBlackboardCLI:
def test_read_all_tasks(self, project_env, capsys):
rc = run_blackboard_cli(["read", "--project", "test-proj"])
assert rc == 0
out = capsys.readouterr().out
assert "t1" in out
def test_read_json(self, project_env, capsys):
rc = run_blackboard_cli(["read", "--project", "test-proj", "--json"])
assert rc == 0
out = capsys.readouterr().out
data = json.loads(out)
assert len(data) == 1
assert data[0]["id"] == "t1"
def test_create_task(self, project_env, capsys):
rc = run_blackboard_cli([
"create", "--project", "test-proj",
"--id", "t2", "--title", "New Task",
"--task-type", "review", "--priority", "3",
])
assert rc == 0
assert "Created task: t2" in capsys.readouterr().out
def test_claim(self, project_env, capsys):
rc = run_blackboard_cli([
"claim", "--project", "test-proj",
"--task-id", "t1", "--agent", "zhangfei-dev",
])
assert rc == 0
def test_output(self, project_env, capsys):
# First claim and start
run_blackboard_cli(["claim", "--project", "test-proj",
"--task-id", "t1", "--agent", "a1"])
rc = run_blackboard_cli([
"output", "--project", "test-proj",
"--task-id", "t1", "--agent", "a1",
"--type", "code", "--title", "main.py",
])
assert rc == 0
def test_comment(self, project_env, capsys):
rc = run_blackboard_cli([
"comment", "--project", "test-proj",
"--task-id", "t1", "--author", "pangtong",
"--body", "Good work", "--type", "general",
"--mentions", "zhangfei-dev,guanyu-dev",
])
assert rc == 0
def test_decide(self, project_env, capsys):
rc = run_blackboard_cli([
"decide", "--project", "test-proj",
"--task-id", "t1", "--decider", "pangtong",
"--decision", "Use FastAPI", "--rationale", "Best async support",
])
assert rc == 0
def test_observe(self, project_env, capsys):
rc = run_blackboard_cli([
"observe", "--project", "test-proj",
"--task-id", "t1", "--observer", "simayi",
"--body", "Potential issue", "--severity", "warning",
])
assert rc == 0
def test_review(self, project_env, capsys):
rc = run_blackboard_cli([
"review", "--project", "test-proj",
"--review-id", "rev-1", "--task-id", "t1",
"--reviewer", "simayi", "--review-type", "output_review",
"--verdict", "approved", "--summary", "LGTM",
"--confidence", "0.9",
])
assert rc == 0
def test_read_nonexistent_task(self, project_env, capsys):
rc = run_blackboard_cli(["read", "--project", "test-proj", "--task-id", "nope"])
assert rc == 1
def test_no_command(self, project_env, capsys):
rc = run_blackboard_cli([])
assert rc == 1
class TestAdminCLI:
def test_project_create(self, tmp_path, capsys):
project_root = tmp_path / "projects"
project_root.mkdir()
os.environ["BLACKBOARD_ROOT"] = str(project_root)
try:
rc = run_admin_cli([
"project-create", "--id", "new-proj",
"--name", "New Project",
"--agents", "agent1,agent2",
])
assert rc == 0
assert (project_root / "new-proj" / "config" / "project.yaml").exists()
finally:
del os.environ["BLACKBOARD_ROOT"]
def test_project_list(self, project_env, capsys):
rc = run_admin_cli(["project-list"])
assert rc == 0
# test-proj is not in registry (created manually), so empty output is fine
def test_no_command(self, project_env, capsys):
rc = run_admin_cli([])
assert rc == 1