import { describe, expect, it } from 'vitest'; import { buildTaskCountsByOwner } from '@renderer/utils/pathNormalize'; describe('pathNormalize task counts', () => { it('counts approved tasks as completed instead of in-progress', () => { const counts = buildTaskCountsByOwner([ { owner: 'jack', status: 'in_progress', kanbanColumn: 'approved', }, { owner: 'jack', status: 'in_progress', reviewState: 'approved', }, ]); expect(counts.get('jack')).toEqual({ pending: 0, inProgress: 0, completed: 2, }); }); it('ignores soft-deleted tasks even when status is stale', () => { const counts = buildTaskCountsByOwner([ { owner: 'jack', status: 'in_progress', deletedAt: '2026-05-06T19:06:07.257Z', }, ]); expect(counts.get('jack')).toBeUndefined(); }); it('keeps reopened pending tasks pending when kanban approved is stale', () => { const counts = buildTaskCountsByOwner([ { owner: 'jack', status: 'pending', kanbanColumn: 'approved', }, ]); expect(counts.get('jack')).toEqual({ pending: 1, inProgress: 0, completed: 0, }); }); it('counts needsFix tasks as actionable instead of completed', () => { const counts = buildTaskCountsByOwner([ { owner: 'jack', status: 'completed', reviewState: 'needsFix', }, { owner: 'jack', status: 'in_progress', reviewState: 'needsFix', }, ]); expect(counts.get('jack')).toEqual({ pending: 1, inProgress: 1, completed: 0, }); }); it('does not count review workflow tasks as completed owner progress', () => { const counts = buildTaskCountsByOwner([ { owner: 'jack', status: 'completed', reviewState: 'review', kanbanColumn: 'review', }, ]); expect(counts.get('jack')).toBeUndefined(); }); it('lets current approved overlay win over stale needsFix in task counts', () => { const counts = buildTaskCountsByOwner([ { owner: 'jack', status: 'in_progress', reviewState: 'needsFix', kanbanColumn: 'approved', }, ]); expect(counts.get('jack')).toEqual({ pending: 0, inProgress: 0, completed: 1, }); }); });