@applicaster/quick-brick-core
Version:
Core package for Applicaster's Quick Brick App
135 lines (103 loc) • 3.05 kB
JavaScript
import * as React from "react";
import { View, Text } from "react-native";
import { create, act } from "react-test-renderer";
const Component = () => (
<View>
<Text>I'm a component</Text>
</View>
);
const logger = {
warning: jest.fn(),
log: jest.fn(),
debug: jest.fn(),
info: jest.fn(),
};
jest.mock("../../logger", () => ({
coreAppLogger: {
addSubsystem: jest.fn(() => logger),
},
}));
const QuickBrickManager = {
sendQuickBrickEvent: jest.fn(),
};
const LOADING_ERROR = new Error("loading failed");
const appLoader = jest.fn((_dispatch, _getState) => {
if (_getState().shouldFail) return Promise.reject(LOADING_ERROR);
return Promise.resolve();
});
const dispatch = jest.fn();
const state = {
rivers: {},
plugins: {},
appSettings: { runtimeConfigurationUrls: { rivers: "http://rivers.url" } },
};
const QUICK_BRICK_READY_EVENT = "quickBrickReady";
const actions = {};
jest.mock("@applicaster/zapp-react-native-utils/reactHooks/actions", () => ({
useActions: jest.fn(() => ({ actions })),
}));
const { appLifeCycleManager } = require("../index");
describe("appLifeCycleManager", () => {
const decorator = appLifeCycleManager(appLoader, QuickBrickManager);
beforeEach(() => {
logger.warning.mockClear();
appLoader.mockClear();
QuickBrickManager.sendQuickBrickEvent.mockClear();
dispatch.mockClear();
});
it("returns a function to decorate a component", () => {
expect(decorator).toBeFunction();
});
it("runs the loaders, then sends quickBrickReady event", (done) => {
const DecoratedComponent = decorator(Component);
let wrapper;
const testCallback = () => {
expect(dispatch).toHaveBeenCalledWith(
expect.objectContaining({ type: "SET_APP_READY" })
);
expect(QuickBrickManager.sendQuickBrickEvent).toHaveBeenCalledWith(
QUICK_BRICK_READY_EVENT
);
done();
};
act(() => {
wrapper = create(
<DecoratedComponent
dispatch={dispatch}
{...state}
testCallback={testCallback}
/>
);
});
expect(wrapper.toJSON()).toMatchSnapshot();
expect(appLoader).toHaveBeenCalled();
expect.assertions(4);
});
it("sends the quickBrickReady event when a loader doesn't resolves", (done) => {
const DecoratedComponent = decorator(Component);
let wrapper;
const testCallback = () => {
expect(dispatch).toHaveBeenCalledWith(
expect.objectContaining({ type: "SET_APP_READY" })
);
expect(QuickBrickManager.sendQuickBrickEvent).toHaveBeenCalledWith(
QUICK_BRICK_READY_EVENT
);
expect(logger.warning.mock.calls).toMatchSnapshot();
done();
};
act(() => {
wrapper = create(
<DecoratedComponent
dispatch={dispatch}
{...state}
shouldFail
testCallback={testCallback}
/>
);
});
expect(wrapper.toJSON()).toMatchSnapshot();
expect(appLoader).toHaveBeenCalled();
expect.assertions(5);
});
});