kin: KIN-UI-002 Исправить падающие тесты миграции (регрессия KIN-ARCH-003) в core/db.py
This commit is contained in:
parent
389b266bee
commit
ff69d24acc
7 changed files with 254 additions and 10 deletions
|
|
@ -130,3 +130,73 @@ def test_migrate_is_idempotent():
|
|||
after = _cols(conn, "projects")
|
||||
assert before == after
|
||||
conn.close()
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Migration KIN-UI-002: рекреация таблицы на минимальной схеме не падает
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def test_migrate_recreates_table_without_operationalerror():
|
||||
"""_migrate не бросает OperationalError при рекреации projects на минимальной схеме.
|
||||
|
||||
Регрессионный тест KIN-UI-002: INSERT SELECT в блоке KIN-ARCH-003 ранее
|
||||
падал на отсутствующих колонках (tech_stack, priority, pm_prompt и др.).
|
||||
"""
|
||||
conn = _old_schema_conn() # path NOT NULL — триггер рекреации
|
||||
try:
|
||||
_migrate(conn)
|
||||
except Exception as exc:
|
||||
pytest.fail(f"_migrate raised {type(exc).__name__}: {exc}")
|
||||
conn.close()
|
||||
|
||||
|
||||
def test_migrate_path_becomes_nullable_on_old_schema():
|
||||
"""После миграции старой схемы (path NOT NULL) колонка path становится nullable."""
|
||||
conn = _old_schema_conn()
|
||||
_migrate(conn)
|
||||
path_col = next(
|
||||
r for r in conn.execute("PRAGMA table_info(projects)").fetchall()
|
||||
if r[1] == "path"
|
||||
)
|
||||
assert path_col[3] == 0, "path должна быть nullable после миграции KIN-ARCH-003"
|
||||
conn.close()
|
||||
|
||||
|
||||
def test_migrate_preserves_existing_rows_on_recreation():
|
||||
"""Рекреация таблицы сохраняет существующие строки."""
|
||||
conn = _old_schema_conn()
|
||||
conn.execute(
|
||||
"INSERT INTO projects (id, name, path, status) VALUES ('p1', 'MyProj', '/p', 'active')"
|
||||
)
|
||||
conn.commit()
|
||||
_migrate(conn)
|
||||
row = conn.execute("SELECT id, name, path, status FROM projects WHERE id='p1'").fetchone()
|
||||
assert row is not None
|
||||
assert row["name"] == "MyProj"
|
||||
assert row["path"] == "/p"
|
||||
assert row["status"] == "active"
|
||||
conn.close()
|
||||
|
||||
|
||||
def test_migrate_adds_missing_columns_before_recreation():
|
||||
"""_migrate добавляет tech_stack, priority, pm_prompt, claude_md_path, forgejo_repo, created_at перед рекреацией."""
|
||||
conn = _old_schema_conn()
|
||||
_migrate(conn)
|
||||
cols = _cols(conn, "projects")
|
||||
required = {"tech_stack", "priority", "pm_prompt", "claude_md_path", "forgejo_repo", "created_at"}
|
||||
assert required.issubset(cols), f"Отсутствуют колонки: {required - cols}"
|
||||
conn.close()
|
||||
|
||||
|
||||
def test_migrate_operations_project_with_null_path():
|
||||
"""После миграции можно вставить operations-проект с path=NULL."""
|
||||
conn = _old_schema_conn()
|
||||
_migrate(conn)
|
||||
conn.execute(
|
||||
"INSERT INTO projects (id, name, path, project_type) VALUES ('ops1', 'Ops', NULL, 'operations')"
|
||||
)
|
||||
conn.commit()
|
||||
row = conn.execute("SELECT path, project_type FROM projects WHERE id='ops1'").fetchone()
|
||||
assert row["path"] is None
|
||||
assert row["project_type"] == "operations"
|
||||
conn.close()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue