UNPKG

@applitools/eyes-storybook

Version:
78 lines (67 loc) 2.59 kB
'use strict'; const throat = require('throat'); const {AbortedByUserError} = require('./errMessages'); const {storyToCheckSettings, storyToOpenSettings} = require('./transformSettings'); function makeRenderStory({ logger, openEyes, performance, timeItAsync, storyDataGap, appName, serverSettings, concurrency, signal = new AbortController().signal, }) { const throttle = throat(storyDataGap); return function renderStory({story, snapshots, url}) { const baselineName = story.baselineName; const title = story.storyTitle; logger.log(`running story ${title} with baseline ${baselineName}`); const openParams = storyToOpenSettings({story, appName, serverSettings, concurrency}); const checkParams = storyToCheckSettings({story, url}); return timeItAsync(baselineName, async () => { const eyes = await openEyes({settings: openParams}); return new Promise(async (resolve, reject) => { if (signal.aborted) { return await abortStory(); } else { signal.addEventListener('abort', abortStory); } throttle(async () => { try { if (snapshots) { await eyes.checkAndClose({ target: snapshots, settings: checkParams, }); const results = await eyes.getResults(); resolve(results); } else { await eyes.abort({settings: {environments: checkParams.environments}}); reject( new Error(`Failed to get story data for ${openParams.testName}, test was aborted`), ); } } catch (err) { reject(err); } }); async function abortStory() { logger.log('received abort signal for story', title); // Inside core-base this will cause internal operations to be aborted await eyes.abort({settings: {environments: checkParams.environments}}); // This will intentionally cause not to wait for results. // Therefore there will be a "hanging" promise. // But for the purpose of the addon, which is a long living process, it doesn't matter that we didn't stop the operation inside core. reject(new AbortedByUserError(`${title} aborted after open ${signal.reason}`)); } }); }).then(onDoneStory); function onDoneStory(results) { logger.log('finished story', baselineName, 'in', performance[baselineName]); return results; } }; } module.exports = makeRenderStory;