import { describe, test, expect } from 'vitest' import { tiptapHTMLToMarkdown, markdownToHTML, looksLikeMarkdown, extractMarkdownTitle, } from '../../lib/editor/markdown-export' describe('looksLikeMarkdown', () => { test('detects H1 heading', () => { expect(looksLikeMarkdown('# Hello World')).toBe(true) }) test('detects unordered list', () => { expect(looksLikeMarkdown('- Item one\n- Item two')).toBe(true) expect(looksLikeMarkdown('* Item one')).toBe(true) }) test('detects ordered list', () => { expect(looksLikeMarkdown('1. First\n2. Second')).toBe(true) }) test('detects blockquote', () => { expect(looksLikeMarkdown('> This is a quote')).toBe(true) }) test('detects code fence', () => { expect(looksLikeMarkdown('```\nconst x = 1\n```')).toBe(true) }) test('detects inline code', () => { expect(looksLikeMarkdown('Use `console.log()` for debugging')).toBe(true) }) test('detects bold', () => { expect(looksLikeMarkdown('This is **bold** text')).toBe(true) }) test('detects italic', () => { expect(looksLikeMarkdown('This is *italic* text')).toBe(true) }) test('detects table', () => { expect(looksLikeMarkdown('| Col1 | Col2 |\n|------|------|')).toBe(true) }) test('detects link', () => { expect(looksLikeMarkdown('See [TipTap docs](https://tiptap.dev)')).toBe(true) }) test('does NOT flag plain prose as Markdown', () => { expect(looksLikeMarkdown('This is a normal sentence without any markdown.')).toBe(false) expect(looksLikeMarkdown('Hello world, this is plain text.')).toBe(false) }) test('does NOT flag very short text', () => { expect(looksLikeMarkdown('Hi')).toBe(false) expect(looksLikeMarkdown('')).toBe(false) }) }) describe('tiptapHTMLToMarkdown', () => { test('converts H1 to # heading', () => { const md = tiptapHTMLToMarkdown('

Hello

') expect(md).toBe('# Hello') }) test('converts H2 to ## heading', () => { const md = tiptapHTMLToMarkdown('

Section

') expect(md).toBe('## Section') }) test('converts H3 to ### heading', () => { const md = tiptapHTMLToMarkdown('

Sub

') expect(md).toBe('### Sub') }) test('converts bold text', () => { const md = tiptapHTMLToMarkdown('

This is bold text.

') expect(md).toContain('**bold**') }) test('converts italic text', () => { const md = tiptapHTMLToMarkdown('

This is italic text.

') expect(md).toContain('_italic_') }) test('converts unordered list', () => { const md = tiptapHTMLToMarkdown('') expect(md).toContain('Item 1') expect(md).toContain('Item 2') expect(md).toMatch(/^[-*+]\s/m) }) test('converts ordered list', () => { const md = tiptapHTMLToMarkdown('
  1. First
  2. Second
') expect(md).toContain('1. First') expect(md).toContain('2. Second') }) test('converts code block', () => { const md = tiptapHTMLToMarkdown('
const x = 1;
') expect(md).toContain('```') expect(md).toContain('const x = 1;') }) test('converts blockquote', () => { const md = tiptapHTMLToMarkdown('

Quote text

') expect(md).toContain('> Quote text') }) test('converts inline code', () => { const md = tiptapHTMLToMarkdown('

Use console.log() here.

') expect(md).toContain('`console.log()`') }) test('converts hyperlink', () => { const md = tiptapHTMLToMarkdown('

Example

') expect(md).toContain('[Example](https://example.com)') }) test('handles empty HTML', () => { expect(tiptapHTMLToMarkdown('')).toBe('') expect(tiptapHTMLToMarkdown(' ')).toBe('') }) test('preserves liveBlock as HTML comment', () => { const html = '
' const md = tiptapHTMLToMarkdown(html) expect(md).toContain('