import { BoardColumn, IssueSummary } from '@task-stream/web/tracker/domain'; import { applyIssueChange, moveIssue } from './board.reducers'; const issue = ( id: string, status: string, version = 1, assignee: string | null = null, ): IssueSummary => ({ id, status, version, key: id, projectId: 'p', title: id, assignee: assignee ? { id: assignee, name: assignee } : null, release: null, area: null, labels: [], commentCount: 0, }) as unknown as IssueSummary; const board = (): BoardColumn[] => [ { status: 'TODO', total: 1, issues: [issue('a', 'TODO')], }, { status: 'IN_PROGRESS', total: 0, issues: [] }, ]; describe('board reducers', () => { it('moves a card optimistically', () => { const next = moveIssue(board(), 'a', 'IN_PROGRESS'); expect(next[0]).toMatchObject({ total: 0, issues: [] }); expect(next[1].issues[0]).toMatchObject({ id: 'a', status: 'IN_PROGRESS', }); expect(next[1].total).toBe(1); }); it('applies newer realtime versions and ignores stale ones', () => { const moved = applyIssueChange(board(), issue('a', 'IN_PROGRESS', 2), null); expect(moved[1].issues.map((i) => i.id)).toEqual(['a']); const stale = applyIssueChange(moved, issue('a', 'TODO', 1), null); expect(stale).toBe(moved); }); it('drops issues that no longer match the filter', () => { const next = applyIssueChange(board(), issue('a', 'TODO', 2, 'bob'), { projectId: 'p', assigneeId: 'ana', }); expect(next[0].issues).toEqual([]); }); it('adds new issues from other users', () => { const next = applyIssueChange(board(), issue('b', 'TODO', 1), null); expect(next[0].issues.map((i) => i.id)).toEqual(['b', 'a']); }); });