From 505f4fae7f310b0110cd6db8010ae3b381cf934c Mon Sep 17 00:00:00 2001 From: cfdaily Date: Sun, 17 May 2026 00:45:39 +0800 Subject: [PATCH] auto-sync: 2026-05-17 00:45:39 --- tests/test_cli.py | 140 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 tests/test_cli.py diff --git a/tests/test_cli.py b/tests/test_cli.py new file mode 100644 index 0000000..25d00f1 --- /dev/null +++ b/tests/test_cli.py @@ -0,0 +1,140 @@ +"""F4 测试:CLI 工具""" + +import json +import os +from pathlib import Path + +import pytest + +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