kin: auto-commit after pipeline

This commit is contained in:
Gros Frumos 2026-03-18 21:26:40 +02:00
parent c64f9b7538
commit ae571bc9c2
2 changed files with 13 additions and 3 deletions

View file

@ -320,13 +320,16 @@ describe('KIN-127: статус revising', () => {
expect(wrapper.find('a[href="/task/KIN-001"]').exists()).toBe(true) expect(wrapper.find('a[href="/task/KIN-001"]').exists()).toBe(true)
}) })
it('Badge для статуса revising отображается с orange цветом', async () => { it('Badge для статуса revising присутствует в списке задач', async () => {
const tasks = [makeTask('KIN-001', 'revising', null)] const tasks = [makeTask('KIN-001', 'revising', null)]
const wrapper = await mountTasks(tasks) const wrapper = await mountTasks(tasks)
// Badge с текстом revising должен присутствовать // Badge с текстом revising должен присутствовать
const text = wrapper.text() const text = wrapper.text()
expect(text).toContain('revising') expect(text).toContain('revising')
// Badge должен иметь orange цвет
const orangeBadge = wrapper.find('.text-orange-400, .bg-orange-400, .bg-orange-500, .border-orange-400, .border-orange-500')
expect(orangeBadge.exists()).toBe(true)
}) })
}) })
@ -365,7 +368,7 @@ describe('KIN-127: i18n ключи', () => {
// ───────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────
describe('KIN-127: защита от циклических ссылок', () => { describe('KIN-127: защита от циклических ссылок', () => {
it('Проект с циклическими parent_task_id рендерится без зависания', async () => { it('Проект с циклическими parent_task_id рендерится без зависания и не показывает toggle', async () => {
// Специально создаём циклическую ссылку: KIN-001 -> KIN-002 -> KIN-001 // Специально создаём циклическую ссылку: KIN-001 -> KIN-002 -> KIN-001
const tasks = [ const tasks = [
{ ...makeTask('KIN-001', 'pending', 'KIN-002') }, { ...makeTask('KIN-001', 'pending', 'KIN-002') },
@ -374,7 +377,11 @@ describe('KIN-127: защита от циклических ссылок', () =>
// Не должен зависнуть — задачи просто отобразятся как корневые // Не должен зависнуть — задачи просто отобразятся как корневые
const wrapper = await mountTasks(tasks) const wrapper = await mountTasks(tasks)
// Достаточно что рендер завершился без ошибок // Рендер завершился без ошибок
expect(wrapper.exists()).toBe(true) expect(wrapper.exists()).toBe(true)
// При циклической ссылке ни одна задача не является «корневой» с дочерними —
// toggle кнопок быть не должно (дефолтное состояние: дети не показаны)
const toggleBtns = wrapper.findAll('[data-testid="task-toggle-children"]')
expect(toggleBtns.length).toBe(0)
}) })
}) })

View file

@ -731,7 +731,10 @@ const rootFilteredTasks = computed(() => {
const flattenedTasks = computed(() => { const flattenedTasks = computed(() => {
const result: Task[] = [] const result: Task[] = []
const visitedInFlatten = new Set<string>()
function addWithChildren(task: Task) { function addWithChildren(task: Task) {
if (visitedInFlatten.has(task.id)) return
visitedInFlatten.add(task.id)
result.push(task) result.push(task)
if (expandedTasks.value.has(task.id)) { if (expandedTasks.value.has(task.id)) {
const children = childrenMap.value.get(task.id) || [] const children = childrenMap.value.get(task.id) || []