Compare commits
No commits in common. "0731aad0287b7360c04cad7cecc0e5caeb408959" and "376495e88f1746893c36c5f7d42c2ef82cb9f5a1" have entirely different histories.
0731aad028
...
376495e88f
1 changed files with 0 additions and 109 deletions
109
tests/test_db.py
109
tests/test_db.py
|
|
@ -283,112 +283,3 @@ 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