Files
sori.studio/tests/markdown-slash-commands.test.js

112 lines
3.0 KiB
JavaScript

import assert from 'node:assert/strict'
import test from 'node:test'
import {
getSlashCommandFocusTarget,
getSlashCommandTextareaSelection,
insertMarkdownLinesAtSlashTarget,
isMediaSlashAction,
parseSlashInput,
resolveSlashCommand,
shouldIgnorePendingMediaSlashCommit
} from '../lib/markdown-slash-commands.js'
test('슬래시 입력은 단일 줄 명령만 파싱한다', () => {
assert.deepEqual(parseSlashInput('/image'), {
query: 'image',
raw: '/image'
})
assert.equal(parseSlashInput(' /image'), null)
assert.equal(parseSlashInput('/image\n다음 줄'), null)
})
test('정확한 슬래시 명령과 미디어 액션을 판별한다', () => {
assert.equal(resolveSlashCommand('image')?.action, 'media-image')
assert.equal(resolveSlashCommand('img')?.id, 'image')
assert.equal(isMediaSlashAction('media-image'), true)
assert.equal(isMediaSlashAction('lines'), false)
})
test('미디어 슬래시 명령 지연 commit은 같은 줄 slash 원문일 때만 무시한다', () => {
assert.equal(shouldIgnorePendingMediaSlashCommit({
pendingInsertLine: 3,
startLine: 3,
replacementLines: ['/image']
}), true)
assert.equal(shouldIgnorePendingMediaSlashCommit({
pendingInsertLine: 3,
startLine: 4,
replacementLines: ['/image']
}), false)
assert.equal(shouldIgnorePendingMediaSlashCommit({
pendingInsertLine: 3,
startLine: 3,
replacementLines: ['본문']
}), false)
})
test('슬래시 명령 줄에 미디어를 삽입할 때 원문 줄을 교체한다', () => {
const markdown = [
'첫 줄',
'/image',
'마지막 줄'
].join('\n')
assert.equal(insertMarkdownLinesAtSlashTarget(markdown, 1, ['![](/uploads/a.png)']), [
'첫 줄',
'![](/uploads/a.png)',
'마지막 줄'
].join('\n'))
})
test('일반 줄에는 지정 위치 앞에 마크다운 줄을 삽입한다', () => {
assert.equal(insertMarkdownLinesAtSlashTarget('첫 줄\n마지막 줄', 1, ['중간 줄']), '첫 줄\n중간 줄\n마지막 줄')
})
test('슬래시 명령 포커스 대상은 단일 줄과 블록 삽입을 구분한다', () => {
assert.deepEqual(getSlashCommandFocusTarget(2, ['## ']), {
line: 2,
offset: 3
})
assert.deepEqual(getSlashCommandFocusTarget(2, ['```', '', '```']), {
line: 3,
offset: 0
})
})
test('슬래시 명령 textarea 선택 위치는 줄 시작과 포커스 오프셋을 합산한다', () => {
const markdown = [
'첫 줄',
'둘째 줄',
'## ',
'마지막 줄'
].join('\n')
assert.deepEqual(getSlashCommandTextareaSelection({
markdown,
startLine: 2,
lines: ['## ']
}), {
start: 12,
end: 12
})
})
test('슬래시 명령 textarea 선택 위치는 여러 줄 블록의 내부 빈 줄을 가리킨다', () => {
const markdown = [
'첫 줄',
'```',
'',
'```',
'마지막 줄'
].join('\n')
assert.deepEqual(getSlashCommandTextareaSelection({
markdown,
startLine: 1,
lines: ['```', '', '```']
}), {
start: 8,
end: 8
})
})