detox-allure2-adapter
Version:
Detox adapter for jest-allure2-reporter
161 lines • 6.66 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.listener = void 0;
const tslib_1 = require("tslib");
const detox_1 = tslib_1.__importDefault(require("detox"));
const internals_1 = require("detox/internals");
const api_1 = require("jest-allure2-reporter/api");
const file_handlers_1 = require("./file-handlers");
const logs_1 = require("./logs");
const screenshots_1 = require("./screenshots");
const steps_1 = require("./steps");
const utils_1 = require("./utils");
const video_1 = require("./video");
const view_hierarchy_1 = require("./view-hierarchy");
const listener = ({ testEvents }, { deviceLogs = true, deviceScreenshots = true, deviceVideos = true, deviceViewHierarchy = true, userArtifacts = 'move', onError: onErrorOption, } = {}) => {
let workerWrapper;
let logs;
let screenshots;
let videoManager;
let viewHierarchy;
let $test;
let $hook;
let failing = false;
const onError = (0, utils_1.createErrorHandler)(onErrorOption ?? 'warn');
const recycleBin = file_handlers_1.RecycleBin.instance(onError);
const flushArtifacts = (0, utils_1.once)(async () => {
await Promise.all([
logs?.close(),
videoManager?.stopAndAttach($hook, failing),
recycleBin.clear(),
]);
workerWrapper = logs = screenshots = viewHierarchy = videoManager = undefined;
});
testEvents
.on('setup', () => {
api_1.allure.$plug((context) => {
context.fileAttachmentHandlers['mv-delayed'] ??= (0, file_handlers_1.createDelayedMvHandler)(context);
context.fileAttachmentHandlers['zip'] ??= (0, file_handlers_1.createZipHandler)(context);
context.fileAttachmentHandlers['zip-rm'] ??= (0, file_handlers_1.createZipRmHandler)(context);
context.handlebars.registerHelper('firstOr', function (defaultValue) {
return this[0] || defaultValue;
});
});
workerWrapper = new utils_1.WorkerWrapper(internals_1.worker);
const device = new utils_1.DeviceWrapper(detox_1.default.device);
if (device.platform !== 'ios' && device.platform !== 'android') {
return;
}
if (workerWrapper.artifactsManager) {
const noop = () => Promise.resolve();
const artifactsManager = workerWrapper.artifactsManager;
if (artifactsManager._artifactPlugins.uiHierarchy) {
artifactsManager._artifactPlugins.uiHierarchy._registerSnapshot = noop;
}
if (artifactsManager._artifactPlugins.screenshot) {
artifactsManager._artifactPlugins.screenshot._registerSnapshot = noop;
}
artifactsManager._callPlugins = noop;
artifactsManager._callSinglePlugin = noop;
}
if (deviceLogs) {
logs = new logs_1.LogBuffer({
device,
options: deviceLogs,
onError,
});
workerWrapper.eventEmitter.on('beforeLaunchApp', () => logs?.setPid(Number.NaN));
workerWrapper.eventEmitter.on('launchApp', ({ pid }) => logs?.setPid(pid));
workerWrapper.eventEmitter.on('terminateApp', () => logs?.setPid(Number.NaN));
}
if (deviceScreenshots) {
screenshots = new screenshots_1.ScreenshotHelper({
device,
options: deviceScreenshots,
onError,
});
}
if (deviceVideos) {
const baseOptions = deviceVideos === true ? {} : deviceVideos;
videoManager = new video_1.VideoManager({ device, options: baseOptions, onError });
}
if (deviceViewHierarchy) {
viewHierarchy = new view_hierarchy_1.ViewHierarchyHelper({
device,
onError,
screenshotsHelper: new screenshots_1.ScreenshotHelper({
device,
options: true,
onError,
}),
});
}
if (device.platform === 'ios') {
workerWrapper.eventEmitter.on('beforeLaunchApp', (event) => {
if (viewHierarchy) {
event.launchArgs.detoxDebugVisibility = 'YES';
event.launchArgs.detoxDisableHierarchyDump = 'NO';
}
else {
event.launchArgs.detoxDebugVisibility = 'NO';
event.launchArgs.detoxDisableHierarchyDump = 'YES';
}
});
}
})
.on('setup', async () => {
if (workerWrapper) {
(0, steps_1.wrapWithSteps)({
detox: detox_1.default,
worker: workerWrapper,
allure: api_1.allure,
logs,
screenshots,
videoManager,
viewHierarchy,
userArtifacts,
});
}
})
.on('run_start', async () => {
await videoManager?.ensureRecordingEager();
})
.on('test_started', async () => {
await videoManager?.ensureRecordingEager();
})
.on('test_start', async () => {
$test = api_1.allure.$bind();
$hook = undefined;
logs?.attachBefore(api_1.allure);
failing = false;
})
.on('hook_start', async ({ event }) => {
logs?.attachBefore(api_1.allure);
if (event.hook.type === 'beforeAll' || event.hook.type === 'afterAll') {
$hook ??= api_1.allure.$bind();
await videoManager?.ensureRecordingEager();
}
})
.on('hook_failure', async () => {
failing = true;
await Promise.all([logs?.attachAfterFailure(api_1.allure), screenshots?.attachFailure(api_1.allure)]);
})
.on('hook_success', async () => {
await Promise.all([logs?.attachAfterSuccess(api_1.allure), screenshots?.attachSuccess(api_1.allure)]);
})
.on('test_fn_failure', async () => {
failing = true;
await Promise.all([logs?.attachAfterFailure(api_1.allure), screenshots?.attachFailure(api_1.allure)]);
})
.on('test_fn_success', async () => {
await Promise.all([logs?.attachAfterSuccess(api_1.allure), screenshots?.attachSuccess(api_1.allure)]);
})
.on('test_done', async () => {
await videoManager?.stopAndAttach($test, failing);
$test = undefined;
})
.once('teardown', flushArtifacts, -1)
.once('test_environment_teardown', flushArtifacts, -1);
};
exports.listener = listener;
//# sourceMappingURL=listener.js.map