detox
Version:
E2E tests and automation for mobile
80 lines (67 loc) • 3.24 kB
JavaScript
// @ts-nocheck
const Ajv = require('ajv');
const DetoxInternalError = require('../../../errors/DetoxInternalError');
const statusSchema = require('../SyncStatusSchema.json');
const animationUpdateFormatter = require('./sync-resources/AnimationUpdateResourceFormatter');
const bgThreadFormatter = require('./sync-resources/BgThreadFormatter');
const delayedPerformSelectorFormatter = require('./sync-resources/DelayedPerformSelectorFormatter');
const dispatchQueueFormatter = require('./sync-resources/DispatchQueueFormatter');
const jsTimersFormatter = require('./sync-resources/JavaScriptTimersFormatter');
const looperFormatter = require('./sync-resources/LooperFormatter');
const networkFormatter = require('./sync-resources/NetworkFormatter');
const oneTimeEventsFormatter = require('./sync-resources/OneTimeEventsFormatter');
const runLoopFormatter = require('./sync-resources/RunLoopFormatter');
const timersFormatter = require('./sync-resources/TimersFormatter');
const uiFormatter = require('./sync-resources/UIFormatter');
const unknownResourceFormatter = require('./sync-resources/UnknownResourceFormatter');
const { makeResourceTitle } = require('./sync-resources/utils');
const ajv = new Ajv();
const isValidJSONStatus = ajv.compile(statusSchema);
function formatJSONStatus(jsonStatus) {
if (!isValidJSONStatus(jsonStatus)) {
const errorMessages = isValidJSONStatus.errors.map(
error => `• ${error.message} in path "${error.schemaPath}" with params: ${JSON.stringify(error.params)}`
);
throw new DetoxInternalError(`Given sync status is not compatible with the status schema (\`SyncStatusSchema.js\`), ` +
`given status: ${JSON.stringify(jsonStatus)}.\nWith reasons:\n${errorMessages.join('\n')}\n`);
}
if (isAppIdle(jsonStatus)) {
return 'The app seems to be idle';
}
const resourcesDescriptions = resourcesDescriptionsFromJSON(jsonStatus.busy_resources);
return `The app is busy with the following tasks:\n${resourcesDescriptions.join('\n')}`;
}
function isAppIdle(jsonStatus) {
return jsonStatus.app_status === 'idle';
}
function resourcesDescriptionsFromJSON(jsonDescriptions) {
let descriptions = [];
for (const jsonDescription of jsonDescriptions) {
const description = resourceDescriptionFromJSON(jsonDescription);
descriptions.push(description);
}
return descriptions;
}
const resourceFormatters = {
bg: bgThreadFormatter,
delayed_perform_selector: delayedPerformSelectorFormatter,
dispatch_queue: dispatchQueueFormatter,
run_loop: runLoopFormatter,
one_time_events: oneTimeEventsFormatter,
timers: timersFormatter,
ui: uiFormatter,
js_timers: jsTimersFormatter,
network: networkFormatter,
looper: looperFormatter,
io: () => { return makeResourceTitle(`Disk I/O activity.`); },
animation_updates: animationUpdateFormatter,
unknown: unknownResourceFormatter,
bridge: () => { return makeResourceTitle(`Activity on the React-Native bridge.`); },
};
function resourceDescriptionFromJSON(jsonDescription) {
const resourceName = jsonDescription.name;
const formatter = resourceFormatters[resourceName];
const properties = jsonDescription.description;
return formatter(properties);
}
module.exports = formatJSONStatus;