import { describe, expect, it } from 'vitest'; import { extractTaskRows } from './tasks'; import { docToHtml } from './html'; import { docToMarkdown, markdownToDoc } from './markdown'; describe('task overview block + task extraction (issue #154)', () => { it('round-trips the marker fence', () => { const doc = markdownToDoc('Intro\n\n```dorfteich-tasks\n```\n\nOutro'); let found = 0; doc.descendants((node) => { if (node.type.name === 'task_overview') found += 1; }); expect(found).toBe(1); expect(docToMarkdown(doc)).toContain('```dorfteich-tasks'); }); it('renders the placeholder div for the permission-aware expansion', () => { const html = docToHtml(markdownToDoc('```dorfteich-tasks\n```')); expect(html).toContain('class="dt-task-overview" data-task-overview="1"'); }); it('extracts rows with text, mentions, and dates from task lists', () => { const doc = markdownToDoc( '- [ ] Bühne buchen @nadia >>2026-08-01\n- [x] Kabel prüfen <<2026-07-01\n\nKein Task.', ); const rows = extractTaskRows(doc); expect(rows).toHaveLength(2); expect(rows[0]).toMatchObject({ checked: false, text: 'Bühne buchen', dueDate: '2026-08-01', startDate: null, }); expect(rows[0]!.mentions).toEqual([{ userId: '', username: 'nadia' }]); expect(rows[1]).toMatchObject({ checked: true, text: 'Kabel prüfen', startDate: '2026-07-01', dueDate: null, }); // Markdown-born rows have no stable id yet (assigned in the editor, #153). expect(rows[0]!.id).toBeNull(); }); });