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

110 lines
4.0 KiB
JavaScript

import assert from 'node:assert/strict'
import test from 'node:test'
import { computed } from 'vue'
import { useAdminMarkdownMediaPicker } from '../composables/useAdminMarkdownMediaPicker.js'
const uploadSizeLimits = computed(() => ({
image: 10485760,
video: 209715200,
audio: 52428800,
document: 52428800
}))
test('관리자 Markdown 미디어 선택 모달은 열기와 닫기 상태를 관리한다', () => {
const picker = useAdminMarkdownMediaPicker({ uploadSizeLimits })
picker.openMediaPickerState('gallery')
assert.equal(picker.isMediaPickerOpen.value, true)
assert.equal(picker.mediaPickerTarget.value, 'gallery')
assert.equal(picker.activeMediaPickerTab.value, 'upload')
assert.equal(picker.mediaSearchQuery.value, '')
assert.equal(picker.mediaPickerPage.value, 1)
assert.deepEqual(picker.selectedMediaUrls.value, [])
assert.equal(picker.isGalleryMediaPicker.value, true)
assert.equal(picker.mediaPickerAccept.value, 'image/*')
assert.equal(picker.mediaPickerTitle.value, '갤러리 이미지 선택')
assert.equal(picker.closeMediaPickerState(), true)
assert.equal(picker.isMediaPickerOpen.value, false)
assert.equal(picker.activeMediaPickerTab.value, 'upload')
assert.deepEqual(picker.mediaItems.value, [])
})
test('관리자 Markdown 미디어 선택 모달은 업로드 중 닫기를 막는다', () => {
const picker = useAdminMarkdownMediaPicker({ uploadSizeLimits })
picker.openMediaPickerState('image')
picker.isUploading.value = true
assert.equal(picker.closeMediaPickerState(), false)
assert.equal(picker.isMediaPickerOpen.value, true)
})
test('관리자 Markdown 미디어 선택 모달은 API 응답과 페이지를 상태에 반영한다', () => {
const picker = useAdminMarkdownMediaPicker({ uploadSizeLimits, pageSize: 20 })
picker.applyMediaPickerResponse({
items: [{ url: '/uploads/a.png' }],
pagination: {
page: 3,
pageSize: 20,
total: 42,
pageCount: 3
}
})
assert.equal(picker.mediaPickerPage.value, 3)
assert.equal(picker.mediaPickerPageCount.value, 3)
assert.equal(picker.mediaPickerRangeLabel.value, '42개 중 41-42개')
assert.deepEqual(picker.filteredMediaItems.value, [{ url: '/uploads/a.png' }])
picker.setMediaPickerPage(99)
assert.equal(picker.mediaPickerPage.value, 3)
})
test('관리자 Markdown 미디어 선택 모달은 단일·갤러리 선택을 관리한다', () => {
const picker = useAdminMarkdownMediaPicker({ uploadSizeLimits })
picker.openMediaPickerState('image')
picker.mediaItems.value = [
{ url: '/uploads/a.png' },
{ url: '/uploads/b.png' }
]
picker.toggleMediaSelection({ url: '/uploads/a.png' })
picker.toggleMediaSelection({ url: '/uploads/b.png' })
assert.deepEqual(picker.selectedMediaUrls.value, ['/uploads/b.png'])
assert.deepEqual(picker.resolveCurrentSelectedMediaItems(), [{ url: '/uploads/b.png' }])
picker.openMediaPickerState('gallery')
picker.toggleMediaSelection({ url: '/uploads/a.png' })
picker.toggleMediaSelection({ url: '/uploads/b.png' })
assert.deepEqual(picker.selectedMediaUrls.value, ['/uploads/a.png', '/uploads/b.png'])
assert.equal(picker.getGallerySelectionOrder('/uploads/b.png'), 2)
assert.deepEqual(picker.mediaPickerApplyState.value, {
disabled: false,
label: '2개 삽입'
})
})
test('관리자 Markdown 미디어 선택 모달은 업로드 파일 선택 상태와 fallback 목록을 만든다', () => {
const picker = useAdminMarkdownMediaPicker({ uploadSizeLimits })
picker.openMediaPickerState('image')
picker.selectUploadedMediaFiles([
{ url: '/uploads/a.png', kind: 'image' },
{ url: '/uploads/a.mp4', kind: 'video' }
])
assert.deepEqual(picker.selectedMediaUrls.value, ['/uploads/a.png'])
picker.prependUploadedMediaItems([{ url: '/uploads/a.png' }])
assert.deepEqual(picker.mediaItems.value, [{ url: '/uploads/a.png' }])
assert.equal(picker.isUploadFileAllowedForPicker({ type: 'image/png' }), true)
assert.equal(picker.isUploadFileAllowedForPicker({ type: 'video/mp4' }), false)
})