import assert from 'node:assert/strict'; import { createHash } from 'node:crypto'; import { test } from 'node:test'; import sharp from 'sharp'; import { qiniuPrivateDownloadUrl, prepareOzonImages, } from '../src/ozon-publish-media.ts'; const config = { provider: 'qiniu_kodo', bucket: 'test-bucket', downloadOrigin: 'https://images.example.test', accessKey: 'MY_ACCESS_KEY', secretKey: 'MY_SECRET_KEY', ttlSeconds: 86400, }; test('七牛签名包含秒级有效期,HMAC-SHA1 与独立计算向量一致', () => { assert.equal( qiniuPrivateDownloadUrl( config.downloadOrigin, 'resource/flower.jpg', 1451491200, config.accessKey, config.secretKey, ), 'https://images.example.test/resource/flower.jpg?e=1451491200&token=MY_ACCESS_KEY:qUjF3pEnCC9cpm3MaHVikOTEevE=', ); assert.throws( () => qiniuPrivateDownloadUrl( 'http://localhost:9000', 'a', 1451491200, 'ak', 'sk', ), /HTTPS/, ); }); test('发布 WebP 按 checksum 固定源,转 JPEG 并交付独立发布路径', async () => { const bytes = await sharp({ create: { width: 20, height: 20, channels: 4, background: { r: 100, g: 80, b: 60, alpha: 1 }, }, }) .webp() .toBuffer(); const checksum = createHash('sha256').update(bytes).digest('hex'); const writes = []; const storage = { send: async (command) => { if (command.constructor.name === 'GetObjectCommand') return { Body: (async function* () { yield bytes; })(), }; writes.push(command.input); return {}; }, }; const snapshot = { media: [ { asset_id: 'asset-a', checksum_sha256: checksum, bucket: 'test-bucket', object_key: 'private/original', storage_provider: 'qiniu_kodo', content_type: 'image/webp', }, ], }; const urls = await prepareOzonImages( storage, snapshot, 'workspace-a', 'job-a', config, ); assert.equal(writes.length, 1); assert.equal(writes[0].ContentType, 'image/jpeg'); assert.equal((await sharp(writes[0].Body).metadata()).format, 'jpeg'); assert.ok(writes[0].Key.startsWith('publishing/workspace-a/job-a/')); assert.ok(!urls[0].includes('private/original')); assert.ok(new URL(urls[0]).searchParams.get('token')); snapshot.media[0].checksum_sha256 = 'changed'; await assert.rejects( prepareOzonImages(storage, snapshot, 'workspace-a', 'job-a', config), /图片内容已变更/, ); assert.equal(writes.length, 1); });