react-native-macos
Version:
A framework for building native macOS apps using React
183 lines (165 loc) • 4.81 kB
JavaScript
/**
* Copyright 2014-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
* @emails react-core
*/
;
var ReactErrorUtils;
describe('ReactErrorUtils', () => {
beforeEach(() => {
ReactErrorUtils = require('ReactErrorUtils');
});
// Run tests in both DEV and production
describe(
'invokeGuardedCallback (development)',
invokeGuardedCallbackTests.bind(null, 'development'),
);
describe('invokeGuardedCallback (production)', () => {
let oldProcess;
beforeEach(() => {
__DEV__ = false;
oldProcess = process;
global.process = {
env: Object.assign({}, process.env, {NODE_ENV: 'production'}),
};
jest.resetModules();
ReactErrorUtils = require('ReactErrorUtils');
});
afterEach(() => {
__DEV__ = true;
global.process = oldProcess;
});
invokeGuardedCallbackTests('production');
});
function invokeGuardedCallbackTests(environment) {
it(`it should rethrow errors caught by invokeGuardedCallbackAndCatchFirstError (${environment})`, () => {
var err = new Error('foo');
var callback = function() {
throw err;
};
ReactErrorUtils.invokeGuardedCallbackAndCatchFirstError(
'foo',
callback,
null,
);
expect(() => ReactErrorUtils.rethrowCaughtError()).toThrow(err);
});
it(`should call the callback the passed arguments (${environment})`, () => {
var callback = jest.fn();
ReactErrorUtils.invokeGuardedCallback(
'foo',
callback,
null,
'arg1',
'arg2',
);
expect(callback).toBeCalledWith('arg1', 'arg2');
});
it(`should call the callback with the provided context (${environment})`, () => {
var context = {didCall: false};
ReactErrorUtils.invokeGuardedCallback(
'foo',
function() {
this.didCall = true;
},
context,
);
expect(context.didCall).toBe(true);
});
it(`should return a caught error (${environment})`, () => {
const error = new Error();
const returnValue = ReactErrorUtils.invokeGuardedCallback(
'foo',
function() {
throw error;
},
null,
'arg1',
'arg2',
);
expect(returnValue).toBe(error);
});
it(`should return null if no error is thrown (${environment})`, () => {
var callback = jest.fn();
const returnValue = ReactErrorUtils.invokeGuardedCallback(
'foo',
callback,
null,
);
expect(returnValue).toBe(null);
});
it(`can nest with same debug name (${environment})`, () => {
const err1 = new Error();
let err2;
const err3 = new Error();
const err4 = ReactErrorUtils.invokeGuardedCallback(
'foo',
function() {
err2 = ReactErrorUtils.invokeGuardedCallback(
'foo',
function() {
throw err1;
},
null,
);
throw err3;
},
null,
);
expect(err2).toBe(err1);
expect(err4).toBe(err3);
});
it(`does not return nested errors (${environment})`, () => {
const err1 = new Error();
let err2;
const err3 = ReactErrorUtils.invokeGuardedCallback(
'foo',
function() {
err2 = ReactErrorUtils.invokeGuardedCallback(
'foo',
function() {
throw err1;
},
null,
);
},
null,
);
expect(err3).toBe(null); // Returns null because inner error was already captured
expect(err2).toBe(err1);
});
it(`can be shimmed (${environment})`, () => {
const ops = [];
// Override the original invokeGuardedCallback
ReactErrorUtils.invokeGuardedCallback = function(name, func, context, a) {
ops.push(a);
try {
func.call(context, a);
} catch (error) {
return error;
}
return null;
};
var err = new Error('foo');
var callback = function() {
throw err;
};
ReactErrorUtils.invokeGuardedCallbackAndCatchFirstError(
'foo',
callback,
null,
'somearg',
);
expect(() => ReactErrorUtils.rethrowCaughtError()).toThrow(err);
// invokeGuardedCallbackAndCatchFirstError and rethrowCaughtError close
// over ReactErrorUtils.invokeGuardedCallback so should use the
// shimmed version.
expect(ops).toEqual(['somearg']);
});
}
});