index-test.tsx 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import * as React from 'react';
  2. import * as ReactTestRenderer from 'react-test-renderer';
  3. import { View, UIManager } from 'react-native';
  4. import { SafeAreaProvider, SafeAreaView, useSafeArea } from '../index';
  5. import NativeSafeAreaView from '../NativeSafeAreaView';
  6. const PrintInsetsTestView = () => {
  7. const insets = useSafeArea();
  8. return (
  9. <View
  10. style={{
  11. top: insets.top,
  12. left: insets.left,
  13. bottom: insets.bottom,
  14. right: insets.right,
  15. }}
  16. />
  17. );
  18. };
  19. describe('SafeAreaProvider', () => {
  20. it('renders', () => {
  21. const component = ReactTestRenderer.create(<SafeAreaProvider />);
  22. expect(component).toMatchSnapshot();
  23. });
  24. it('does not render child until inset values are received', () => {
  25. const component = ReactTestRenderer.create(
  26. <SafeAreaProvider>
  27. <PrintInsetsTestView />
  28. </SafeAreaProvider>,
  29. );
  30. expect(component).toMatchSnapshot();
  31. });
  32. it('renders child when inset values are received', () => {
  33. const component = ReactTestRenderer.create(
  34. <SafeAreaProvider>
  35. <PrintInsetsTestView />
  36. </SafeAreaProvider>,
  37. );
  38. expect(component).toMatchSnapshot();
  39. const { onInsetsChange } = component.root.findByType(
  40. NativeSafeAreaView,
  41. ).props;
  42. ReactTestRenderer.act(() => {
  43. onInsetsChange({
  44. nativeEvent: { insets: { top: 1, left: 2, right: 3, bottom: 4 } },
  45. });
  46. });
  47. expect(component).toMatchSnapshot();
  48. });
  49. it('supports setting initial insets', () => {
  50. const component = ReactTestRenderer.create(
  51. <SafeAreaProvider
  52. initialSafeAreaInsets={{ top: 1, left: 2, right: 3, bottom: 4 }}
  53. >
  54. <PrintInsetsTestView />
  55. </SafeAreaProvider>,
  56. );
  57. expect(component).toMatchSnapshot();
  58. });
  59. it('uses parent insets when available', () => {
  60. const component = ReactTestRenderer.create(
  61. <SafeAreaProvider
  62. initialSafeAreaInsets={{ top: 1, left: 2, right: 3, bottom: 4 }}
  63. >
  64. <SafeAreaProvider>
  65. <PrintInsetsTestView />
  66. </SafeAreaProvider>
  67. </SafeAreaProvider>,
  68. );
  69. expect(component).toMatchSnapshot();
  70. });
  71. it('uses inner insets', () => {
  72. const component = ReactTestRenderer.create(
  73. <SafeAreaProvider
  74. initialSafeAreaInsets={{ top: 1, left: 2, right: 3, bottom: 4 }}
  75. >
  76. <SafeAreaProvider
  77. initialSafeAreaInsets={{ top: 2, left: 3, right: 4, bottom: 5 }}
  78. >
  79. <PrintInsetsTestView />
  80. </SafeAreaProvider>
  81. </SafeAreaProvider>,
  82. );
  83. expect(component).toMatchSnapshot();
  84. });
  85. it('throws when no provider is rendered', () => {
  86. // Silence the React error boundary warning; we expect an uncaught error.
  87. const consoleErrorMock = jest
  88. .spyOn(console, 'error')
  89. .mockImplementation(message => {
  90. if (message.startsWith('The above error occured in the ')) {
  91. return;
  92. }
  93. });
  94. expect(() => {
  95. ReactTestRenderer.create(<PrintInsetsTestView />);
  96. }).toThrow(
  97. 'No safe area value available. Make sure you are rendering `<SafeAreaProvider>` at the top of your app.',
  98. );
  99. consoleErrorMock.mockRestore();
  100. });
  101. });
  102. describe('SafeAreaView', () => {
  103. it('renders', () => {
  104. const component = ReactTestRenderer.create(
  105. <SafeAreaProvider
  106. initialSafeAreaInsets={{ top: 1, left: 2, right: 3, bottom: 4 }}
  107. >
  108. <SafeAreaView>
  109. <View />
  110. </SafeAreaView>
  111. </SafeAreaProvider>,
  112. );
  113. expect(component).toMatchSnapshot();
  114. });
  115. it('can override padding styles', () => {
  116. const component = ReactTestRenderer.create(
  117. <SafeAreaProvider
  118. initialSafeAreaInsets={{ top: 1, left: 2, right: 3, bottom: 4 }}
  119. >
  120. <SafeAreaView style={{ paddingTop: 0 }}>
  121. <View />
  122. </SafeAreaView>
  123. </SafeAreaProvider>,
  124. );
  125. expect(component).toMatchSnapshot();
  126. });
  127. });
  128. describe('initialWindowSafeAreaInsets', () => {
  129. it('is null when no view config is available', () => {
  130. jest.resetModules();
  131. expect(require('../index').initialWindowSafeAreaInsets).toBe(null);
  132. });
  133. it('it uses the constant provided by the view config', () => {
  134. jest.resetModules();
  135. const testInsets = {
  136. top: 20,
  137. left: 0,
  138. right: 0,
  139. bottom: 0,
  140. };
  141. UIManager.getViewManagerConfig = jest.fn(name => {
  142. if (name === 'RNCSafeAreaView') {
  143. return {
  144. Commands: {},
  145. Constants: {
  146. initialWindowSafeAreaInsets: testInsets,
  147. },
  148. };
  149. }
  150. return { Commands: {} };
  151. });
  152. expect(require('../index').initialWindowSafeAreaInsets).toBe(testInsets);
  153. expect(UIManager.getViewManagerConfig).toBeCalledWith('RNCSafeAreaView');
  154. });
  155. });