89 lines
3.3 KiB
JavaScript
89 lines
3.3 KiB
JavaScript
import assert from 'node:assert/strict'
|
|
import { mkdir, mkdtemp, rm } from 'node:fs/promises'
|
|
import { tmpdir } from 'node:os'
|
|
import { join } from 'node:path'
|
|
import test from 'node:test'
|
|
import sharp from 'sharp'
|
|
import {
|
|
createPageCoverThumbnailForImageUrl,
|
|
createPostBodyThumbnailForImageUrl,
|
|
createPostThumbnailForImageUrl,
|
|
getPageCoverThumbnailDiskPath,
|
|
getPostBodyPreviewThumbnailDiskPath,
|
|
getPostBodyThumbnailDiskPath,
|
|
getPostLightboxThumbnailDiskPath,
|
|
getPostThumbnailDiskPath
|
|
} from '../server/utils/post-thumbnail-image.js'
|
|
|
|
test('sharp 파생 이미지 생성 경로는 게시물 카드·본문·페이지 커버 WebP를 만든다', async (t) => {
|
|
const previousPlaywrightTest = process.env.PLAYWRIGHT_TEST
|
|
const previousUploadRoot = process.env.SORI_TEST_UPLOAD_ROOT
|
|
const previousUseRuntimeConfig = globalThis.useRuntimeConfig
|
|
const uploadRoot = await mkdtemp(join(tmpdir(), 'sori-sharp-'))
|
|
const sourceDirectory = join(uploadRoot, 'posts', '2026', '07')
|
|
const sourceUrl = '/uploads/posts/2026/07/sample.png'
|
|
const sourcePath = join(sourceDirectory, 'sample.png')
|
|
const originalWarn = console.warn
|
|
|
|
process.env.PLAYWRIGHT_TEST = '1'
|
|
process.env.SORI_TEST_UPLOAD_ROOT = uploadRoot
|
|
globalThis.useRuntimeConfig = () => ({})
|
|
console.warn = (...args) => {
|
|
if (String(args[0] || '').includes('[media-catalog]')) {
|
|
return
|
|
}
|
|
|
|
originalWarn(...args)
|
|
}
|
|
|
|
t.after(async () => {
|
|
console.warn = originalWarn
|
|
if (previousPlaywrightTest === undefined) {
|
|
delete process.env.PLAYWRIGHT_TEST
|
|
} else {
|
|
process.env.PLAYWRIGHT_TEST = previousPlaywrightTest
|
|
}
|
|
|
|
if (previousUploadRoot === undefined) {
|
|
delete process.env.SORI_TEST_UPLOAD_ROOT
|
|
} else {
|
|
process.env.SORI_TEST_UPLOAD_ROOT = previousUploadRoot
|
|
}
|
|
|
|
if (previousUseRuntimeConfig === undefined) {
|
|
delete globalThis.useRuntimeConfig
|
|
} else {
|
|
globalThis.useRuntimeConfig = previousUseRuntimeConfig
|
|
}
|
|
|
|
await rm(uploadRoot, { recursive: true, force: true })
|
|
})
|
|
|
|
await mkdir(sourceDirectory, { recursive: true })
|
|
await sharp({
|
|
create: {
|
|
width: 900,
|
|
height: 600,
|
|
channels: 4,
|
|
background: '#336699ff'
|
|
}
|
|
}).png().toFile(sourcePath)
|
|
|
|
assert.equal(await createPostThumbnailForImageUrl(sourceUrl), '/uploads/posts/2026/07/thumbs/sample-card.webp')
|
|
assert.equal(await createPostBodyThumbnailForImageUrl(sourceUrl), '/uploads/posts/2026/07/thumbs/sample-body-1600.webp')
|
|
assert.equal(await createPageCoverThumbnailForImageUrl(sourceUrl), '/uploads/posts/2026/07/thumbs/sample-page-cover.webp')
|
|
|
|
const cardMetadata = await sharp(getPostThumbnailDiskPath(sourceUrl)).metadata()
|
|
const bodyMetadata = await sharp(getPostBodyThumbnailDiskPath(sourceUrl)).metadata()
|
|
const previewMetadata = await sharp(getPostBodyPreviewThumbnailDiskPath(sourceUrl)).metadata()
|
|
const lightboxMetadata = await sharp(getPostLightboxThumbnailDiskPath(sourceUrl)).metadata()
|
|
const pageCoverMetadata = await sharp(getPageCoverThumbnailDiskPath(sourceUrl)).metadata()
|
|
|
|
assert.equal(cardMetadata.format, 'webp')
|
|
assert.deepEqual([cardMetadata.width, cardMetadata.height], [640, 360])
|
|
assert.equal(bodyMetadata.width, 900)
|
|
assert.equal(previewMetadata.width, 720)
|
|
assert.equal(lightboxMetadata.width, 900)
|
|
assert.deepEqual([pageCoverMetadata.width, pageCoverMetadata.height], [450, 600])
|
|
})
|