// FE-COMP-MDTOOLBAR-001 to FE-COMP-MDTOOLBAR-006 import { describe, it, expect, vi, beforeEach, type Mock } from 'vitest'; import { render, screen, fireEvent } from '../../../tests/helpers/render'; import MarkdownToolbar from './MarkdownToolbar'; import React from 'react'; function createTextareaRef(value = '', selectionStart = 0, selectionEnd = 0) { const textarea = document.createElement('textarea'); textarea.value = value; textarea.selectionStart = selectionStart; textarea.selectionEnd = selectionEnd; textarea.focus = vi.fn(); textarea.setSelectionRange = vi.fn(); return { current: textarea } as React.RefObject; } describe('MarkdownToolbar', () => { let onUpdate: Mock<(value: string) => void>; beforeEach(() => { onUpdate = vi.fn<(value: string) => void>(); }); it('FE-COMP-MDTOOLBAR-001: renders all 8 toolbar buttons', () => { const ref = createTextareaRef(); render(); const buttons = screen.getAllByRole('button'); expect(buttons).toHaveLength(8); }); it('FE-COMP-MDTOOLBAR-002: buttons have correct title labels', () => { const ref = createTextareaRef(); render(); expect(screen.getByTitle('Bold')).toBeInTheDocument(); expect(screen.getByTitle('Italic')).toBeInTheDocument(); expect(screen.getByTitle('Link')).toBeInTheDocument(); expect(screen.getByTitle('Heading')).toBeInTheDocument(); expect(screen.getByTitle('Quote')).toBeInTheDocument(); expect(screen.getByTitle('List')).toBeInTheDocument(); expect(screen.getByTitle('Ordered')).toBeInTheDocument(); expect(screen.getByTitle('Divider')).toBeInTheDocument(); }); it('FE-COMP-MDTOOLBAR-003: bold button wraps selected text with **', () => { const ref = createTextareaRef('hello world', 6, 11); render(); fireEvent.click(screen.getByTitle('Bold')); expect(onUpdate).toHaveBeenCalledWith('hello **world**'); }); it('FE-COMP-MDTOOLBAR-004: italic button wraps selected text with _', () => { const ref = createTextareaRef('hello world', 6, 11); render(); fireEvent.click(screen.getByTitle('Italic')); expect(onUpdate).toHaveBeenCalledWith('hello _world_'); }); it('FE-COMP-MDTOOLBAR-005: link button wraps selected text as markdown link', () => { const ref = createTextareaRef('click me', 0, 8); render(); fireEvent.click(screen.getByTitle('Link')); expect(onUpdate).toHaveBeenCalledWith('[click me](url)'); }); it('FE-COMP-MDTOOLBAR-006: heading button inserts line prefix', () => { const ref = createTextareaRef('my title', 0, 0); render(); fireEvent.click(screen.getByTitle('Heading')); expect(onUpdate).toHaveBeenCalledWith('## my title'); }); });