kin: KIN-FIX-011 Применить glob-детекцию SSH_AUTH_SOCK в web/api.py (_launch_pipeline_subprocess)
This commit is contained in:
parent
376495e88f
commit
2b3caf844f
1 changed files with 109 additions and 0 deletions
109
tests/test_db.py
109
tests/test_db.py
|
|
@ -283,3 +283,112 @@ def test_migrate_acceptance_criteria_is_nullable_after_migration():
|
||||||
row = conn.execute("SELECT acceptance_criteria FROM tasks WHERE id='tm'").fetchone()
|
row = conn.execute("SELECT acceptance_criteria FROM tasks WHERE id='tm'").fetchone()
|
||||||
assert row["acceptance_criteria"] is None
|
assert row["acceptance_criteria"] is None
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Regression KIN-FIX-014: guard "if pipelines in existing_tables"
|
||||||
|
# Финальный UPDATE pipelines в _migrate не должен падать на схемах без этой таблицы.
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def _old_schema_with_pipelines_conn() -> sqlite3.Connection:
|
||||||
|
"""Минимальная схема С таблицей pipelines (dept_sub + running записи)."""
|
||||||
|
conn = sqlite3.connect(":memory:")
|
||||||
|
conn.row_factory = sqlite3.Row
|
||||||
|
conn.executescript("""
|
||||||
|
CREATE TABLE projects (
|
||||||
|
id TEXT PRIMARY KEY,
|
||||||
|
name TEXT NOT NULL,
|
||||||
|
path TEXT,
|
||||||
|
status TEXT DEFAULT 'active',
|
||||||
|
language TEXT DEFAULT 'ru',
|
||||||
|
execution_mode TEXT NOT NULL DEFAULT 'review'
|
||||||
|
);
|
||||||
|
CREATE TABLE tasks (
|
||||||
|
id TEXT PRIMARY KEY,
|
||||||
|
project_id TEXT NOT NULL,
|
||||||
|
title TEXT NOT NULL,
|
||||||
|
status TEXT DEFAULT 'pending',
|
||||||
|
execution_mode TEXT
|
||||||
|
);
|
||||||
|
CREATE TABLE pipelines (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
task_id TEXT NOT NULL,
|
||||||
|
project_id TEXT NOT NULL,
|
||||||
|
route_type TEXT NOT NULL,
|
||||||
|
steps TEXT NOT NULL DEFAULT '[]',
|
||||||
|
status TEXT DEFAULT 'running'
|
||||||
|
);
|
||||||
|
""")
|
||||||
|
conn.commit()
|
||||||
|
return conn
|
||||||
|
|
||||||
|
|
||||||
|
def test_migrate_without_pipelines_table_does_not_raise():
|
||||||
|
"""Regression KIN-FIX-014: _migrate на схеме без таблицы pipelines не бросает исключение.
|
||||||
|
|
||||||
|
До фикса: безусловный UPDATE pipelines падал с 'no such table: pipelines'
|
||||||
|
на тест-фикстурах с минимальной схемой (только projects + tasks).
|
||||||
|
"""
|
||||||
|
conn = _old_schema_conn()
|
||||||
|
try:
|
||||||
|
_migrate(conn)
|
||||||
|
except Exception as exc:
|
||||||
|
pytest.fail(
|
||||||
|
f"_migrate raised {type(exc).__name__} при отсутствии таблицы pipelines: {exc}"
|
||||||
|
)
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
|
def test_migrate_sets_orphaned_dept_sub_running_to_failed():
|
||||||
|
"""_migrate обновляет dept_sub pipelines со статусом 'running' → 'failed'.
|
||||||
|
|
||||||
|
Исправляет призрачные записи от двойного создания пайплайна (KIN-ARCH-012).
|
||||||
|
"""
|
||||||
|
conn = _old_schema_with_pipelines_conn()
|
||||||
|
conn.execute(
|
||||||
|
"INSERT INTO projects (id, name) VALUES ('p1', 'P')"
|
||||||
|
)
|
||||||
|
conn.execute(
|
||||||
|
"INSERT INTO tasks (id, project_id, title) VALUES ('t1', 'p1', 'T')"
|
||||||
|
)
|
||||||
|
conn.execute(
|
||||||
|
"INSERT INTO pipelines (task_id, project_id, route_type, status)"
|
||||||
|
" VALUES ('t1', 'p1', 'dept_sub', 'running')"
|
||||||
|
)
|
||||||
|
conn.commit()
|
||||||
|
|
||||||
|
_migrate(conn)
|
||||||
|
|
||||||
|
row = conn.execute("SELECT status FROM pipelines WHERE route_type = 'dept_sub'").fetchone()
|
||||||
|
assert row["status"] == "failed", (
|
||||||
|
"dept_sub pipeline со статусом 'running' должен стать 'failed' после миграции"
|
||||||
|
)
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
|
def test_migrate_preserves_non_dept_sub_and_non_running_pipelines():
|
||||||
|
"""_migrate не трогает pipelines, которые не являются dept_sub+running."""
|
||||||
|
conn = _old_schema_with_pipelines_conn()
|
||||||
|
conn.execute("INSERT INTO projects (id, name) VALUES ('p2', 'P')")
|
||||||
|
conn.execute("INSERT INTO tasks (id, project_id, title) VALUES ('t2', 'p2', 'T')")
|
||||||
|
# dept_sub но уже completed — не трогать
|
||||||
|
conn.execute(
|
||||||
|
"INSERT INTO pipelines (task_id, project_id, route_type, status)"
|
||||||
|
" VALUES ('t2', 'p2', 'dept_sub', 'completed')"
|
||||||
|
)
|
||||||
|
# обычный running pipeline другого типа — не трогать
|
||||||
|
conn.execute(
|
||||||
|
"INSERT INTO pipelines (task_id, project_id, route_type, status)"
|
||||||
|
" VALUES ('t2', 'p2', 'direct', 'running')"
|
||||||
|
)
|
||||||
|
conn.commit()
|
||||||
|
|
||||||
|
_migrate(conn)
|
||||||
|
|
||||||
|
rows = {
|
||||||
|
r["route_type"]: r["status"]
|
||||||
|
for r in conn.execute("SELECT route_type, status FROM pipelines").fetchall()
|
||||||
|
}
|
||||||
|
assert rows["dept_sub"] == "completed", "completed pipeline не должен меняться"
|
||||||
|
assert rows["direct"] == "running", "non-dept_sub running pipeline не должен меняться"
|
||||||
|
conn.close()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue