diff --git a/tests/integration/materialize-empty-asset-set.test.mjs b/tests/integration/materialize-empty-asset-set.test.mjs index 7002dd1..8e523f6 100644 --- a/tests/integration/materialize-empty-asset-set.test.mjs +++ b/tests/integration/materialize-empty-asset-set.test.mjs @@ -93,6 +93,43 @@ describe('approved asset publication closure', () => { 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 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 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 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); + }); + it('rejects a symbolic-link prepared-asset directory', async () => { const root = await createScratchRepository(); const target = join(root, 'outside');