미디어 선택 요청 흐름 분리

This commit is contained in:
2026-07-28 10:27:02 +09:00
parent 5e4ccbf2bf
commit 9f3ef337ef
10 changed files with 267 additions and 83 deletions

View File

@@ -107,3 +107,124 @@ test('관리자 Markdown 미디어 선택 모달은 업로드 파일 선택 상
assert.equal(picker.isUploadFileAllowedForPicker({ type: 'image/png' }), true)
assert.equal(picker.isUploadFileAllowedForPicker({ type: 'video/mp4' }), false)
})
test('관리자 Markdown 미디어 선택 모달은 서버 목록 조회를 상태에 반영한다', async () => {
const originalFetch = globalThis.$fetch
const calls = []
globalThis.$fetch = async (url, options) => {
calls.push({ url, options })
return {
items: [{ url: '/uploads/a.png', kind: 'image' }],
pagination: {
page: 2,
pageSize: 20,
total: 21,
pageCount: 2
}
}
}
try {
const picker = useAdminMarkdownMediaPicker({ uploadSizeLimits, pageSize: 20 })
picker.openMediaPickerState('image')
picker.mediaSearchQuery.value = ' a '
picker.mediaPickerPage.value = 2
await picker.fetchMediaItems()
assert.equal(picker.isLoadingMedia.value, false)
assert.deepEqual(picker.mediaItems.value, [{ url: '/uploads/a.png', kind: 'image' }])
assert.equal(picker.mediaPickerPage.value, 2)
assert.deepEqual(calls[0], {
url: '/admin/api/media',
options: {
query: {
paged: '1',
tab: 'library',
page: 2,
pageSize: 20,
kind: 'image',
search: 'a'
}
}
})
} finally {
globalThis.$fetch = originalFetch
}
})
test('관리자 Markdown 미디어 선택 모달은 업로드 후 라이브러리 탭과 선택 상태를 갱신한다', async () => {
const originalFetch = globalThis.$fetch
const uploadedFile = { url: '/uploads/a.png', kind: 'image' }
const calls = []
globalThis.$fetch = async (url, options) => {
calls.push({ url, options })
if (url === '/admin/api/uploads') {
return { files: [uploadedFile] }
}
return {
items: [uploadedFile],
pagination: {
page: 1,
pageSize: 50,
total: 1,
pageCount: 1
}
}
}
try {
const picker = useAdminMarkdownMediaPicker({
uploadSizeLimits,
uploadMaxFileCount: computed(() => 3),
uploadMaxTotalSize: computed(() => 1024 * 1024)
})
picker.openMediaPickerState('image')
const uploadedFiles = await picker.uploadFilesIntoMediaPicker([
new File(['image'], 'a.png', { type: 'image/png' })
])
assert.deepEqual(uploadedFiles, [uploadedFile])
assert.equal(picker.isUploading.value, false)
assert.equal(picker.activeMediaPickerTab.value, 'library')
assert.deepEqual(picker.selectedMediaUrls.value, ['/uploads/a.png'])
assert.deepEqual(picker.mediaItems.value, [uploadedFile])
assert.equal(calls[0].url, '/admin/api/uploads')
assert.equal(calls[0].options.method, 'POST')
assert.ok(calls[0].options.body instanceof FormData)
assert.equal(calls[1].url, '/admin/api/media')
} finally {
globalThis.$fetch = originalFetch
}
})
test('관리자 Markdown 미디어 선택 모달 업로드는 한도 초과 시 요청하지 않는다', async () => {
const originalFetch = globalThis.$fetch
let called = false
globalThis.$fetch = async () => {
called = true
return { files: [] }
}
try {
const picker = useAdminMarkdownMediaPicker({
uploadSizeLimits,
uploadMaxFileCount: computed(() => 1),
uploadMaxTotalSize: computed(() => 1024 * 1024)
})
await assert.rejects(
() => picker.uploadMediaFiles([
new File(['a'], 'a.png', { type: 'image/png' }),
new File(['b'], 'b.png', { type: 'image/png' })
]),
/최대 1개/
)
assert.equal(called, false)
} finally {
globalThis.$fetch = originalFetch
}
})