test: exercise soundtrack materialization failures
This commit is contained in:
@@ -40,6 +40,37 @@ const writeApprovedSet = async (root) => {
|
|||||||
await writeFile(join(root, 'inputs/prepared-assets/approved-image.webp'), assetBytes);
|
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 () => {
|
afterEach(async () => {
|
||||||
await Promise.all(temporaryRoots.splice(0).map((root) => rm(root, { recursive: true, force: true })));
|
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 () => {
|
it('includes every soundtrack codec variant in the approved publication closure', async () => {
|
||||||
const root = await createScratchRepository();
|
const root = await createScratchRepository();
|
||||||
const assets = [
|
await writeSoundtrackSet(root);
|
||||||
['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 expect(verifyApprovedAssetSet(root)).resolves.toBeUndefined();
|
await expect(verifyApprovedAssetSet(root)).resolves.toBeUndefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('rejects an omitted adaptive soundtrack asset', async () => {
|
it('rejects an omitted adaptive soundtrack asset', async () => {
|
||||||
const root = await createScratchRepository();
|
const root = await createScratchRepository();
|
||||||
const adaptiveAsset = Buffer.from('approved adaptive asset');
|
await writeSoundtrackSet(root);
|
||||||
const adaptiveHash = createHash('sha256').update(adaptiveAsset).digest('hex');
|
await rm(join(root, 'inputs/prepared-assets/nightdrive-afterglow.opus'));
|
||||||
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);
|
await expect(verifyApprovedAssetSet(root)).rejects.toThrow(/missing prepared asset/i);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('rejects an altered adaptive soundtrack asset', async () => {
|
it('rejects an altered adaptive soundtrack asset', async () => {
|
||||||
const root = await createScratchRepository();
|
const root = await createScratchRepository();
|
||||||
await writeApprovedSet(root);
|
await writeSoundtrackSet(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 writeFile(join(root, 'inputs/prepared-assets/nightdrive-afterglow.opus'), Buffer.from('altered adaptive asset'));
|
||||||
await expect(verifyApprovedAssetSet(root)).rejects.toThrow(/digest|hash/i);
|
await expect(verifyApprovedAssetSet(root)).rejects.toThrow(/digest|hash/i);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('rejects an unreferenced extra adaptive soundtrack asset', async () => {
|
it('rejects an unreferenced extra adaptive soundtrack asset', async () => {
|
||||||
const root = await createScratchRepository();
|
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 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);
|
await expect(verifyApprovedAssetSet(root)).rejects.toThrow(/extra prepared asset/i);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user