2
0
mirror of synced 2025-02-17 08:46:43 +00:00

[tests] make detox + mocha optional peer deps

This commit is contained in:
Salakar 2018-03-26 20:13:51 +01:00
parent e19e87b0aa
commit 87e822cb53
2 changed files with 94 additions and 66 deletions

View File

@ -1,72 +1,81 @@
/* eslint-disable no-param-reassign */ /* eslint-disable no-param-reassign,global-require */
global.bridge = {}; global.bridge = {};
require('./source-map'); require('./source-map');
const detox = require('detox');
const ws = require('./ws'); const ws = require('./ws');
const ready = require('./ready'); const ready = require('./ready');
const coverage = require('./coverage'); const coverage = require('./coverage');
/* --------------------- let detox;
* DEVICE OVERRIDES try {
* --------------------- */ detox = require('detox');
} catch (e) {
// ignore
}
let device; if (detox) {
Object.defineProperty(global, 'device', { /* ---------------------
get() { * DEVICE OVERRIDES
return device; * --------------------- */
},
set(originalDevice) {
// device.reloadReactNative({ ... })
// todo detoxOriginalReloadReactNative currently broken it seems
// const detoxOriginalReloadReactNative = originalDevice.reloadReactNative.bind(originalDevice);
originalDevice.reloadReactNative = async () => {
ready.reset();
global.bridge.reload();
return ready.wait();
};
// device.launchApp({ ... }) let device;
const detoxOriginalLaunchApp = originalDevice.launchApp.bind( Object.defineProperty(global, 'device', {
originalDevice get() {
); return device;
originalDevice.launchApp = async (...args) => { },
ready.reset(); set(originalDevice) {
await detoxOriginalLaunchApp(...args); // device.reloadReactNative({ ... })
return ready.wait(); // todo detoxOriginalReloadReactNative currently broken it seems
}; // const detoxOriginalReloadReactNative = originalDevice.reloadReactNative.bind(originalDevice);
originalDevice.reloadReactNative = async () => {
ready.reset();
global.bridge.reload();
return ready.wait();
};
device = originalDevice; // device.launchApp({ ... })
return originalDevice; const detoxOriginalLaunchApp = originalDevice.launchApp.bind(
}, originalDevice
}); );
originalDevice.launchApp = async (...args) => {
ready.reset();
await detoxOriginalLaunchApp(...args);
return ready.wait();
};
/* ------------------- device = originalDevice;
* DETOX OVERRIDES return originalDevice;
* ------------------- */ },
});
// detox.init() /* -------------------
const detoxOriginalInit = detox.init.bind(detox); * DETOX OVERRIDES
detox.init = async (...args) => { * ------------------- */
ready.reset();
await detoxOriginalInit(...args);
return ready.wait();
};
// detox.cleanup() // detox.init()
const detoxOriginalCleanup = detox.cleanup.bind(detox); const detoxOriginalInit = detox.init.bind(detox);
detox.cleanup = async (...args) => { detox.init = async (...args) => {
try { ready.reset();
ws.close(); await detoxOriginalInit(...args);
} catch (e) { return ready.wait();
// do nothing };
}
await detoxOriginalCleanup(...args); // detox.cleanup()
}; const detoxOriginalCleanup = detox.cleanup.bind(detox);
detox.cleanup = async (...args) => {
try {
ws.close();
} catch (e) {
// do nothing
}
await detoxOriginalCleanup(...args);
};
}
// setup after hook to ensure final context coverage is captured // setup after hook to ensure final context coverage is captured
process.nextTick(() => { process.nextTick(() => {
after(() => { if (global.after) {
coverage.collect(); after(() => {
}); coverage.collect();
});
}
}); });

View File

@ -1,12 +1,16 @@
/* eslint-disable no-param-reassign */ /* eslint-disable no-param-reassign,global-require */
const Mocha = require('mocha'); let Mocha;
const ErrorStack = require('error-stack-parser'); try {
const { SourceMapConsumer } = require('source-map'); Mocha = require('mocha');
} catch (e) {
// ignore
}
let bundleFileName = null; let bundleFileName = null;
const Runner = Mocha.Runner;
let sourceMapConsumer = null; let sourceMapConsumer = null;
const originalFail = Runner.prototype.fail;
const ErrorStack = require('error-stack-parser');
const { SourceMapConsumer } = require('source-map');
/** /**
* Convert an error frame into a source mapped string * Convert an error frame into a source mapped string
@ -23,8 +27,13 @@ function frameToStr(parsed) {
parsed.columnNumber})`; parsed.columnNumber})`;
} }
// override mocha fail so we can replace stack traces /**
Runner.prototype.fail = function fail(test, error) { * Convert an errors stack frames to their original source mapped positions
*
* @param error
* @return {*}
*/
function sourceMappedError(error) {
const original = error.stack.split('\n'); const original = error.stack.split('\n');
const parsed = ErrorStack.parse(error); const parsed = ErrorStack.parse(error);
@ -37,10 +46,20 @@ Runner.prototype.fail = function fail(test, error) {
} }
error.stack = newStack.join('\n'); error.stack = newStack.join('\n');
return originalFail.call(this, test, error); return error;
}; }
if (Mocha) {
// override mocha fail so we can replace stack traces
const Runner = Mocha.Runner;
const originalFail = Runner.prototype.fail;
Runner.prototype.fail = function fail(test, error) {
return originalFail.call(this, test, sourceMappedError(error));
};
}
module.exports = { module.exports = {
sourceMappedError,
/** /**
* Build a source map consumer from source map bundle contents * Build a source map consumer from source map bundle contents
* @param str * @param str