Files
sori.studio/tests/sharp-image-processing.test.js

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