@applitools/eyes-storybook
Version:
78 lines (67 loc) • 2.59 kB
JavaScript
;
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;