Files
react-native/Libraries/LogBox/Data/__tests__/LogBoxLog-test.js
T
Rick Hanlon 8335ebaeab Add support for isRenderError
Summary:
This diff adds `isRenderError` to the Log data, and refactors the LogBoxLog object to accept an object in the constructor instead of adding the 7th argument. No visual updates as those are in the next diff.

Changelog: [Internal]

Reviewed By: cpojer

Differential Revision: D18466192

fbshipit-source-id: e38ef9032b8074abbc7b40cbe7a84d45285944c4
2019-11-13 11:33:38 -08:00

175 lines
4.4 KiB
JavaScript

/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @emails oncall+react_native
* @format
* @flow
*/
'use strict';
import type {StackFrame} from '../../../Core/NativeExceptionsManager';
import type {SymbolicatedStackTrace} from '../../../Core/Devtools/symbolicateStackTrace';
jest.mock('../LogBoxSymbolication', () => {
return {__esModule: true, symbolicate: jest.fn(), deleteStack: jest.fn()};
});
function getLogBoxLog() {
return new (require('../LogBoxLog')).default({
level: 'warn',
isComponentError: false,
message: {content: '...', substitutions: []},
stack: createStack(['A', 'B', 'C']),
category: 'Message category...',
componentStack: [{component: 'LogBoxLog', location: 'LogBoxLog.js:1'}],
codeFrame: {
fileName: '/path/to/RKJSModules/Apps/CrashReact/CrashReactApp.js',
location: {row: 199, column: 0},
content: '<code frame>',
},
});
}
function getLogBoxSymbolication(): {|
symbolicate: JestMockFn<
$ReadOnlyArray<Array<StackFrame>>,
Promise<SymbolicatedStackTrace>,
>,
|} {
return (require('../LogBoxSymbolication'): any);
}
const createStack = methodNames =>
methodNames.map(methodName => ({
column: null,
file: 'file://path/to/file.js',
lineNumber: 1,
methodName,
}));
describe('LogBoxLog', () => {
beforeEach(() => {
jest.resetModules();
getLogBoxSymbolication().symbolicate.mockImplementation(async stack => ({
stack: createStack(stack.map(frame => `S(${frame.methodName})`)),
codeFrame: null,
}));
});
it('creates a LogBoxLog object', () => {
const log = getLogBoxLog();
expect(log.level).toEqual('warn');
expect(log.message).toEqual({content: '...', substitutions: []});
expect(log.stack).toEqual(createStack(['A', 'B', 'C']));
expect(log.category).toEqual('Message category...');
expect(log.componentStack).toEqual([
{component: 'LogBoxLog', location: 'LogBoxLog.js:1'},
]);
expect(log.codeFrame).toEqual({
fileName: '/path/to/RKJSModules/Apps/CrashReact/CrashReactApp.js',
location: {row: 199, column: 0},
content: '<code frame>',
});
});
it('increments LogBoxLog count', () => {
const log = getLogBoxLog();
expect(log.count).toEqual(1);
log.incrementCount();
expect(log.count).toEqual(2);
});
it('starts without a symbolicated stack', () => {
const log = getLogBoxLog();
expect(log.symbolicated).toEqual({
error: null,
stack: null,
status: 'NONE',
});
});
it('updates when symbolication is in progress', () => {
const log = getLogBoxLog();
const callback = jest.fn();
log.symbolicate(callback);
expect(callback).toBeCalledTimes(1);
expect(callback).toBeCalledWith('PENDING');
expect(log.symbolicated).toEqual({
error: null,
stack: null,
status: 'PENDING',
});
});
it('updates when symbolication finishes', () => {
const log = getLogBoxLog();
const callback = jest.fn();
log.symbolicate(callback);
expect(callback).toBeCalledTimes(1);
expect(callback).toBeCalledWith('PENDING');
jest.runAllTicks();
expect(callback).toBeCalledTimes(2);
expect(callback).toBeCalledWith('COMPLETE');
expect(log.symbolicated).toEqual({
error: null,
stack: createStack(['S(A)', 'S(B)', 'S(C)']),
status: 'COMPLETE',
});
});
it('updates when symbolication fails', () => {
const error = new Error('...');
getLogBoxSymbolication().symbolicate.mockImplementation(async stack => {
throw error;
});
const log = getLogBoxLog();
const callback = jest.fn();
log.symbolicate(callback);
expect(callback).toBeCalledTimes(1);
expect(callback).toBeCalledWith('PENDING');
jest.runAllTicks();
expect(callback).toBeCalledTimes(2);
expect(callback).toBeCalledWith('FAILED');
expect(log.symbolicated).toEqual({
error,
stack: null,
status: 'FAILED',
});
});
it('does not update aborted requests', () => {
const log = getLogBoxLog();
const callback = jest.fn();
const request = log.symbolicate(callback);
expect(callback).toBeCalledTimes(1);
expect(callback).toBeCalledWith('PENDING');
request.abort();
jest.runAllTicks();
expect(callback).toBeCalledTimes(1);
expect(callback).toBeCalledWith('PENDING');
});
});