import assert from 'node:assert/strict' import { describe, it } from 'node:test' import { ref } from 'vue' import { useAdminMarkdownSourceActions } from '../composables/useAdminMarkdownSourceActions.js' /** * 소스 액션 테스트 상태를 만든다. * @param {string} initialValue - 초기 본문 * @param {number} start - 선택 시작 * @param {number} end - 선택 끝 * @returns {Object} 테스트 상태 */ const createSourceActionHarness = (initialValue, start = 0, end = start) => { const value = ref(initialValue) const selection = { start, end } const actions = useAdminMarkdownSourceActions({ value, getSelectionState: () => ({ start: selection.start, end: selection.end, value: value.value }), setTextareaSelection: (selectionStart, selectionEnd = selectionStart) => { selection.start = selectionStart selection.end = selectionEnd } }) return { value, selection, actions } } describe('useAdminMarkdownSourceActions', () => { it('선택 영역을 지정 문자열로 교체하고 선택 범위를 갱신한다', () => { const harness = createSourceActionHarness('hello world', 6, 11) harness.actions.replaceSelection('sori') assert.equal(harness.value.value, 'hello sori') assert.deepEqual(harness.selection, { start: 10, end: 10 }) }) it('블록 조각 삽입 시 주변 줄바꿈을 보정한다', () => { const harness = createSourceActionHarness('앞문장뒤문장', 3, 3) harness.actions.insertBlockSnippet('![](/uploads/a.png)') assert.equal(harness.value.value, '앞문장\n\n![](/uploads/a.png)\n\n뒤문장') assert.deepEqual(harness.selection, { start: 26, end: 26 }) }) it('인라인 감싸기와 링크 삽입은 새 선택 위치를 유지한다', () => { const boldHarness = createSourceActionHarness('굵게', 0, 2) boldHarness.actions.wrapInline('**', '**', '굵은 글씨') assert.equal(boldHarness.value.value, '**굵게**') assert.deepEqual(boldHarness.selection, { start: 2, end: 4 }) const linkHarness = createSourceActionHarness('문서', 0, 2) linkHarness.actions.insertInlineLink() assert.equal(linkHarness.value.value, '[문서](https://)') assert.deepEqual(linkHarness.selection, { start: 5, end: 13 }) }) it('줄 단위 제목·인용·목록 변환을 적용한다', () => { const headingHarness = createSourceActionHarness('기존\n문장', 0, 2) headingHarness.actions.applyHeading(2) assert.equal(headingHarness.value.value, '## 기존\n문장') const quoteHarness = createSourceActionHarness('첫 줄\n둘째 줄', 0, 7) quoteHarness.actions.applyQuote() assert.equal(quoteHarness.value.value, '> 첫 줄\n> 둘째 줄') const listHarness = createSourceActionHarness('첫 줄\n- 둘째 줄', 0, 10) listHarness.actions.applyList() assert.equal(listHarness.value.value, '- 첫 줄\n- 둘째 줄') }) it('코드 블록 삽입은 선택 본문을 유지하고 코드 본문을 선택한다', () => { const harness = createSourceActionHarness('console.log(1)', 0, 14) harness.actions.insertCodeBlock() assert.equal(harness.value.value, '```\nconsole.log(1)\n```') assert.deepEqual(harness.selection, { start: 4, end: 18 }) }) it('선택 범위가 걸친 줄을 삭제한다', () => { const harness = createSourceActionHarness('첫 줄\n둘째 줄\n셋째 줄', 4, 7) harness.actions.deleteSelectedSourceLines() assert.equal(harness.value.value, '첫 줄\n셋째 줄') assert.deepEqual(harness.selection, { start: 0, end: 0 }) }) })