SafeAreaContext-test.tsx 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import * as React from 'react';
  2. import { View } from 'react-native';
  3. import * as ReactTestRenderer from 'react-test-renderer';
  4. import NativeSafeAreaView from '../NativeSafeAreaView';
  5. import {
  6. SafeAreaProvider,
  7. useSafeAreaInsets,
  8. useSafeAreaFrame,
  9. } from '../SafeAreaContext';
  10. import { Metrics } from '../SafeArea.types';
  11. const TEST_METRICS_1: Metrics = {
  12. insets: { top: 1, left: 2, right: 3, bottom: 4 },
  13. frame: { x: 0, y: 0, height: 100, width: 100 },
  14. };
  15. const TEST_METRICS_2: Metrics = {
  16. insets: { top: 2, left: 3, right: 4, bottom: 5 },
  17. frame: { x: 0, y: 0, width: 10, height: 16 },
  18. };
  19. const PrintInsetsTestView = () => {
  20. const insets = useSafeAreaInsets();
  21. const frame = useSafeAreaFrame();
  22. return (
  23. <View
  24. style={{
  25. paddingTop: insets.top,
  26. paddingLeft: insets.left,
  27. paddingBottom: insets.bottom,
  28. paddingRight: insets.right,
  29. top: frame.y,
  30. left: frame.y,
  31. width: frame.width,
  32. height: frame.height,
  33. }}
  34. />
  35. );
  36. };
  37. describe('SafeAreaProvider', () => {
  38. it('renders', () => {
  39. const component = ReactTestRenderer.create(<SafeAreaProvider />);
  40. expect(component).toMatchSnapshot();
  41. });
  42. it('does not render child until inset values are received', () => {
  43. const component = ReactTestRenderer.create(
  44. <SafeAreaProvider>
  45. <PrintInsetsTestView />
  46. </SafeAreaProvider>,
  47. );
  48. expect(component).toMatchSnapshot();
  49. });
  50. it('renders child when inset values are received', () => {
  51. const component = ReactTestRenderer.create(
  52. <SafeAreaProvider>
  53. <PrintInsetsTestView />
  54. </SafeAreaProvider>,
  55. );
  56. expect(component).toMatchSnapshot();
  57. const { onInsetsChange } = component.root.findByType(
  58. NativeSafeAreaView,
  59. ).props;
  60. ReactTestRenderer.act(() => {
  61. onInsetsChange({
  62. nativeEvent: TEST_METRICS_1,
  63. });
  64. });
  65. expect(component).toMatchSnapshot();
  66. });
  67. it('supports setting initial insets', () => {
  68. const component = ReactTestRenderer.create(
  69. <SafeAreaProvider initialMetrics={TEST_METRICS_1}>
  70. <PrintInsetsTestView />
  71. </SafeAreaProvider>,
  72. );
  73. expect(component).toMatchSnapshot();
  74. });
  75. it('uses parent insets when available', () => {
  76. const component = ReactTestRenderer.create(
  77. <SafeAreaProvider initialMetrics={TEST_METRICS_1}>
  78. <SafeAreaProvider>
  79. <PrintInsetsTestView />
  80. </SafeAreaProvider>
  81. </SafeAreaProvider>,
  82. );
  83. expect(component).toMatchSnapshot();
  84. });
  85. it('uses inner insets', () => {
  86. const component = ReactTestRenderer.create(
  87. <SafeAreaProvider initialMetrics={TEST_METRICS_1}>
  88. <SafeAreaProvider initialMetrics={TEST_METRICS_2}>
  89. <PrintInsetsTestView />
  90. </SafeAreaProvider>
  91. </SafeAreaProvider>,
  92. );
  93. expect(component).toMatchSnapshot();
  94. });
  95. it('throws when no provider is rendered', () => {
  96. // Silence the React error boundary warning; we expect an uncaught error.
  97. const consoleErrorMock = jest
  98. .spyOn(console, 'error')
  99. .mockImplementation((message) => {
  100. if (message.startsWith('The above error occured in the ')) {
  101. return;
  102. }
  103. });
  104. expect(() => {
  105. ReactTestRenderer.create(<PrintInsetsTestView />);
  106. }).toThrow(
  107. 'No safe area insets value available. Make sure you are rendering `<SafeAreaProvider>` at the top of your app.',
  108. );
  109. consoleErrorMock.mockRestore();
  110. });
  111. });