From c73410a9566c7d0f4bbe34fe4fbff5ab7d82bf74 Mon Sep 17 00:00:00 2001 From: LucaP Date: Fri, 4 Sep 2026 15:19:11 +0300 Subject: [PATCH] test: exercise soundtrack materialization failures --- .../materialize-empty-asset-set.test.mjs | 87 ++++++++----------- 1 file changed, 36 insertions(+), 51 deletions(-) diff --git a/tests/integration/materialize-empty-asset-set.test.mjs b/tests/integration/materialize-empty-asset-set.test.mjs index 8e523f6..ea4428d 100644 --- a/tests/integration/materialize-empty-asset-set.test.mjs +++ b/tests/integration/materialize-empty-asset-set.test.mjs @@ -40,6 +40,37 @@ const writeApprovedSet = async (root) => { await writeFile(join(root, 'inputs/prepared-assets/approved-image.webp'), assetBytes); }; +const writeSoundtrackSet = async (root) => { + const assets = [ + ['soundtrack-intro-opus', 'nightdrive-intro.opus'], + ['soundtrack-intro-mp3', 'nightdrive-intro.mp3'], + ['soundtrack-main-opus', 'nightdrive-main.opus'], + ['soundtrack-main-mp3', 'nightdrive-main.mp3'], + ['soundtrack-afterglow-opus', 'nightdrive-afterglow.opus'], + ['soundtrack-afterglow-mp3', 'nightdrive-afterglow.mp3'], + ['soundtrack-drive-lift-opus', 'nightdrive-drive-lift.opus'], + ['soundtrack-drive-lift-mp3', 'nightdrive-drive-lift.mp3'], + ].map(([id, fileName], index) => { + const bytes = Buffer.from(`approved soundtrack asset ${index}`); + return { id, fileName, bytes, sha256: createHash('sha256').update(bytes).digest('hex') }; + }); + await writeFile(join(root, 'content/public/asset-manifest.json'), JSON.stringify({ + assets: assets.map(({ id, fileName, sha256 }) => ({ id, fileName, sha256 })), + })); + await writeFile(join(root, 'content/public/portfolio-content.json'), JSON.stringify({ + projects: { selected: [], additional: [] }, toolkit: [], metadata: {}, + soundtrack: { + intro: { opusAssetId: 'soundtrack-intro-opus', mp3AssetId: 'soundtrack-intro-mp3' }, + main: { opusAssetId: 'soundtrack-main-opus', mp3AssetId: 'soundtrack-main-mp3' }, + afterglow: { opusAssetId: 'soundtrack-afterglow-opus', mp3AssetId: 'soundtrack-afterglow-mp3' }, + driveLift: { opusAssetId: 'soundtrack-drive-lift-opus', mp3AssetId: 'soundtrack-drive-lift-mp3' }, + }, + })); + await mkdir(join(root, 'inputs/prepared-assets'), { recursive: true }); + await Promise.all(assets.map(({ fileName, bytes }) => + writeFile(join(root, 'inputs/prepared-assets', fileName), bytes))); +}; + afterEach(async () => { await Promise.all(temporaryRoots.splice(0).map((root) => rm(root, { recursive: true, force: true }))); }); @@ -59,73 +90,27 @@ describe('approved asset publication closure', () => { it('includes every soundtrack codec variant in the approved publication closure', async () => { const root = await createScratchRepository(); - const assets = [ - ['soundtrack-intro-opus', 'nightdrive-intro.opus'], - ['soundtrack-intro-mp3', 'nightdrive-intro.mp3'], - ['soundtrack-main-opus', 'nightdrive-main.opus'], - ['soundtrack-main-mp3', 'nightdrive-main.mp3'], - ['soundtrack-afterglow-opus', 'nightdrive-afterglow.opus'], - ['soundtrack-afterglow-mp3', 'nightdrive-afterglow.mp3'], - ['soundtrack-drive-lift-opus', 'nightdrive-drive-lift.opus'], - ['soundtrack-drive-lift-mp3', 'nightdrive-drive-lift.mp3'], - ].map(([id, fileName], index) => { - const bytes = Buffer.from(`approved soundtrack asset ${index}`); - return { id, fileName, bytes, sha256: createHash('sha256').update(bytes).digest('hex') }; - }); - await writeFile(join(root, 'content/public/asset-manifest.json'), JSON.stringify({ - assets: assets.map(({ id, fileName, sha256 }) => ({ id, fileName, sha256 })), - })); - await writeFile(join(root, 'content/public/portfolio-content.json'), JSON.stringify({ - projects: { selected: [], additional: [] }, - toolkit: [], - metadata: {}, - soundtrack: { - intro: { opusAssetId: 'soundtrack-intro-opus', mp3AssetId: 'soundtrack-intro-mp3' }, - main: { opusAssetId: 'soundtrack-main-opus', mp3AssetId: 'soundtrack-main-mp3' }, - afterglow: { opusAssetId: 'soundtrack-afterglow-opus', mp3AssetId: 'soundtrack-afterglow-mp3' }, - driveLift: { opusAssetId: 'soundtrack-drive-lift-opus', mp3AssetId: 'soundtrack-drive-lift-mp3' }, - }, - })); - await mkdir(join(root, 'inputs/prepared-assets'), { recursive: true }); - await Promise.all(assets.map(({ fileName, bytes }) => - writeFile(join(root, 'inputs/prepared-assets', fileName), bytes))); - + await writeSoundtrackSet(root); await expect(verifyApprovedAssetSet(root)).resolves.toBeUndefined(); }); it('rejects an omitted adaptive soundtrack asset', async () => { const root = await createScratchRepository(); - const adaptiveAsset = Buffer.from('approved adaptive asset'); - const adaptiveHash = createHash('sha256').update(adaptiveAsset).digest('hex'); - await writeFile(join(root, 'content/public/asset-manifest.json'), JSON.stringify({ assets: [{ - id: 'soundtrack-afterglow-opus', fileName: 'nightdrive-afterglow.opus', sha256: adaptiveHash, - }] })); - await writeFile(join(root, 'content/public/portfolio-content.json'), JSON.stringify({ - projects: { selected: [{ assetIds: ['soundtrack-afterglow-opus'] }], additional: [] }, toolkit: [], metadata: {}, - })); - await mkdir(join(root, 'inputs/prepared-assets'), { recursive: true }); + await writeSoundtrackSet(root); + await rm(join(root, 'inputs/prepared-assets/nightdrive-afterglow.opus')); await expect(verifyApprovedAssetSet(root)).rejects.toThrow(/missing prepared asset/i); }); it('rejects an altered adaptive soundtrack asset', async () => { const root = await createScratchRepository(); - await writeApprovedSet(root); - const adaptiveAsset = Buffer.from('approved adaptive asset'); - const adaptiveHash = createHash('sha256').update(adaptiveAsset).digest('hex'); - await writeFile(join(root, 'content/public/asset-manifest.json'), JSON.stringify({ assets: [{ - id: 'soundtrack-afterglow-opus', fileName: 'nightdrive-afterglow.opus', sha256: adaptiveHash, - }] })); - await writeFile(join(root, 'content/public/portfolio-content.json'), JSON.stringify({ - projects: { selected: [{ assetIds: ['soundtrack-afterglow-opus'] }], additional: [] }, toolkit: [], metadata: {}, - })); - await rm(join(root, 'inputs/prepared-assets/approved-image.webp')); + await writeSoundtrackSet(root); await writeFile(join(root, 'inputs/prepared-assets/nightdrive-afterglow.opus'), Buffer.from('altered adaptive asset')); await expect(verifyApprovedAssetSet(root)).rejects.toThrow(/digest|hash/i); }); it('rejects an unreferenced extra adaptive soundtrack asset', async () => { const root = await createScratchRepository(); - await writeApprovedSet(root); + await writeSoundtrackSet(root); await writeFile(join(root, 'inputs/prepared-assets/nightdrive-afterglow-extra.opus'), Buffer.from('extra adaptive asset')); await expect(verifyApprovedAssetSet(root)).rejects.toThrow(/extra prepared asset/i); });