diff --git a/tests/test_cli.py b/tests/test_cli.py index 850e881..2ac77aa 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -211,15 +211,16 @@ def test_cost_with_data(runner): # task update # =========================================================================== -def test_task_update_status(runner): +@pytest.mark.parametrize("status", ["pending", "in_progress", "review", "done", "blocked", "decomposed", "cancelled"]) +def test_task_update_status(runner, status): invoke(runner, ["project", "add", "p1", "P1", "/p1"]) invoke(runner, ["task", "add", "p1", "Fix bug"]) - r = invoke(runner, ["task", "update", "P1-001", "--status", "done"]) + r = invoke(runner, ["task", "update", "P1-001", "--status", status]) assert r.exit_code == 0 - assert "done" in r.output + assert status in r.output r = invoke(runner, ["task", "show", "P1-001"]) - assert "done" in r.output + assert status in r.output def test_task_update_priority(runner): @@ -240,3 +241,83 @@ def test_task_update_no_fields(runner): invoke(runner, ["task", "add", "p1", "Fix bug"]) r = invoke(runner, ["task", "update", "P1-001"]) assert r.exit_code != 0 + + +# =========================================================================== +# hook +# =========================================================================== + +def test_hook_add_and_list(runner): + invoke(runner, ["project", "add", "p1", "P1", "/p1"]) + r = invoke(runner, ["hook", "add", + "--project", "p1", + "--name", "rebuild", + "--event", "pipeline_completed", + "--command", "npm run build"]) + assert r.exit_code == 0 + assert "rebuild" in r.output + assert "pipeline_completed" in r.output + + r = invoke(runner, ["hook", "list", "--project", "p1"]) + assert r.exit_code == 0 + assert "rebuild" in r.output + assert "npm run build" in r.output + + +def test_hook_add_with_module_path(runner): + invoke(runner, ["project", "add", "p1", "P1", "/p1"]) + r = invoke(runner, ["hook", "add", + "--project", "p1", + "--name", "fe-build", + "--event", "pipeline_completed", + "--command", "make build", + "--module-path", "web/frontend/*", + "--working-dir", "/tmp"]) + assert r.exit_code == 0 + r = invoke(runner, ["hook", "list", "--project", "p1"]) + assert "web/frontend/*" in r.output + + +def test_hook_add_project_not_found(runner): + r = invoke(runner, ["hook", "add", + "--project", "nope", + "--name", "x", + "--event", "pipeline_completed", + "--command", "echo hi"]) + assert r.exit_code == 1 + assert "not found" in r.output + + +def test_hook_list_empty(runner): + invoke(runner, ["project", "add", "p1", "P1", "/p1"]) + r = invoke(runner, ["hook", "list", "--project", "p1"]) + assert r.exit_code == 0 + assert "No hooks" in r.output + + +def test_hook_remove(runner): + invoke(runner, ["project", "add", "p1", "P1", "/p1"]) + invoke(runner, ["hook", "add", + "--project", "p1", + "--name", "rebuild", + "--event", "pipeline_completed", + "--command", "make"]) + r = invoke(runner, ["hook", "remove", "1"]) + assert r.exit_code == 0 + assert "Removed" in r.output + + r = invoke(runner, ["hook", "list", "--project", "p1"]) + assert "No hooks" in r.output + + +def test_hook_remove_not_found(runner): + r = invoke(runner, ["hook", "remove", "999"]) + assert r.exit_code == 1 + assert "not found" in r.output + + +def test_hook_logs_empty(runner): + invoke(runner, ["project", "add", "p1", "P1", "/p1"]) + r = invoke(runner, ["hook", "logs", "--project", "p1"]) + assert r.exit_code == 0 + assert "No hook logs" in r.output