Files
sori.studio/tests/useAdminMarkdownSourceActions.test.js

126 lines
3.7 KiB
JavaScript

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
})
})
})