import * as React from 'react';
import { View } from 'react-native';
import * as ReactTestRenderer from 'react-test-renderer';
import NativeSafeAreaView from '../NativeSafeAreaView';
import {
SafeAreaProvider,
useSafeAreaInsets,
useSafeAreaFrame,
} from '../SafeAreaContext';
import { Metrics } from '../SafeArea.types';
const TEST_METRICS_1: Metrics = {
insets: { top: 1, left: 2, right: 3, bottom: 4 },
frame: { x: 0, y: 0, height: 100, width: 100 },
};
const TEST_METRICS_2: Metrics = {
insets: { top: 2, left: 3, right: 4, bottom: 5 },
frame: { x: 0, y: 0, width: 10, height: 16 },
};
const PrintInsetsTestView = () => {
const insets = useSafeAreaInsets();
const frame = useSafeAreaFrame();
return (
);
};
describe('SafeAreaProvider', () => {
it('renders', () => {
const component = ReactTestRenderer.create();
expect(component).toMatchSnapshot();
});
it('does not render child until inset values are received', () => {
const component = ReactTestRenderer.create(
,
);
expect(component).toMatchSnapshot();
});
it('renders child when inset values are received', () => {
const component = ReactTestRenderer.create(
,
);
expect(component).toMatchSnapshot();
const { onInsetsChange } = component.root.findByType(
NativeSafeAreaView,
).props;
ReactTestRenderer.act(() => {
onInsetsChange({
nativeEvent: TEST_METRICS_1,
});
});
expect(component).toMatchSnapshot();
});
it('supports setting initial insets', () => {
const component = ReactTestRenderer.create(
,
);
expect(component).toMatchSnapshot();
});
it('uses parent insets when available', () => {
const component = ReactTestRenderer.create(
,
);
expect(component).toMatchSnapshot();
});
it('uses inner insets', () => {
const component = ReactTestRenderer.create(
,
);
expect(component).toMatchSnapshot();
});
it('throws when no provider is rendered', () => {
// Silence the React error boundary warning; we expect an uncaught error.
const consoleErrorMock = jest
.spyOn(console, 'error')
.mockImplementation((message) => {
if (message.startsWith('The above error occured in the ')) {
return;
}
});
expect(() => {
ReactTestRenderer.create();
}).toThrow(
'No safe area insets value available. Make sure you are rendering `` at the top of your app.',
);
consoleErrorMock.mockRestore();
});
});