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