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