@jobber/components-native 0.101.3 → 0.101.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/dist/package.json +19 -11
  2. package/dist/src/ActionItem/ActionItem.test.js +81 -0
  3. package/dist/src/ActionItem/ActionItemGroup.test.js +25 -0
  4. package/dist/src/ActionItem/components/ActionItemContainer.test.js +24 -0
  5. package/dist/src/ActionLabel/ActionLabel.test.js +81 -0
  6. package/dist/src/ActivityIndicator/ActivityIndicator.test.js +23 -0
  7. package/dist/src/AtlantisContext/AtlantisContext.test.js +35 -0
  8. package/dist/src/AtlantisThemeContext/AtlantisThemeContext.test.js +65 -0
  9. package/dist/src/AtlantisThemeContext/buildThemedStyles.test.js +43 -0
  10. package/dist/src/AutoLink/AutoLink.test.js +133 -0
  11. package/dist/src/AutoLink/components/Link/Link.test.js +18 -0
  12. package/dist/src/Banner/Banner.test.js +98 -0
  13. package/dist/src/BottomSheet/BottomSheet.test.js +105 -0
  14. package/dist/src/BottomSheet/components/BottomSheetOption/BottomSheetOption.test.js +19 -0
  15. package/dist/src/BottomSheet/hooks/useBottomSheetBackHandler.test.js +68 -0
  16. package/dist/src/Button/Button.test.js +228 -0
  17. package/dist/src/Button/components/InternalButtonLoading/InternalButtonLoading.test.js +25 -0
  18. package/dist/src/ButtonGroup/ButtonGroup.test.js +153 -0
  19. package/dist/src/Card/Card.test.js +80 -0
  20. package/dist/src/Card/components/InternalCardHeader.test.js +18 -0
  21. package/dist/src/Checkbox/Checkbox.test.js +135 -0
  22. package/dist/src/Checkbox/CheckboxGroup.test.js +197 -0
  23. package/dist/src/Checkbox/CheckboxGroupReducer.test.js +25 -0
  24. package/dist/src/Chip/Chip.test.js +69 -0
  25. package/dist/src/Content/Content.test.js +250 -0
  26. package/dist/src/ContentOverlay/ContentOverlay.test.js +297 -0
  27. package/dist/src/ContentOverlay/computeContentOverlayBehavior.test.js +197 -0
  28. package/dist/src/ContentOverlay/hooks/useBottomSheetModalBackHandler.test.js +62 -0
  29. package/dist/src/ContentOverlay/hooks/useKeyboardVisibility.test.js +41 -0
  30. package/dist/src/ContentOverlay/hooks/useViewLayoutHeight.test.js +62 -0
  31. package/dist/src/Disclosure/Disclosure.test.js +64 -0
  32. package/dist/src/Divider/Divider.test.js +65 -0
  33. package/dist/src/EmptyState/EmptyState.test.js +82 -0
  34. package/dist/src/ErrorMessageWrapper/ErrorMessageWrapper.test.js +29 -0
  35. package/dist/src/Flex/Flex.test.js +104 -0
  36. package/dist/src/Form/Form.test.js +393 -0
  37. package/dist/src/Form/components/FormErrorBanner/FormErrorBanner.test.js +41 -0
  38. package/dist/src/Form/components/FormMessage/FormMessage.test.js +73 -0
  39. package/dist/src/Form/components/FormMessageBanner/FormMessageBanner.test.js +30 -0
  40. package/dist/src/Form/components/FormSaveButton/FormSaveButton.test.js +82 -0
  41. package/dist/src/Form/context/AtlantisFormContext.test.js +28 -0
  42. package/dist/src/Form/hooks/useScrollToError/useScrollToError.test.js +89 -0
  43. package/dist/src/FormField/FormField.test.js +81 -0
  44. package/dist/src/FormatFile/FormatFile.test.js +212 -0
  45. package/dist/src/FormatFile/FormatFileThumbnail.test.js +192 -0
  46. package/dist/src/FormatFile/components/FormatFileBottomSheet/FormatFileBottomSheet.test.js +74 -0
  47. package/dist/src/FormatFile/components/MediaView/MediaView.test.js +202 -0
  48. package/dist/src/FormatFile/utils/parseFile.test.js +188 -0
  49. package/dist/src/Glimmer/Glimmer.test.js +61 -0
  50. package/dist/src/Heading/Heading.test.js +61 -0
  51. package/dist/src/Icon/Icon.test.js +40 -0
  52. package/dist/src/IconButton/IconButton.test.js +38 -0
  53. package/dist/src/InputCurrency/InputCurrency.test.js +106 -0
  54. package/dist/src/InputDate/InputDate.test.js +184 -0
  55. package/dist/src/InputEmail/InputEmail.test.js +27 -0
  56. package/dist/src/InputFieldWrapper/InputFieldWrapper.test.js +279 -0
  57. package/dist/src/InputFieldWrapper/components/ClearAction/ClearAction.test.js +9 -0
  58. package/dist/src/InputFieldWrapper/components/Prefix/Prefix.test.js +130 -0
  59. package/dist/src/InputFieldWrapper/components/Suffix/Suffix.test.js +51 -0
  60. package/dist/src/InputNumber/InputNumber.test.js +220 -0
  61. package/dist/src/InputPassword/InputPassword.test.js +63 -0
  62. package/dist/src/InputPressable/InputPressable.test.js +138 -0
  63. package/dist/src/InputSearch/InputSearch.test.js +54 -0
  64. package/dist/src/InputText/InputText.test.js +652 -0
  65. package/dist/src/InputText/context/InputAccessoriesProvider.test.js +71 -0
  66. package/dist/src/InputTime/InputTime.test.js +199 -0
  67. package/dist/src/InputTime/utils/utils.test.js +32 -0
  68. package/dist/src/ProgressBar/ProgressBar.test.js +89 -0
  69. package/dist/src/Select/Select.test.js +183 -0
  70. package/dist/src/Select/components/SelectDefaultPicker/SelectDefaultPicker.test.js +51 -0
  71. package/dist/src/Select/components/SelectInternalPicker/SelectInternalPicker.test.js +72 -0
  72. package/dist/src/StatusLabel/StatusLabel.test.js +51 -0
  73. package/dist/src/Switch/Switch.test.js +60 -0
  74. package/dist/src/Switch/components/BaseSwitch/BaseSwitch.test.js +61 -0
  75. package/dist/src/Text/Text.test.js +161 -0
  76. package/dist/src/TextList/TextList.test.js +16 -0
  77. package/dist/src/ThumbnailList/ThumbnailList.test.js +72 -0
  78. package/dist/src/Toast/Toast.test.js +51 -0
  79. package/dist/src/Typography/Typography.test.js +225 -0
  80. package/dist/src/hooks/useAtlantisI18n/useAtlantisI18n.test.js +103 -0
  81. package/dist/src/utils/meta/meta.test.js +83 -0
  82. package/dist/tsconfig.build.json +5 -1
  83. package/dist/tsconfig.build.tsbuildinfo +1 -1
  84. package/dist/tsconfig.eslint.json +14 -0
  85. package/dist/tsconfig.json +3 -4
  86. package/dist/types/src/ActionItem/ActionItem.test.d.ts +1 -0
  87. package/dist/types/src/ActionItem/ActionItemGroup.test.d.ts +1 -0
  88. package/dist/types/src/ActionItem/components/ActionItemContainer.test.d.ts +1 -0
  89. package/dist/types/src/ActionLabel/ActionLabel.test.d.ts +1 -0
  90. package/dist/types/src/ActivityIndicator/ActivityIndicator.test.d.ts +1 -0
  91. package/dist/types/src/AtlantisContext/AtlantisContext.test.d.ts +1 -0
  92. package/dist/types/src/AtlantisThemeContext/AtlantisThemeContext.test.d.ts +1 -0
  93. package/dist/types/src/AtlantisThemeContext/buildThemedStyles.test.d.ts +1 -0
  94. package/dist/types/src/AutoLink/AutoLink.test.d.ts +1 -0
  95. package/dist/types/src/AutoLink/components/Link/Link.test.d.ts +1 -0
  96. package/dist/types/src/Banner/Banner.test.d.ts +1 -0
  97. package/dist/types/src/BottomSheet/BottomSheet.test.d.ts +1 -0
  98. package/dist/types/src/BottomSheet/components/BottomSheetOption/BottomSheetOption.test.d.ts +1 -0
  99. package/dist/types/src/BottomSheet/hooks/useBottomSheetBackHandler.test.d.ts +1 -0
  100. package/dist/types/src/Button/Button.test.d.ts +1 -0
  101. package/dist/types/src/Button/components/InternalButtonLoading/InternalButtonLoading.test.d.ts +1 -0
  102. package/dist/types/src/ButtonGroup/ButtonGroup.test.d.ts +1 -0
  103. package/dist/types/src/Card/Card.test.d.ts +1 -0
  104. package/dist/types/src/Card/components/InternalCardHeader.test.d.ts +1 -0
  105. package/dist/types/src/Checkbox/Checkbox.test.d.ts +1 -0
  106. package/dist/types/src/Checkbox/CheckboxGroup.test.d.ts +1 -0
  107. package/dist/types/src/Checkbox/CheckboxGroupReducer.test.d.ts +1 -0
  108. package/dist/types/src/Chip/Chip.test.d.ts +1 -0
  109. package/dist/types/src/Content/Content.test.d.ts +1 -0
  110. package/dist/types/src/ContentOverlay/BottomSheetKeyboardAwareScrollView.d.ts +2 -1
  111. package/dist/types/src/ContentOverlay/ContentOverlay.test.d.ts +1 -0
  112. package/dist/types/src/ContentOverlay/computeContentOverlayBehavior.test.d.ts +1 -0
  113. package/dist/types/src/ContentOverlay/hooks/useBottomSheetModalBackHandler.test.d.ts +1 -0
  114. package/dist/types/src/ContentOverlay/hooks/useKeyboardVisibility.test.d.ts +1 -0
  115. package/dist/types/src/ContentOverlay/hooks/useViewLayoutHeight.test.d.ts +1 -0
  116. package/dist/types/src/Disclosure/Disclosure.test.d.ts +1 -0
  117. package/dist/types/src/Divider/Divider.test.d.ts +1 -0
  118. package/dist/types/src/EmptyState/EmptyState.test.d.ts +1 -0
  119. package/dist/types/src/ErrorMessageWrapper/ErrorMessageWrapper.test.d.ts +1 -0
  120. package/dist/types/src/Flex/Flex.test.d.ts +1 -0
  121. package/dist/types/src/Form/Form.test.d.ts +1 -0
  122. package/dist/types/src/Form/components/FormErrorBanner/FormErrorBanner.test.d.ts +1 -0
  123. package/dist/types/src/Form/components/FormMessage/FormMessage.test.d.ts +1 -0
  124. package/dist/types/src/Form/components/FormMessageBanner/FormMessageBanner.test.d.ts +1 -0
  125. package/dist/types/src/Form/components/FormSaveButton/FormSaveButton.test.d.ts +1 -0
  126. package/dist/types/src/Form/context/AtlantisFormContext.test.d.ts +1 -0
  127. package/dist/types/src/Form/hooks/useScrollToError/useScrollToError.test.d.ts +1 -0
  128. package/dist/types/src/FormField/FormField.test.d.ts +1 -0
  129. package/dist/types/src/FormatFile/FormatFile.test.d.ts +1 -0
  130. package/dist/types/src/FormatFile/FormatFileThumbnail.test.d.ts +1 -0
  131. package/dist/types/src/FormatFile/components/FormatFileBottomSheet/FormatFileBottomSheet.test.d.ts +1 -0
  132. package/dist/types/src/FormatFile/components/MediaView/MediaView.test.d.ts +1 -0
  133. package/dist/types/src/FormatFile/utils/parseFile.test.d.ts +1 -0
  134. package/dist/types/src/Glimmer/Glimmer.test.d.ts +1 -0
  135. package/dist/types/src/Heading/Heading.test.d.ts +1 -0
  136. package/dist/types/src/Icon/Icon.test.d.ts +1 -0
  137. package/dist/types/src/IconButton/IconButton.test.d.ts +1 -0
  138. package/dist/types/src/InputCurrency/InputCurrency.test.d.ts +1 -0
  139. package/dist/types/src/InputDate/InputDate.test.d.ts +1 -0
  140. package/dist/types/src/InputEmail/InputEmail.test.d.ts +1 -0
  141. package/dist/types/src/InputFieldWrapper/InputFieldWrapper.test.d.ts +1 -0
  142. package/dist/types/src/InputFieldWrapper/components/ClearAction/ClearAction.test.d.ts +1 -0
  143. package/dist/types/src/InputFieldWrapper/components/Prefix/Prefix.test.d.ts +1 -0
  144. package/dist/types/src/InputFieldWrapper/components/Suffix/Suffix.test.d.ts +1 -0
  145. package/dist/types/src/InputNumber/InputNumber.test.d.ts +1 -0
  146. package/dist/types/src/InputPassword/InputPassword.test.d.ts +1 -0
  147. package/dist/types/src/InputPressable/InputPressable.test.d.ts +1 -0
  148. package/dist/types/src/InputSearch/InputSearch.test.d.ts +1 -0
  149. package/dist/types/src/InputText/InputText.test.d.ts +1 -0
  150. package/dist/types/src/InputText/context/InputAccessoriesProvider.test.d.ts +1 -0
  151. package/dist/types/src/InputTime/InputTime.test.d.ts +1 -0
  152. package/dist/types/src/InputTime/utils/utils.test.d.ts +1 -0
  153. package/dist/types/src/ProgressBar/ProgressBar.test.d.ts +1 -0
  154. package/dist/types/src/Select/Select.test.d.ts +1 -0
  155. package/dist/types/src/Select/components/SelectDefaultPicker/SelectDefaultPicker.test.d.ts +1 -0
  156. package/dist/types/src/Select/components/SelectInternalPicker/SelectInternalPicker.test.d.ts +1 -0
  157. package/dist/types/src/StatusLabel/StatusLabel.test.d.ts +1 -0
  158. package/dist/types/src/Switch/Switch.test.d.ts +1 -0
  159. package/dist/types/src/Switch/components/BaseSwitch/BaseSwitch.test.d.ts +1 -0
  160. package/dist/types/src/Text/Text.test.d.ts +1 -0
  161. package/dist/types/src/TextList/TextList.test.d.ts +1 -0
  162. package/dist/types/src/ThumbnailList/ThumbnailList.test.d.ts +1 -0
  163. package/dist/types/src/Toast/Toast.test.d.ts +1 -0
  164. package/dist/types/src/Typography/Typography.test.d.ts +1 -0
  165. package/dist/types/src/hooks/useAtlantisI18n/useAtlantisI18n.test.d.ts +1 -0
  166. package/dist/types/src/utils/meta/meta.test.d.ts +1 -0
  167. package/package.json +19 -11
  168. package/src/Button/Button.test.tsx +6 -2
  169. package/src/ContentOverlay/hooks/useViewLayoutHeight.test.ts +3 -3
  170. package/src/Divider/Divider.stories.tsx +1 -1
  171. package/src/Flex/Flex.test.tsx +1 -1
  172. package/src/Form/Form.test.tsx +3 -1
  173. package/src/FormField/FormField.test.tsx +5 -1
  174. package/src/Heading/__snapshots__/Heading.test.tsx.snap +1 -1
  175. package/src/InputDate/InputDate.test.tsx +7 -1
  176. package/src/InputText/InputText.test.tsx +2 -1
  177. package/src/InputTime/InputTime.test.tsx +7 -1
  178. package/src/Select/Select.test.tsx +1 -1
  179. package/src/StatusLabel/__snapshots__/StatusLabel.test.tsx.snap +8 -8
  180. package/src/Text/__snapshots__/Text.test.tsx.snap +2 -2
  181. package/src/ThumbnailList/__snapshots__/ThumbnailList.test.tsx.snap +1 -1
  182. package/src/Typography/__snapshots__/Typography.test.tsx.snap +4 -4
@@ -0,0 +1,104 @@
1
+ import React from "react";
2
+ import { render } from "@testing-library/react-native";
3
+ import { View } from "react-native";
4
+ import { tokens } from "@jobber/design";
5
+ import { Flex } from "./Flex";
6
+ import { columnStyles } from "./Flex.styles";
7
+ import { Text } from "../Text";
8
+ import { Icon } from "../Icon";
9
+ function getContentComponent(parentView) {
10
+ var _a;
11
+ return (_a = parentView === null || parentView === void 0 ? void 0 : parentView.children[0]) === null || _a === void 0 ? void 0 : _a.children[0];
12
+ }
13
+ function getFlexCol(flexRow) {
14
+ return flexRow.children;
15
+ }
16
+ function setUp(props) {
17
+ const container = render(React.createElement(View, { accessibilityLabel: "contentView" },
18
+ React.createElement(Flex, { align: props === null || props === void 0 ? void 0 : props.align, template: props === null || props === void 0 ? void 0 : props.template, gap: props === null || props === void 0 ? void 0 : props.gap },
19
+ React.createElement(Icon, { name: "email" }),
20
+ React.createElement(Text, null, "Hi onLookers!"),
21
+ React.createElement(Text, null, "You look Great Today!"),
22
+ React.createElement(Text, null, "Thanks for coming to my Ted Talk :D"))));
23
+ const contentView = getContentComponent(container.getByLabelText("contentView"));
24
+ const flexRow = container.getAllByTestId("ATL-Flex-Row");
25
+ const flexCol = getFlexCol(flexRow[0]);
26
+ return Object.assign(Object.assign({}, container), { contentView, flexRow, flexCol });
27
+ }
28
+ describe("Gap", () => {
29
+ const gapTestCases = [
30
+ ["none", 0],
31
+ ["smallest", tokens["space-smallest"]],
32
+ ["smaller", tokens["space-smaller"]],
33
+ ["small", tokens["space-small"]],
34
+ ["base", tokens["space-base"]],
35
+ ["large", tokens["space-large"]],
36
+ ];
37
+ it.each(gapTestCases)("Should have a gap of %s around the children components", (a, expected) => {
38
+ const { contentView, flexCol } = setUp({
39
+ template: ["grow", "grow", "shrink"],
40
+ gap: a,
41
+ });
42
+ expect(flexCol[1].props.style).toContainEqual({
43
+ paddingLeft: expected,
44
+ });
45
+ expect(contentView.props.childSpacing).toEqual(a);
46
+ });
47
+ });
48
+ describe("Vertical alignment", () => {
49
+ it("should align children to center by default if align is not specified", () => {
50
+ const { flexRow } = setUp({
51
+ template: ["grow", "grow", "shrink"],
52
+ gap: "large",
53
+ });
54
+ expect(flexRow[0].props.style).toContainEqual({ alignItems: "center" });
55
+ });
56
+ const alignTestCases = [
57
+ ["flex-start"],
58
+ ["flex-end"],
59
+ ["center"],
60
+ ["baseline"],
61
+ ["stretch"],
62
+ ];
63
+ it.each(alignTestCases)("should align children to %s", a => {
64
+ const { flexRow } = setUp({
65
+ template: ["grow", "grow", "shrink"],
66
+ align: a,
67
+ });
68
+ expect(flexRow[0].props.style).toContainEqual({
69
+ alignItems: a,
70
+ });
71
+ });
72
+ });
73
+ describe("Layout", () => {
74
+ it("should by default display a 1 row flex grid with equal spacing between each children", () => {
75
+ const { flexCol, flexRow } = setUp({});
76
+ expect(flexCol[0].props.style).toContainEqual(columnStyles.grow);
77
+ expect(flexCol[1].props.style).toContainEqual(columnStyles.grow);
78
+ expect(flexCol[2].props.style).toContainEqual(columnStyles.grow);
79
+ expect(flexCol[3].props.style).toContainEqual(columnStyles.grow);
80
+ expect(flexRow.length).toEqual(1);
81
+ });
82
+ it("should follow the template to decide whether to grow or shrink", () => {
83
+ const { flexCol } = setUp({
84
+ template: ["grow", "grow", "shrink"],
85
+ });
86
+ expect(flexCol[0].props.style).toContainEqual(columnStyles.grow);
87
+ expect(flexCol[1].props.style).toContainEqual(columnStyles.grow);
88
+ expect(flexCol[2].props.style).toContainEqual(columnStyles.shrink);
89
+ });
90
+ it("should create a flex grid with 2 rows", () => {
91
+ const { flexRow } = setUp({
92
+ template: ["grow", "grow", "shrink"],
93
+ });
94
+ expect(flexRow.length).toEqual(2);
95
+ });
96
+ it("should inject extra children on the last row of a multiRow flex grid if needed", () => {
97
+ const { flexRow } = setUp({
98
+ template: ["grow", "grow", "shrink"],
99
+ });
100
+ const flexCol2 = getFlexCol(flexRow[1]);
101
+ expect(flexRow.length > 1).toBeTruthy();
102
+ expect(flexCol2.length).toEqual(3);
103
+ });
104
+ });
@@ -0,0 +1,393 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import React from "react";
11
+ import { act, fireEvent, render, waitFor } from "@testing-library/react-native";
12
+ import { Alert, Keyboard } from "react-native";
13
+ import { Form, FormBannerMessageType } from ".";
14
+ import { FormSubmitErrorType } from "./types";
15
+ import { atlantisContextDefaultValues } from "../AtlantisContext";
16
+ import * as atlantisContext from "../AtlantisContext/AtlantisContext";
17
+ import { Text } from "../Text";
18
+ import { Checkbox } from "../Checkbox";
19
+ import { InputNumber } from "../InputNumber";
20
+ import { Switch } from "../Switch";
21
+ import { Option, Select } from "../Select";
22
+ import { InputText } from "../InputText";
23
+ jest.mock("lodash/debounce", () => {
24
+ return jest.fn(fn => {
25
+ fn.cancel = jest.fn();
26
+ return fn;
27
+ });
28
+ });
29
+ const onSubmitMock = jest.fn().mockImplementation(() => {
30
+ return Promise.resolve(() => Promise.resolve());
31
+ });
32
+ const onSuccessMock = jest.fn();
33
+ const onErrorMock = jest.fn();
34
+ const onChangeMock = jest.fn();
35
+ const onChangeSelectMock = jest.fn();
36
+ const onChangeSwitchMock = jest.fn();
37
+ const mockScrollTo = jest.fn();
38
+ const mockScrollToTop = jest.fn();
39
+ jest.mock("./hooks/useFormViewRefs", () => ({
40
+ useFormViewRefs: () => {
41
+ return {
42
+ scrollViewRef: {
43
+ current: { scrollTo: mockScrollTo },
44
+ },
45
+ bottomViewRef: { current: {} },
46
+ scrollToTop: mockScrollToTop,
47
+ };
48
+ },
49
+ }));
50
+ const bannerError = {
51
+ title: "My error",
52
+ messages: ["userError1", "userError2"],
53
+ };
54
+ const noticeMessage = {
55
+ messageType: FormBannerMessageType.NoticeMessage,
56
+ message: "Take note of this information.",
57
+ };
58
+ const warningMessage = {
59
+ messageType: FormBannerMessageType.WarningMessage,
60
+ message: "Caution is warranted in this case.",
61
+ };
62
+ const testInputTextName = "test";
63
+ const testInputTextNameExclude = "exclude";
64
+ const testInputTextPlaceholderExclude = "Test Exclude";
65
+ const testInputTextPlaceholder = "Test Input";
66
+ const testSelectName = "testSelect";
67
+ const testSwitchName = "testSwitch";
68
+ const testInputNumberName = "testNumber";
69
+ const testCheckboxName = "testCheckbox";
70
+ const switchLabel = "switchLabel";
71
+ const checkboxLabel = "checkboxLabel";
72
+ const selectLabel = "selectLabel";
73
+ const saveButtonText = "Save";
74
+ const requiredInputText = "This field is required";
75
+ const minLengthText = "Test is too short";
76
+ function FormTest(props) {
77
+ return React.createElement(MockForm, Object.assign({}, props));
78
+ }
79
+ function MockForm({ onSubmit, sendBannerErrors = false, sendNetworkErrors = false, saveLabel, renderStickySection, initialLoading = false, initialValues = undefined, bannerMessages, localCacheKey, localCacheExclude, onBeforeSubmit, localCacheId, renderFooter, saveButtonOffset, UNSAFE_allowDiscardLocalCacheWhenOffline = false, }) {
80
+ const formErrors = {};
81
+ if (sendBannerErrors) {
82
+ formErrors.bannerError = bannerError;
83
+ }
84
+ if (sendNetworkErrors) {
85
+ formErrors.networkError = "Ouch";
86
+ }
87
+ return (React.createElement(Form, { onSubmit: onSubmit, onSubmitError: onErrorMock, onSubmitSuccess: onSuccessMock, bannerErrors: formErrors, bannerMessages: bannerMessages, saveButtonLabel: saveLabel, renderStickySection: renderStickySection, initialLoading: initialLoading, initialValues: initialValues, localCacheKey: localCacheKey, localCacheExclude: localCacheExclude, localCacheId: localCacheId, onBeforeSubmit: onBeforeSubmit, renderFooter: renderFooter, saveButtonOffset: saveButtonOffset, UNSAFE_allowDiscardLocalCacheWhenOffline: UNSAFE_allowDiscardLocalCacheWhenOffline },
88
+ React.createElement(InputText, { name: testInputTextName, placeholder: testInputTextPlaceholder, onChangeText: onChangeMock, accessibilityLabel: testInputTextPlaceholder, validations: {
89
+ required: requiredInputText,
90
+ minLength: { value: 3, message: minLengthText },
91
+ } }),
92
+ Array.isArray(localCacheExclude) && localCacheExclude.length > 0 && (React.createElement(InputText, { name: testInputTextNameExclude, placeholder: testInputTextPlaceholderExclude })),
93
+ React.createElement(Select, { onChange: onChangeSelectMock, label: selectLabel, name: testSelectName },
94
+ React.createElement(Option, { value: "1" }, "1"),
95
+ React.createElement(Option, { value: "2" }, "2")),
96
+ React.createElement(Switch, { name: testSwitchName, label: "Test Switch", accessibilityLabel: switchLabel, onValueChange: onChangeSwitchMock }),
97
+ React.createElement(InputNumber, { name: testInputNumberName, placeholder: "Test Num" }),
98
+ React.createElement(Checkbox, { name: testCheckboxName, accessibilityLabel: checkboxLabel })));
99
+ }
100
+ const testPresetValues = {
101
+ [testInputTextName]: "PresetValueTestText",
102
+ [testSelectName]: "2",
103
+ [testSwitchName]: true,
104
+ [testInputNumberName]: 123454321,
105
+ [testCheckboxName]: true,
106
+ };
107
+ function wait() {
108
+ return __awaiter(this, arguments, void 0, function* (milliseconds = 0) {
109
+ yield new Promise(resolve => setTimeout(resolve, milliseconds));
110
+ });
111
+ }
112
+ afterEach(() => {
113
+ jest.clearAllMocks();
114
+ });
115
+ const loadingLabel = "Loading";
116
+ const tryAgainLabel = "Try again";
117
+ describe("Form", () => {
118
+ describe("Initial Load", () => {
119
+ it("should show activity indicator", () => {
120
+ const { getByLabelText } = render(React.createElement(FormTest, { initialLoading: true, onSubmit: onSubmitMock }));
121
+ expect(getByLabelText(loadingLabel)).toBeTruthy();
122
+ });
123
+ it("should be populated with provided initialValues", () => {
124
+ const { getByDisplayValue, getByLabelText } = render(React.createElement(FormTest, { initialValues: testPresetValues, onSubmit: onSubmitMock }));
125
+ expect(getByDisplayValue(testPresetValues[testInputTextName])).toBeDefined();
126
+ expect(getByDisplayValue(testPresetValues[testInputNumberName].toString())).toBeDefined();
127
+ expect(getByLabelText(switchLabel).props.value).toEqual(true);
128
+ expect(getByLabelText(checkboxLabel).props.accessibilityState.checked).toEqual(true);
129
+ });
130
+ });
131
+ describe("Save", () => {
132
+ it("renders the save button of the form", () => {
133
+ const { getByLabelText } = render(React.createElement(FormTest, { onSubmit: onSubmitMock }));
134
+ const saveButton = getByLabelText(saveButtonText);
135
+ expect(saveButton).toBeTruthy();
136
+ });
137
+ it("displays relevant validation errors when trying to save the form", () => __awaiter(void 0, void 0, void 0, function* () {
138
+ const { getByLabelText, getAllByText } = render(React.createElement(FormTest, { onSubmit: onSubmitMock }));
139
+ const saveButton = getByLabelText(saveButtonText);
140
+ yield waitFor(() => {
141
+ fireEvent.press(saveButton);
142
+ });
143
+ expect(getAllByText(requiredInputText, { includeHiddenElements: true })).toBeDefined();
144
+ const newValue = "A";
145
+ yield waitFor(() => {
146
+ fireEvent.changeText(getByLabelText(testInputTextPlaceholder), newValue);
147
+ });
148
+ expect(getAllByText(minLengthText, { includeHiddenElements: true })).toBeDefined();
149
+ }));
150
+ it("should submit correct create form data", () => __awaiter(void 0, void 0, void 0, function* () {
151
+ const { getByLabelText, getByText } = render(React.createElement(FormTest, { onSubmit: onSubmitMock }));
152
+ const saveButton = getByLabelText(saveButtonText);
153
+ const newValue = "New Value";
154
+ fireEvent.changeText(getByLabelText(testInputTextPlaceholder), newValue);
155
+ expect(onChangeMock).toHaveBeenCalled();
156
+ fireEvent(getByLabelText(switchLabel), "onValueChange", true);
157
+ expect(onChangeSwitchMock).toHaveBeenCalled();
158
+ fireEvent(getByText(selectLabel, { includeHiddenElements: true }), "onChange", "2");
159
+ expect(onChangeSelectMock).toHaveBeenCalled();
160
+ fireEvent.press(saveButton);
161
+ yield waitFor(() => {
162
+ expect(onSubmitMock).toHaveBeenCalledWith({
163
+ [testInputTextName]: newValue,
164
+ [testSelectName]: "2",
165
+ [testSwitchName]: true,
166
+ });
167
+ });
168
+ }));
169
+ it("should dismiss keyboard when form is saved", () => __awaiter(void 0, void 0, void 0, function* () {
170
+ const keyboardDismissSpy = jest.spyOn(Keyboard, "dismiss");
171
+ const { getByLabelText } = render(React.createElement(FormTest, { onSubmit: onSubmitMock }));
172
+ const newValue = "New Value";
173
+ fireEvent.changeText(getByLabelText(testInputTextPlaceholder), newValue);
174
+ const saveButton = getByLabelText(saveButtonText);
175
+ fireEvent.press(saveButton);
176
+ yield waitFor(() => {
177
+ expect(onSubmitMock).toHaveBeenCalled();
178
+ });
179
+ expect(keyboardDismissSpy).toHaveBeenCalled();
180
+ }));
181
+ it("renders a save button with a custom label if provided", () => {
182
+ const customSaveButtonText = "MySave";
183
+ const { getByLabelText } = render(React.createElement(FormTest, { onSubmit: onSubmitMock, saveLabel: customSaveButtonText }));
184
+ const saveButton = getByLabelText(customSaveButtonText);
185
+ expect(saveButton).toBeTruthy();
186
+ });
187
+ it("renders a custom sticky component if provided", () => {
188
+ const customSaveButtonText = "CheckboxOverload";
189
+ const { getByLabelText } = render(React.createElement(FormTest, { onSubmit: onSubmitMock, saveLabel: customSaveButtonText, renderStickySection: (onSubmit, label) => (React.createElement(Checkbox, { checked: false, name: label, accessibilityLabel: label, onChange: onSubmit })) }));
190
+ const overrideCheckbox = getByLabelText(customSaveButtonText);
191
+ expect(overrideCheckbox).toBeTruthy();
192
+ });
193
+ });
194
+ describe("Submitting", () => {
195
+ it("should show submission spinner when submitting form data", () => __awaiter(void 0, void 0, void 0, function* () {
196
+ const timeoutSubmit = jest.fn().mockImplementation(() => {
197
+ return new Promise(res => setTimeout(() => res(() => Promise.resolve()), 1000));
198
+ });
199
+ const { getByLabelText } = yield waitFor(() => render(React.createElement(FormTest, { onSubmit: timeoutSubmit })));
200
+ const saveButton = getByLabelText(saveButtonText);
201
+ fireEvent.press(saveButton);
202
+ expect(getByLabelText(loadingLabel)).toBeTruthy();
203
+ }));
204
+ it("should call beforeSubmit if one is provided", () => __awaiter(void 0, void 0, void 0, function* () {
205
+ const beforeSubmitMock = jest.fn().mockImplementation(() => {
206
+ return Promise.resolve(true);
207
+ });
208
+ const { getByLabelText } = render(React.createElement(FormTest, { onSubmit: onSubmitMock, onBeforeSubmit: beforeSubmitMock }));
209
+ const newValue = "New Value";
210
+ fireEvent.changeText(getByLabelText(testInputTextPlaceholder), newValue);
211
+ const saveButton = getByLabelText(saveButtonText);
212
+ fireEvent.press(saveButton);
213
+ yield waitFor(() => {
214
+ expect(beforeSubmitMock).toHaveBeenCalled();
215
+ expect(onSubmitMock).toHaveBeenCalled();
216
+ });
217
+ }));
218
+ it("does not submit if beforeSubmit returns false", () => __awaiter(void 0, void 0, void 0, function* () {
219
+ const beforeSubmitMock = jest.fn().mockImplementation(() => {
220
+ return Promise.resolve(false);
221
+ });
222
+ const { getByLabelText } = render(React.createElement(FormTest, { onSubmit: onSubmitMock, onBeforeSubmit: beforeSubmitMock }));
223
+ const newValue = "New Value";
224
+ fireEvent.changeText(getByLabelText(testInputTextPlaceholder), newValue);
225
+ const saveButton = getByLabelText(saveButtonText);
226
+ fireEvent.press(saveButton);
227
+ yield waitFor(() => {
228
+ expect(beforeSubmitMock).toHaveBeenCalled();
229
+ expect(onSubmitMock).not.toHaveBeenCalled();
230
+ });
231
+ }));
232
+ describe("While offline", () => {
233
+ const mockSubmit = jest.fn().mockImplementation(() => Promise.reject({
234
+ errorType: FormSubmitErrorType.NetworkError,
235
+ }));
236
+ const setup = () => {
237
+ const view = render(React.createElement(FormTest, { sendNetworkErrors: true, onSubmit: mockSubmit }));
238
+ const { getByLabelText } = view;
239
+ const newValue = "New Value";
240
+ fireEvent.changeText(getByLabelText(testInputTextPlaceholder), newValue);
241
+ fireEvent.press(getByLabelText(saveButtonText));
242
+ return view;
243
+ };
244
+ it("should show offline alert when attempting to save while offline", () => __awaiter(void 0, void 0, void 0, function* () {
245
+ const alertSpy = jest.spyOn(Alert, "alert");
246
+ setup();
247
+ yield act(wait);
248
+ expect(alertSpy).toHaveBeenCalledTimes(1);
249
+ expect(alertSpy).toHaveBeenCalledWith("Network Unavailable", "Check your internet connection and try again later.", expect.anything());
250
+ }));
251
+ it("Submits Form on successful retry", () => __awaiter(void 0, void 0, void 0, function* () {
252
+ var _a;
253
+ const alertSpy = jest.spyOn(Alert, "alert");
254
+ setup();
255
+ yield act(wait);
256
+ const alertActions = alertSpy.mock.calls[0][2];
257
+ const retryAction = alertActions === null || alertActions === void 0 ? void 0 : alertActions.find(action => action.text === tryAgainLabel);
258
+ mockSubmit.mockImplementationOnce(() => Promise.resolve());
259
+ (_a = retryAction === null || retryAction === void 0 ? void 0 : retryAction.onPress) === null || _a === void 0 ? void 0 : _a.call(retryAction);
260
+ yield act(wait);
261
+ expect(alertSpy).toHaveBeenCalledTimes(1);
262
+ expect(onSuccessMock).toHaveBeenCalled();
263
+ }));
264
+ it("reshows an Alert on unsuccessful retry", () => __awaiter(void 0, void 0, void 0, function* () {
265
+ var _a;
266
+ const alertSpy = jest.spyOn(Alert, "alert");
267
+ setup();
268
+ yield act(wait);
269
+ const alertActions = alertSpy.mock.calls[0][2];
270
+ const retryAction = alertActions === null || alertActions === void 0 ? void 0 : alertActions.find(action => action.text === tryAgainLabel);
271
+ (_a = retryAction === null || retryAction === void 0 ? void 0 : retryAction.onPress) === null || _a === void 0 ? void 0 : _a.call(retryAction);
272
+ yield act(wait);
273
+ expect(alertSpy).toHaveBeenCalledTimes(2);
274
+ }));
275
+ });
276
+ });
277
+ describe("Error Banner", () => {
278
+ const atlantisContextSpy = jest.spyOn(atlantisContext, "useAtlantisContext");
279
+ atlantisContextSpy.mockReturnValue(Object.assign(Object.assign({}, atlantisContextDefaultValues), { isOnline: false }));
280
+ it("renders user errors when provided", () => __awaiter(void 0, void 0, void 0, function* () {
281
+ const { getByText } = render(React.createElement(FormTest, { onSubmit: onSubmitMock, sendBannerErrors: true }));
282
+ const expectedErrors = bannerError.messages;
283
+ expect(getByText(new RegExp(expectedErrors[0]))).toBeTruthy();
284
+ expect(getByText(new RegExp(expectedErrors[1]))).toBeTruthy();
285
+ }));
286
+ it("does not render user errors when not provided", () => __awaiter(void 0, void 0, void 0, function* () {
287
+ const { queryByText } = render(React.createElement(FormTest, { onSubmit: onSubmitMock }));
288
+ const expectedErrors = bannerError.messages;
289
+ expect(queryByText(expectedErrors[0])).toBeNull();
290
+ expect(queryByText(expectedErrors[1])).toBeNull();
291
+ }));
292
+ });
293
+ describe("Message Banner", () => {
294
+ it.each([
295
+ [FormBannerMessageType.NoticeMessage, noticeMessage],
296
+ [FormBannerMessageType.WarningMessage, warningMessage],
297
+ ])("renders a %s when provided", (_messageType, message) => __awaiter(void 0, void 0, void 0, function* () {
298
+ const { getByText } = render(React.createElement(FormTest, { onSubmit: onSubmitMock, bannerMessages: [message] }));
299
+ expect(getByText(message.message)).toBeDefined();
300
+ }));
301
+ it("renders multiple messages when provided", () => __awaiter(void 0, void 0, void 0, function* () {
302
+ const { getByText } = render(React.createElement(FormTest, { onSubmit: onSubmitMock, bannerMessages: [noticeMessage, warningMessage] }));
303
+ expect(getByText(noticeMessage.message)).toBeDefined();
304
+ expect(getByText(warningMessage.message)).toBeDefined();
305
+ }));
306
+ });
307
+ describe("Render footer", () => {
308
+ it("render a footer when provided", () => {
309
+ const footerMessage = "Hello, I'm a footer!";
310
+ const { getByText } = render(React.createElement(FormTest, { onSubmit: onSubmitMock, renderFooter: React.createElement(Text, null, footerMessage) }));
311
+ expect(getByText(footerMessage)).toBeDefined();
312
+ });
313
+ });
314
+ describe("Safe Area", () => {
315
+ it("does render a safe area when there's NO saveButtonOffset provided", () => {
316
+ const { getByTestId } = render(React.createElement(FormTest, { onSubmit: onSubmitMock }));
317
+ expect(getByTestId("ATL-FormSafeArea")).toBeDefined();
318
+ });
319
+ it("does NOT render a safe area when there's a saveButtonOffset is provided", () => {
320
+ const { queryByTestId } = render(React.createElement(FormTest, { onSubmit: onSubmitMock, saveButtonOffset: 30 }));
321
+ expect(queryByTestId("ATL-FormSafeArea")).toBeNull();
322
+ });
323
+ });
324
+ describe("Leaving the form", () => {
325
+ let mockUseConfirmBeforeBack;
326
+ let mockRemoveLocalCache;
327
+ const atlantisContextSpy = jest.spyOn(atlantisContext, "useAtlantisContext");
328
+ beforeEach(() => {
329
+ mockUseConfirmBeforeBack = jest
330
+ .fn()
331
+ .mockReturnValue({ current: jest.fn() });
332
+ mockRemoveLocalCache = jest.fn();
333
+ jest
334
+ .spyOn(require("../Form/context/AtlantisFormContext"), "useAtlantisFormContext")
335
+ .mockReturnValue({
336
+ useConfirmBeforeBack: mockUseConfirmBeforeBack,
337
+ useInternalFormLocalCache: () => ({
338
+ setLocalCache: jest.fn(),
339
+ removeLocalCache: mockRemoveLocalCache,
340
+ }),
341
+ edgeToEdgeEnabled: false,
342
+ });
343
+ });
344
+ afterEach(() => {
345
+ jest.restoreAllMocks();
346
+ });
347
+ describe("when UNSAFE_allowDiscardLocalCacheWhenOffline is false", () => {
348
+ it("should NOT pass onAcceptEvent when offline", () => {
349
+ atlantisContextSpy.mockReturnValue(Object.assign(Object.assign({}, atlantisContextDefaultValues), { isOnline: false }));
350
+ render(React.createElement(FormTest, { onSubmit: onSubmitMock, UNSAFE_allowDiscardLocalCacheWhenOffline: false, localCacheKey: "testCacheKey" }));
351
+ expect(mockUseConfirmBeforeBack).toHaveBeenCalled();
352
+ const callArgs = mockUseConfirmBeforeBack.mock.calls[0][0];
353
+ expect(callArgs.onAcceptEvent).toBeUndefined();
354
+ expect(callArgs.showLostProgressMessage).toBe(false);
355
+ });
356
+ it("should pass onAcceptEvent when online", () => {
357
+ atlantisContextSpy.mockReturnValue(Object.assign(Object.assign({}, atlantisContextDefaultValues), { isOnline: true }));
358
+ render(React.createElement(FormTest, { onSubmit: onSubmitMock, UNSAFE_allowDiscardLocalCacheWhenOffline: false, localCacheKey: "testCacheKey" }));
359
+ expect(mockUseConfirmBeforeBack).toHaveBeenCalled();
360
+ const callArgs = mockUseConfirmBeforeBack.mock.calls[0][0];
361
+ expect(callArgs.onAcceptEvent).toBe(mockRemoveLocalCache);
362
+ expect(callArgs.showLostProgressMessage).toBe(true);
363
+ });
364
+ });
365
+ describe("when UNSAFE_allowDiscardLocalCacheWhenOffline is true", () => {
366
+ it("should pass onAcceptEvent when offline", () => {
367
+ atlantisContextSpy.mockReturnValue(Object.assign(Object.assign({}, atlantisContextDefaultValues), { isOnline: false }));
368
+ render(React.createElement(FormTest, { onSubmit: onSubmitMock, UNSAFE_allowDiscardLocalCacheWhenOffline: true, localCacheKey: "testCacheKey" }));
369
+ expect(mockUseConfirmBeforeBack).toHaveBeenCalled();
370
+ const callArgs = mockUseConfirmBeforeBack.mock.calls[0][0];
371
+ expect(callArgs.onAcceptEvent).toBe(mockRemoveLocalCache);
372
+ expect(callArgs.showLostProgressMessage).toBe(true);
373
+ });
374
+ it("should pass onAcceptEvent when online", () => {
375
+ atlantisContextSpy.mockReturnValue(Object.assign(Object.assign({}, atlantisContextDefaultValues), { isOnline: true }));
376
+ render(React.createElement(FormTest, { onSubmit: onSubmitMock, UNSAFE_allowDiscardLocalCacheWhenOffline: true, localCacheKey: "testCacheKey" }));
377
+ expect(mockUseConfirmBeforeBack).toHaveBeenCalled();
378
+ const callArgs = mockUseConfirmBeforeBack.mock.calls[0][0];
379
+ expect(callArgs.onAcceptEvent).toBe(mockRemoveLocalCache);
380
+ expect(callArgs.showLostProgressMessage).toBe(true);
381
+ });
382
+ });
383
+ describe("without localCacheKey", () => {
384
+ it("should always show lost progress message when no cache key is provided", () => {
385
+ atlantisContextSpy.mockReturnValue(Object.assign(Object.assign({}, atlantisContextDefaultValues), { isOnline: false }));
386
+ render(React.createElement(FormTest, { onSubmit: onSubmitMock, UNSAFE_allowDiscardLocalCacheWhenOffline: false }));
387
+ expect(mockUseConfirmBeforeBack).toHaveBeenCalled();
388
+ const callArgs = mockUseConfirmBeforeBack.mock.calls[0][0];
389
+ expect(callArgs.showLostProgressMessage).toBe(true);
390
+ });
391
+ });
392
+ });
393
+ });
@@ -0,0 +1,41 @@
1
+ import React from "react";
2
+ import { render } from "@testing-library/react-native";
3
+ import { FormErrorBanner } from "./FormErrorBanner";
4
+ import { atlantisContextDefaultValues } from "../../../AtlantisContext";
5
+ import * as atlantisContext from "../../../AtlantisContext/AtlantisContext";
6
+ afterEach(jest.clearAllMocks);
7
+ describe("FormErrorBanner", () => {
8
+ const atlantisContextSpy = jest.spyOn(atlantisContext, "useAtlantisContext");
9
+ beforeEach(() => {
10
+ atlantisContextSpy.mockReturnValue(Object.assign(Object.assign({}, atlantisContextDefaultValues), { isOnline: true }));
11
+ });
12
+ const networkError = "An error occurred";
13
+ const userError = {
14
+ title: "My error",
15
+ messages: ["userError1", "userError2"],
16
+ };
17
+ const couldNotSavechanges = "Could not save changes";
18
+ it("should render network error banner when online and network errors exist", () => {
19
+ const { getByText, queryByText } = render(React.createElement(FormErrorBanner, { networkError: networkError, bannerError: userError }));
20
+ // Show: Network Error only
21
+ expect(getByText(couldNotSavechanges)).toBeDefined();
22
+ expect(queryByText(userError.title)).toBeNull();
23
+ });
24
+ it("should render user error banner when online and user errors exist", () => {
25
+ const { getByText, queryByText } = render(React.createElement(FormErrorBanner, { bannerError: userError }));
26
+ // Show: User Error only
27
+ expect(getByText(userError.title)).toBeDefined();
28
+ expect(getByText(userError.messages[0])).toBeDefined();
29
+ expect(getByText(userError.messages[1])).toBeDefined();
30
+ expect(queryByText(couldNotSavechanges)).toBeNull();
31
+ });
32
+ it("should render user error banner with just title when online", () => {
33
+ const userErrorJustTitle = {
34
+ title: "My error",
35
+ };
36
+ const { getByText, queryByText } = render(React.createElement(FormErrorBanner, { bannerError: userErrorJustTitle }));
37
+ // Show: User Error only
38
+ expect(getByText(userErrorJustTitle.title)).toBeDefined();
39
+ expect(queryByText(couldNotSavechanges)).toBeNull();
40
+ });
41
+ });
@@ -0,0 +1,73 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import React from "react";
11
+ import { fireEvent, render, screen, waitFor, } from "@testing-library/react-native";
12
+ import { FormMessage } from ".";
13
+ describe("FormMessage", () => {
14
+ it("should render null when there are no message to show", () => {
15
+ render(React.createElement(FormMessage, null));
16
+ expect(screen.toJSON()).toMatchInlineSnapshot(`null`);
17
+ });
18
+ it("should show the message", () => __awaiter(void 0, void 0, void 0, function* () {
19
+ render(React.createElement(FormMessage, null));
20
+ const description = "🔥";
21
+ FormMessage.show({ description });
22
+ yield waitFor(() => {
23
+ expect(screen.getByText(description)).toBeDefined();
24
+ });
25
+ }));
26
+ it("should close the message", () => __awaiter(void 0, void 0, void 0, function* () {
27
+ render(React.createElement(FormMessage, null));
28
+ const description = "🌚";
29
+ FormMessage.show({ description });
30
+ yield waitFor(() => {
31
+ expect(screen.getByText(description)).toBeDefined();
32
+ });
33
+ FormMessage.close();
34
+ yield waitFor(() => {
35
+ expect(screen.queryByText(description)).toBeNull();
36
+ });
37
+ }));
38
+ describe("Opening another message through a message", () => {
39
+ const firstMessage = "I am the first message";
40
+ const secondMessage = "Second message here";
41
+ const showMessage = () => FormMessage.show({
42
+ description: firstMessage,
43
+ primaryAction: {
44
+ label: "Click me",
45
+ onPress: () => FormMessage.show({ description: secondMessage }),
46
+ },
47
+ });
48
+ it("should show the most recent message", () => __awaiter(void 0, void 0, void 0, function* () {
49
+ render(React.createElement(FormMessage, null));
50
+ showMessage();
51
+ yield waitFor(() => {
52
+ expect(screen.getByText(firstMessage)).toBeDefined();
53
+ });
54
+ expect(screen.queryByText(secondMessage)).toBeNull();
55
+ fireEvent.press(screen.getByLabelText("Click me"));
56
+ expect(screen.getByText(secondMessage)).toBeDefined();
57
+ expect(screen.queryByText(firstMessage)).toBeNull();
58
+ }));
59
+ it("should close the most recent message", () => __awaiter(void 0, void 0, void 0, function* () {
60
+ render(React.createElement(FormMessage, null));
61
+ showMessage();
62
+ yield waitFor(() => {
63
+ expect(screen.getByText("Click me")).toBeDefined();
64
+ });
65
+ fireEvent.press(screen.getByLabelText("Click me"));
66
+ FormMessage.close();
67
+ yield waitFor(() => {
68
+ expect(screen.getByText(firstMessage)).toBeDefined();
69
+ });
70
+ expect(screen.queryByText(secondMessage)).toBeNull();
71
+ }));
72
+ });
73
+ });
@@ -0,0 +1,30 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import React from "react";
11
+ import { render } from "@testing-library/react-native";
12
+ import { FormMessageBanner } from "./FormMessageBanner";
13
+ import { FormBannerMessageType } from "../../types";
14
+ const noticeMessage = {
15
+ messageType: FormBannerMessageType.NoticeMessage,
16
+ message: "Take note of this information.",
17
+ };
18
+ const warningMessage = {
19
+ messageType: FormBannerMessageType.WarningMessage,
20
+ message: "Caution is warranted in this case.",
21
+ };
22
+ describe("FormMessageBanner", () => {
23
+ it.each([
24
+ [FormBannerMessageType.NoticeMessage, noticeMessage],
25
+ [FormBannerMessageType.WarningMessage, warningMessage],
26
+ ])("should render a %s", (_messageType, message) => __awaiter(void 0, void 0, void 0, function* () {
27
+ const { getByText } = render(React.createElement(FormMessageBanner, { bannerMessages: [message] }));
28
+ expect(getByText(message.message)).toBeDefined();
29
+ }));
30
+ });