import { describe, expect, it } from 'vitest'; // Import DIRECTLY from src (NOT the docmost-client barrel, which pulls in // collaboration.ts and mutates global DOM at import time). import { convertProseMirrorToMarkdown } from '../packages/docmost-client/src/lib/markdown-converter.js'; // markdown-converter.ts is the weakest pure module (report §2). These golden // tests close the gaps the base markdown-converter.test.ts leaves open: // columns/column wrapper, embed/audio/pdf (used to emit nothing), drawio/ // excalidraw data-align presence rule, the remaining inline-mark matrix, // paragraph.textAlign, subpages + unknown-in-container fallback, escaping // idempotence, table-cell pipe/newline sanitization, and empty/single-column // tables. Cases already asserted in the base file are NOT repeated. const doc = (...nodes: any[]) => ({ type: 'doc', content: nodes }); const c = (node: any) => convertProseMirrorToMarkdown(doc(node)); const text = (t: string, marks?: any[]) => marks ? { type: 'text', text: t, marks } : { type: 'text', text: t }; const para = (...inline: any[]) => ({ type: 'paragraph', content: inline }); describe('columns / column (raw-HTML layout wrapper)', () => { it('wraps a multi-column layout as nested data-type divs with the children inside (regression: children unwrapped)', () => { const out = c({ type: 'columns', attrs: { layout: 'two' }, content: [ { type: 'column', attrs: { width: 50 }, content: [para(text('L'))] }, { type: 'column', content: [para(text('R'))] }, ], }); expect(out).toBe( '
' + '

L

' + '

R

' + '
', ); }); it('omits the default widthMode "normal" but emits a non-default one', () => { const normal = c({ type: 'columns', attrs: { layout: 'two', widthMode: 'normal' }, content: [{ type: 'column', content: [para(text('x'))] }], }); expect(normal).not.toContain('data-width-mode'); const wide = c({ type: 'columns', attrs: { layout: 'two', widthMode: 'full' }, content: [{ type: 'column', content: [para(text('x'))] }], }); expect(wide).toContain('data-width-mode="full"'); }); }); describe('embed / audio / pdf (previously emitted nothing — invisible regression)', () => { it('embed emits div[data-type="embed"] with src/provider', () => { expect(c({ type: 'embed', attrs: { src: 'https://x.com/e', provider: 'iframe' } })).toBe( '
', ); }); it('audio emits a div-wrapped