143 lines
4.6 KiB
Python
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
|