관리자 미디어 업로드 규칙 분리

This commit is contained in:
2026-07-27 18:36:34 +09:00
parent a122ef46ac
commit e5e4febbbc
10 changed files with 178 additions and 23 deletions

View File

@@ -6,9 +6,12 @@ import {
buildMediaPickerPageItems,
buildMediaPickerRangeLabel,
buildMediaPickerUploadHint,
createMediaPickerFetchQuery,
createMediaUploadFormData,
createMediaBlockMarkdown,
createDefaultMediaPickerPagination,
createSelectedMediaInsertPlan,
filterImageUploadFiles,
findUploadSizeLimitError,
formatMediaFileSize,
getGallerySelectionOrder,
@@ -20,9 +23,12 @@ import {
isGalleryMediaPickerTarget,
isMediaItemSelectableForTarget,
isUploadFileAllowedForMediaTarget,
normalizeMediaUploadFiles,
normalizeMediaPickerPage,
normalizeMediaPickerResponse,
resolveImageUploadInsertTarget,
resolveSelectedMediaItems,
resolveUploadedMediaFiles,
resolveUploadFetchErrorMessage,
toggleMediaSelectionState
} from '../lib/markdown-editor-media.js'
@@ -145,6 +151,36 @@ test('미디어 선택 적용 버튼 상태를 계산한다', () => {
})
})
test('미디어 선택 목록 조회 query를 계산한다', () => {
assert.deepEqual(createMediaPickerFetchQuery({
page: 2,
pageSize: 50,
kind: 'image',
searchQuery: ' 스크린샷 '
}), {
paged: '1',
tab: 'library',
page: 2,
pageSize: 50,
kind: 'image',
search: '스크린샷'
})
assert.deepEqual(createMediaPickerFetchQuery({
page: 1,
pageSize: 50,
kind: 'all',
searchQuery: ' '
}), {
paged: '1',
tab: 'library',
page: 1,
pageSize: 50,
kind: 'all',
search: undefined
})
})
test('미디어 항목으로 fenced 미디어 블록을 만든다', () => {
assert.deepEqual(createMediaBlockMarkdown('video', {
url: '/uploads/a.mp4',
@@ -252,6 +288,39 @@ test('선택 미디어 삽입 계획은 적용할 항목이 없으면 무시한
})
})
test('업로드 입력 파일 목록을 배열과 FormData로 정규화한다', () => {
const imageFile = new File(['a'], 'a.png', { type: 'image/png' })
const textFile = new File(['b'], 'b.txt', { type: 'text/plain' })
const files = normalizeMediaUploadFiles([imageFile, null, textFile])
assert.deepEqual(files, [imageFile, textFile])
const formData = createMediaUploadFormData(files)
assert.deepEqual(formData.getAll('files'), [imageFile, textFile])
})
test('업로드 응답과 이미지 업로드 삽입 대상을 계산한다', () => {
const uploadedFiles = [{ url: '/uploads/a.png' }]
assert.deepEqual(resolveUploadedMediaFiles({ files: uploadedFiles }), uploadedFiles)
assert.deepEqual(resolveUploadedMediaFiles({}), [])
assert.equal(resolveImageUploadInsertTarget([
new File(['a'], 'a.png', { type: 'image/png' })
]), 'image')
assert.equal(resolveImageUploadInsertTarget([
new File(['a'], 'a.png', { type: 'image/png' }),
new File(['b'], 'b.png', { type: 'image/png' })
]), 'gallery')
})
test('업로드 파일 목록에서 이미지만 골라낸다', () => {
const imageFile = new File(['a'], 'a.png', { type: 'image/png' })
const textFile = new File(['b'], 'b.txt', { type: 'text/plain' })
assert.deepEqual(filterImageUploadFiles([imageFile, textFile]), [imageFile])
})
test('갤러리 선택 순서를 선택 URL 순서로 반환한다', () => {
assert.equal(getGallerySelectionOrder(['/a.png', '/b.png'], '/b.png'), 2)
assert.equal(getGallerySelectionOrder(['/a.png'], '/b.png'), 0)