kin: KIN-083 Healthcheck claude CLI auth: перед запуском pipeline проверять что claude залогинен (быстрый claude -p 'ok' --output-format json, проверить is_error и 'Not logged in'). Если не залогинен — не запускать pipeline, а показать ошибку 'Claude CLI requires login' в GUI с инструкцией.
This commit is contained in:
parent
a80679ae72
commit
bfc8f1c0bb
18 changed files with 1390 additions and 57 deletions
|
|
@ -280,6 +280,87 @@ def test_add_and_get_modules(conn):
|
|||
assert len(mods) == 1
|
||||
|
||||
|
||||
def test_add_module_created_true_for_new_module(conn):
|
||||
"""KIN-081: add_module возвращает _created=True для нового модуля (INSERT)."""
|
||||
models.create_project(conn, "p1", "P1", "/p1")
|
||||
m = models.add_module(conn, "p1", "api", "backend", "src/api/")
|
||||
assert m["_created"] is True
|
||||
assert m["name"] == "api"
|
||||
|
||||
|
||||
def test_add_module_created_false_for_duplicate_name(conn):
|
||||
"""KIN-081: add_module возвращает _created=False при дублировании по имени (INSERT OR IGNORE).
|
||||
|
||||
UNIQUE constraint — (project_id, name). Второй INSERT с тем же name игнорируется,
|
||||
возвращается существующая запись с _created=False.
|
||||
"""
|
||||
models.create_project(conn, "p1", "P1", "/p1")
|
||||
m1 = models.add_module(conn, "p1", "api", "backend", "src/api/")
|
||||
assert m1["_created"] is True
|
||||
|
||||
# Same name, different path — should be ignored
|
||||
m2 = models.add_module(conn, "p1", "api", "frontend", "src/api-v2/")
|
||||
assert m2["_created"] is False
|
||||
assert m2["name"] == "api"
|
||||
# Only one module in DB
|
||||
assert len(models.get_modules(conn, "p1")) == 1
|
||||
|
||||
|
||||
def test_add_module_duplicate_returns_original_row(conn):
|
||||
"""KIN-081: при дублировании add_module возвращает оригинальную запись (не новые данные)."""
|
||||
models.create_project(conn, "p1", "P1", "/p1")
|
||||
m1 = models.add_module(conn, "p1", "api", "backend", "src/api/",
|
||||
description="original desc")
|
||||
m2 = models.add_module(conn, "p1", "api", "frontend", "src/api-v2/",
|
||||
description="new desc")
|
||||
# Should return original row, not updated one
|
||||
assert m2["type"] == "backend"
|
||||
assert m2["description"] == "original desc"
|
||||
assert m2["id"] == m1["id"]
|
||||
|
||||
|
||||
def test_add_module_same_name_different_projects_are_independent(conn):
|
||||
"""KIN-081: два проекта могут иметь одноимённые модули — UNIQUE per project_id."""
|
||||
models.create_project(conn, "p1", "P1", "/p1")
|
||||
models.create_project(conn, "p2", "P2", "/p2")
|
||||
m1 = models.add_module(conn, "p1", "api", "backend", "src/api/")
|
||||
m2 = models.add_module(conn, "p2", "api", "backend", "src/api/")
|
||||
assert m1["_created"] is True
|
||||
assert m2["_created"] is True
|
||||
assert m1["id"] != m2["id"]
|
||||
|
||||
|
||||
# -- delete_project --
|
||||
|
||||
def test_delete_project_removes_project_record(conn):
|
||||
"""KIN-081: delete_project удаляет запись из таблицы projects."""
|
||||
models.create_project(conn, "p1", "P1", "/p1")
|
||||
assert models.get_project(conn, "p1") is not None
|
||||
models.delete_project(conn, "p1")
|
||||
assert models.get_project(conn, "p1") is None
|
||||
|
||||
|
||||
def test_delete_project_cascades_to_related_tables(conn):
|
||||
"""KIN-081: delete_project удаляет связанные modules, decisions, tasks, agent_logs."""
|
||||
models.create_project(conn, "p1", "P1", "/p1")
|
||||
models.add_module(conn, "p1", "api", "backend", "src/api/")
|
||||
models.add_decision(conn, "p1", "gotcha", "Bug X", "desc")
|
||||
models.create_task(conn, "P1-001", "p1", "Task")
|
||||
models.log_agent_run(conn, "p1", "developer", "implement", task_id="P1-001")
|
||||
|
||||
models.delete_project(conn, "p1")
|
||||
|
||||
assert conn.execute("SELECT COUNT(*) FROM modules WHERE project_id='p1'").fetchone()[0] == 0
|
||||
assert conn.execute("SELECT COUNT(*) FROM decisions WHERE project_id='p1'").fetchone()[0] == 0
|
||||
assert conn.execute("SELECT COUNT(*) FROM tasks WHERE project_id='p1'").fetchone()[0] == 0
|
||||
assert conn.execute("SELECT COUNT(*) FROM agent_logs WHERE project_id='p1'").fetchone()[0] == 0
|
||||
|
||||
|
||||
def test_delete_project_nonexistent_does_not_raise(conn):
|
||||
"""KIN-081: delete_project на несуществующий проект не бросает исключение."""
|
||||
models.delete_project(conn, "nonexistent")
|
||||
|
||||
|
||||
# -- Agent Logs --
|
||||
|
||||
def test_log_agent_run(conn):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue