kin: auto-commit after pipeline

This commit is contained in:
Gros Frumos 2026-03-18 21:51:19 +02:00
parent f5c527a6d9
commit 51c102a895
2 changed files with 245 additions and 0 deletions

View file

@ -366,6 +366,32 @@ describe('KIN-127: i18n ключи', () => {
// 7. Защита от циклических ссылок
// ─────────────────────────────────────────────────────────────
// ─────────────────────────────────────────────────────────────
// 8. KIN-021: visitedInFlatten в addWithChildren — регрессия
// ─────────────────────────────────────────────────────────────
describe('KIN-021: visitedInFlatten — flattenedTasks с взаимным циклом', () => {
it('flattenedTasks при A→parent:B, B→parent:A рендерит непустой HTML проекта без зависания', async () => {
// Взаимный цикл: CYCLE-A → parent CYCLE-B, CYCLE-B → parent CYCLE-A
const tasks = [
makeTask('CYCLE-A', 'pending', 'CYCLE-B'),
makeTask('CYCLE-B', 'pending', 'CYCLE-A'),
]
const wrapper = await mountTasks(tasks)
// Главное: компонент рендерит непустой HTML — нет бесконечной рекурсии / stack overflow
// visitedInFlatten Set предотвращает зависание при вызове addWithChildren
expect(wrapper.html().length).toBeGreaterThan(100)
// Оба task взаимно исключают друг друга из rootFilteredTasks:
// parent каждого указывает на другой task из того же проекта
// → в flattenedTasks не попадают → ссылок в DOM нет
expect(wrapper.find('a[href="/task/CYCLE-A"]').exists()).toBe(false)
expect(wrapper.find('a[href="/task/CYCLE-B"]').exists()).toBe(false)
})
})
describe('KIN-127: защита от циклических ссылок', () => {
it('Проект с циклическими parent_task_id рендерится без зависания и не показывает toggle', async () => {
// Специально создаём циклическую ссылку: KIN-001 -> KIN-002 -> KIN-001