'use strict'; const assert = require('node:assert/strict'); const fs = require('fs'); const os = require('os'); const path = require('path'); const { discoverMedia } = require('../mcp/src/features/media/media-discovery'); const { processMedia, replaceMediaUrls } = require('../mcp/src/features/media/media-pipeline'); const { manifestPath } = require('../mcp/src/features/media/media-manifest'); async function main() { const image = `data:image/png;base64,${Buffer.from('png-fixture').toString('base64')}`; const video = `data:video/mp4;base64,${Buffer.from('video-fixture').toString('base64')}`; const input = { id: 'note-1', coverUrl: image, media: { videoUrl: video }, text: 'unchanged' }; const discovered = discoverMedia(input); assert.equal(discovered.length, 2); const outputDir = fs.mkdtempSync(path.join(os.tmpdir(), 'voc-media-smoke-')); fs.mkdirSync(path.dirname(manifestPath(outputDir)), { recursive: true }); fs.writeFileSync(manifestPath(outputDir), JSON.stringify({ items: [{ mediaId: 'legacy-cloud-item', sourceUrl: 'https://example.invalid/legacy.jpg', localPath: '', cloudUrl: 'https://storage.example.invalid/legacy.jpg', uploadStatus: 'uploaded' }] })); let uploadCalls = 0; const result = await processMedia(input, { outputDir, usageTraceId: 'usage_media_smoke', platform: 'xiaohongshu', storage: { upload: async () => { uploadCalls += 1; } } }); assert.equal(result.items.filter(item => item.cacheStatus === 'cached').length, 2); assert.equal(result.items.filter(item => item.uploadStatus === 'disabled_local_only').length, 3); assert.equal(uploadCalls, 0, 'local-only media pipeline must not upload to Storage'); assert(fs.existsSync(result.manifestFile)); const savedManifest = JSON.parse(fs.readFileSync(result.manifestFile, 'utf8')); const legacyItem = savedManifest.items.find(item => item.mediaId === 'legacy-cloud-item'); assert.equal(legacyItem.cloudUrl, null, 'legacy cloud URLs must be removed from the manifest'); assert.equal(legacyItem.uploadStatus, 'disabled_local_only'); assert.equal(legacyItem.effectiveUrl, ''); const replaced = replaceMediaUrls(input, result.replacements); assert.match(replaced.coverUrl, /^assets\/xiaohongshu\/note-1\//); assert.match(replaced.media.videoUrl, /^assets\/xiaohongshu\/(?:note-1|evidence)\//); assert.equal(result.items.some(item => item.cloudUrl), false); console.log('media pipeline smoke passed'); } main().catch(error => { console.error(error); process.exitCode = 1; });