Compare commits

..

No commits in common. "d173c4aab894b7ddaa0d11fffa1342c248a53f63" and "cfc4a6ba7da4076615f4d6b31a77c4ea5ad31d78" have entirely different histories.

View file

@ -942,15 +942,13 @@ def test_get_pipeline_logs_ordered_asc(pipeline_conn):
def test_circular_reference_protection_has_open_children_returns_false(conn): def test_circular_reference_protection_has_open_children_returns_false(conn):
"""KIN-UI-018 (decision #816): has_open_children возвращает False при циклической ссылке A→B→A. """KIN-UI-018 (decision #816): has_open_children возвращает False при циклической ссылке A→B→A.
Задачи A и B в статусе 'done' создаются напрямую в БД с взаимными parent_task_id. Задачи A и B создаются напрямую в БД с взаимными parent_task_id.
Статус 'done' необходим: рекурсия запускается только для done/cancelled потомков,
поэтому только с done-задачами цикл реально проходит проверку visited-защиты.
Ожидаемый результат: False (не True, не RecursionError). Ожидаемый результат: False (не True, не RecursionError).
""" """
models.create_project(conn, "p1", "P1", "/p1") models.create_project(conn, "p1", "P1", "/p1")
# Создаём задачи в статусе 'done' — рекурсия проходит через них # Создаём задачи без parent сначала
models.create_task(conn, "P1-CYC-A", "p1", "Task A", status="done") models.create_task(conn, "P1-CYC-A", "p1", "Task A")
models.create_task(conn, "P1-CYC-B", "p1", "Task B", status="done") models.create_task(conn, "P1-CYC-B", "p1", "Task B")
# Устанавливаем цикл напрямую в БД, минуя валидацию API # Устанавливаем цикл напрямую в БД, минуя валидацию API
conn.execute("UPDATE tasks SET parent_task_id = 'P1-CYC-B' WHERE id = 'P1-CYC-A'") conn.execute("UPDATE tasks SET parent_task_id = 'P1-CYC-B' WHERE id = 'P1-CYC-A'")
conn.execute("UPDATE tasks SET parent_task_id = 'P1-CYC-A' WHERE id = 'P1-CYC-B'") conn.execute("UPDATE tasks SET parent_task_id = 'P1-CYC-A' WHERE id = 'P1-CYC-B'")