smoke-media-pipeline.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. 'use strict';
  2. const assert = require('node:assert/strict');
  3. const fs = require('fs');
  4. const os = require('os');
  5. const path = require('path');
  6. const { discoverMedia } = require('../mcp/src/features/media/media-discovery');
  7. const { processMedia, replaceMediaUrls } = require('../mcp/src/features/media/media-pipeline');
  8. const { manifestPath } = require('../mcp/src/features/media/media-manifest');
  9. async function main() {
  10. const image = `data:image/png;base64,${Buffer.from('png-fixture').toString('base64')}`;
  11. const video = `data:video/mp4;base64,${Buffer.from('video-fixture').toString('base64')}`;
  12. const input = { id: 'note-1', coverUrl: image, media: { videoUrl: video }, text: 'unchanged' };
  13. const discovered = discoverMedia(input);
  14. assert.equal(discovered.length, 2);
  15. const outputDir = fs.mkdtempSync(path.join(os.tmpdir(), 'voc-media-smoke-'));
  16. fs.mkdirSync(path.dirname(manifestPath(outputDir)), { recursive: true });
  17. fs.writeFileSync(manifestPath(outputDir), JSON.stringify({
  18. items: [{
  19. mediaId: 'legacy-cloud-item',
  20. sourceUrl: 'https://example.invalid/legacy.jpg',
  21. localPath: '',
  22. cloudUrl: 'https://storage.example.invalid/legacy.jpg',
  23. uploadStatus: 'uploaded'
  24. }]
  25. }));
  26. let uploadCalls = 0;
  27. const result = await processMedia(input, {
  28. outputDir,
  29. usageTraceId: 'usage_media_smoke',
  30. platform: 'xiaohongshu',
  31. storage: { upload: async () => { uploadCalls += 1; } }
  32. });
  33. assert.equal(result.items.filter(item => item.cacheStatus === 'cached').length, 2);
  34. assert.equal(result.items.filter(item => item.uploadStatus === 'disabled_local_only').length, 3);
  35. assert.equal(uploadCalls, 0, 'local-only media pipeline must not upload to Storage');
  36. assert(fs.existsSync(result.manifestFile));
  37. const savedManifest = JSON.parse(fs.readFileSync(result.manifestFile, 'utf8'));
  38. const legacyItem = savedManifest.items.find(item => item.mediaId === 'legacy-cloud-item');
  39. assert.equal(legacyItem.cloudUrl, null, 'legacy cloud URLs must be removed from the manifest');
  40. assert.equal(legacyItem.uploadStatus, 'disabled_local_only');
  41. assert.equal(legacyItem.effectiveUrl, '');
  42. const replaced = replaceMediaUrls(input, result.replacements);
  43. assert.match(replaced.coverUrl, /^assets\/xiaohongshu\/note-1\//);
  44. assert.match(replaced.media.videoUrl, /^assets\/xiaohongshu\/(?:note-1|evidence)\//);
  45. assert.equal(result.items.some(item => item.cloudUrl), false);
  46. console.log('media pipeline smoke passed');
  47. }
  48. main().catch(error => { console.error(error); process.exitCode = 1; });