@terreno/ui 0.0.1
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.
- package/LICENSE +203 -0
- package/README.md +160 -0
- package/dist/Accordion.d.ts +3 -0
- package/dist/Accordion.js +30 -0
- package/dist/Accordion.js.map +1 -0
- package/dist/ActionSheet.d.ts +169 -0
- package/dist/ActionSheet.js +637 -0
- package/dist/ActionSheet.js.map +1 -0
- package/dist/AddressField.d.ts +3 -0
- package/dist/AddressField.js +18 -0
- package/dist/AddressField.js.map +1 -0
- package/dist/Avatar.d.ts +3 -0
- package/dist/Avatar.js +189 -0
- package/dist/Avatar.js.map +1 -0
- package/dist/Badge.d.ts +3 -0
- package/dist/Badge.js +100 -0
- package/dist/Badge.js.map +1 -0
- package/dist/Banner.d.ts +4 -0
- package/dist/Banner.js +103 -0
- package/dist/Banner.js.map +1 -0
- package/dist/Body.d.ts +3 -0
- package/dist/Body.js +17 -0
- package/dist/Body.js.map +1 -0
- package/dist/BooleanField.d.ts +3 -0
- package/dist/BooleanField.js +89 -0
- package/dist/BooleanField.js.map +1 -0
- package/dist/Box.d.ts +3 -0
- package/dist/Box.js +289 -0
- package/dist/Box.js.map +1 -0
- package/dist/Button.d.ts +3 -0
- package/dist/Button.js +105 -0
- package/dist/Button.js.map +1 -0
- package/dist/Card.d.ts +2 -0
- package/dist/Card.js +18 -0
- package/dist/Card.js.map +1 -0
- package/dist/CheckBox.d.ts +3 -0
- package/dist/CheckBox.js +28 -0
- package/dist/CheckBox.js.map +1 -0
- package/dist/Common.d.ts +2325 -0
- package/dist/Common.js +47 -0
- package/dist/Common.js.map +1 -0
- package/dist/CommonIconTypes.d.ts +3 -0
- package/dist/CommonIconTypes.js +2 -0
- package/dist/CommonIconTypes.js.map +1 -0
- package/dist/Constants.d.ts +12685 -0
- package/dist/Constants.js +3310 -0
- package/dist/Constants.js.map +1 -0
- package/dist/CustomSelectField.d.ts +3 -0
- package/dist/CustomSelectField.js +59 -0
- package/dist/CustomSelectField.js.map +1 -0
- package/dist/DataTable.d.ts +3 -0
- package/dist/DataTable.js +190 -0
- package/dist/DataTable.js.map +1 -0
- package/dist/DateTimeActionSheet.d.ts +2 -0
- package/dist/DateTimeActionSheet.js +270 -0
- package/dist/DateTimeActionSheet.js.map +1 -0
- package/dist/DateTimeField.d.ts +3 -0
- package/dist/DateTimeField.js +514 -0
- package/dist/DateTimeField.js.map +1 -0
- package/dist/DateUtilities.d.ts +57 -0
- package/dist/DateUtilities.js +308 -0
- package/dist/DateUtilities.js.map +1 -0
- package/dist/DecimalRangeActionSheet.d.ts +6 -0
- package/dist/DecimalRangeActionSheet.js +45 -0
- package/dist/DecimalRangeActionSheet.js.map +1 -0
- package/dist/DismissButton.d.ts +3 -0
- package/dist/DismissButton.js +12 -0
- package/dist/DismissButton.js.map +1 -0
- package/dist/EmailField.d.ts +3 -0
- package/dist/EmailField.js +48 -0
- package/dist/EmailField.js.map +1 -0
- package/dist/EmojiSelector.d.ts +113 -0
- package/dist/EmojiSelector.js +322 -0
- package/dist/EmojiSelector.js.map +1 -0
- package/dist/ErrorBoundary.d.ts +19 -0
- package/dist/ErrorBoundary.js +30 -0
- package/dist/ErrorBoundary.js.map +1 -0
- package/dist/ErrorPage.d.ts +6 -0
- package/dist/ErrorPage.js +15 -0
- package/dist/ErrorPage.js.map +1 -0
- package/dist/Field.d.ts +3 -0
- package/dist/Field.js +80 -0
- package/dist/Field.js.map +1 -0
- package/dist/FlatList.d.ts +2 -0
- package/dist/FlatList.js +3 -0
- package/dist/FlatList.js.map +1 -0
- package/dist/Heading.d.ts +3 -0
- package/dist/Heading.js +43 -0
- package/dist/Heading.js.map +1 -0
- package/dist/HeightActionSheet.d.ts +11 -0
- package/dist/HeightActionSheet.js +46 -0
- package/dist/HeightActionSheet.js.map +1 -0
- package/dist/Hyperlink.d.ts +30 -0
- package/dist/Hyperlink.js +144 -0
- package/dist/Hyperlink.js.map +1 -0
- package/dist/Icon.d.ts +3 -0
- package/dist/Icon.js +15 -0
- package/dist/Icon.js.map +1 -0
- package/dist/IconButton.d.ts +3 -0
- package/dist/IconButton.js +111 -0
- package/dist/IconButton.js.map +1 -0
- package/dist/Image.d.ts +8 -0
- package/dist/Image.js +37 -0
- package/dist/Image.js.map +1 -0
- package/dist/ImageBackground.d.ts +10 -0
- package/dist/ImageBackground.js +9 -0
- package/dist/ImageBackground.js.map +1 -0
- package/dist/InfoModalIcon.d.ts +3 -0
- package/dist/InfoModalIcon.js +10 -0
- package/dist/InfoModalIcon.js.map +1 -0
- package/dist/InfoTooltipButton.d.ts +3 -0
- package/dist/InfoTooltipButton.js +6 -0
- package/dist/InfoTooltipButton.js.map +1 -0
- package/dist/Link.d.ts +3 -0
- package/dist/Link.js +10 -0
- package/dist/Link.js.map +1 -0
- package/dist/MarkdownView.d.ts +5 -0
- package/dist/MarkdownView.js +44 -0
- package/dist/MarkdownView.js.map +1 -0
- package/dist/MediaQuery.d.ts +4 -0
- package/dist/MediaQuery.js +52 -0
- package/dist/MediaQuery.js.map +1 -0
- package/dist/MobileAddressAutoComplete.d.ts +2 -0
- package/dist/MobileAddressAutoComplete.js +54 -0
- package/dist/MobileAddressAutoComplete.js.map +1 -0
- package/dist/Modal.d.ts +3 -0
- package/dist/Modal.js +127 -0
- package/dist/Modal.js.map +1 -0
- package/dist/ModalSheet.d.ts +6 -0
- package/dist/ModalSheet.js +42 -0
- package/dist/ModalSheet.js.map +1 -0
- package/dist/MultiselectField.d.ts +3 -0
- package/dist/MultiselectField.js +45 -0
- package/dist/MultiselectField.js.map +1 -0
- package/dist/NumberField.d.ts +3 -0
- package/dist/NumberField.js +60 -0
- package/dist/NumberField.js.map +1 -0
- package/dist/NumberPickerActionSheet.d.ts +7 -0
- package/dist/NumberPickerActionSheet.js +22 -0
- package/dist/NumberPickerActionSheet.js.map +1 -0
- package/dist/OpenAPIContext.d.ts +4 -0
- package/dist/OpenAPIContext.js +53 -0
- package/dist/OpenAPIContext.js.map +1 -0
- package/dist/Page.d.ts +7 -0
- package/dist/Page.js +24 -0
- package/dist/Page.js.map +1 -0
- package/dist/Pagination.d.ts +3 -0
- package/dist/Pagination.js +106 -0
- package/dist/Pagination.js.map +1 -0
- package/dist/PasswordField.d.ts +2 -0
- package/dist/PasswordField.js +6 -0
- package/dist/PasswordField.js.map +1 -0
- package/dist/Permissions.d.ts +2 -0
- package/dist/Permissions.js +35 -0
- package/dist/Permissions.js.map +1 -0
- package/dist/PhoneNumberField.d.ts +3 -0
- package/dist/PhoneNumberField.js +83 -0
- package/dist/PhoneNumberField.js.map +1 -0
- package/dist/PickerSelect.d.ts +46 -0
- package/dist/PickerSelect.js +306 -0
- package/dist/PickerSelect.js.map +1 -0
- package/dist/Radio.d.ts +3 -0
- package/dist/Radio.js +21 -0
- package/dist/Radio.js.map +1 -0
- package/dist/RadioField.d.ts +3 -0
- package/dist/RadioField.js +16 -0
- package/dist/RadioField.js.map +1 -0
- package/dist/ScrollView.d.ts +2 -0
- package/dist/ScrollView.js +3 -0
- package/dist/ScrollView.js.map +1 -0
- package/dist/SectionDivider.d.ts +2 -0
- package/dist/SectionDivider.js +12 -0
- package/dist/SectionDivider.js.map +1 -0
- package/dist/SegmentedControl.d.ts +3 -0
- package/dist/SegmentedControl.js +65 -0
- package/dist/SegmentedControl.js.map +1 -0
- package/dist/SelectBadge.d.ts +3 -0
- package/dist/SelectBadge.js +166 -0
- package/dist/SelectBadge.js.map +1 -0
- package/dist/SelectField.d.ts +3 -0
- package/dist/SelectField.js +16 -0
- package/dist/SelectField.js.map +1 -0
- package/dist/SideDrawer.d.ts +3 -0
- package/dist/SideDrawer.js +32 -0
- package/dist/SideDrawer.js.map +1 -0
- package/dist/Signature.d.ts +8 -0
- package/dist/Signature.js +21 -0
- package/dist/Signature.js.map +1 -0
- package/dist/Signature.native.d.ts +8 -0
- package/dist/Signature.native.js +26 -0
- package/dist/Signature.native.js.map +1 -0
- package/dist/SignatureField.d.ts +3 -0
- package/dist/SignatureField.js +42 -0
- package/dist/SignatureField.js.map +1 -0
- package/dist/Slider.d.ts +3 -0
- package/dist/Slider.js +78 -0
- package/dist/Slider.js.map +1 -0
- package/dist/Spinner.d.ts +3 -0
- package/dist/Spinner.js +33 -0
- package/dist/Spinner.js.map +1 -0
- package/dist/SplitPage.d.ts +2 -0
- package/dist/SplitPage.js +139 -0
- package/dist/SplitPage.js.map +1 -0
- package/dist/SplitPage.native.d.ts +2 -0
- package/dist/SplitPage.native.js +75 -0
- package/dist/SplitPage.native.js.map +1 -0
- package/dist/TapToEdit.d.ts +4 -0
- package/dist/TapToEdit.js +170 -0
- package/dist/TapToEdit.js.map +1 -0
- package/dist/TerrenoProvider.d.ts +6 -0
- package/dist/TerrenoProvider.js +10 -0
- package/dist/TerrenoProvider.js.map +1 -0
- package/dist/Text.d.ts +3 -0
- package/dist/Text.js +95 -0
- package/dist/Text.js.map +1 -0
- package/dist/TextArea.d.ts +3 -0
- package/dist/TextArea.js +6 -0
- package/dist/TextArea.js.map +1 -0
- package/dist/TextField.d.ts +3 -0
- package/dist/TextField.js +144 -0
- package/dist/TextField.js.map +1 -0
- package/dist/TextFieldNumberActionSheet.d.ts +7 -0
- package/dist/TextFieldNumberActionSheet.js +20 -0
- package/dist/TextFieldNumberActionSheet.js.map +1 -0
- package/dist/Theme.d.ts +96 -0
- package/dist/Theme.js +213 -0
- package/dist/Theme.js.map +1 -0
- package/dist/TimezonePicker.d.ts +11 -0
- package/dist/TimezonePicker.js +27 -0
- package/dist/TimezonePicker.js.map +1 -0
- package/dist/Toast.d.ts +23 -0
- package/dist/Toast.js +157 -0
- package/dist/Toast.js.map +1 -0
- package/dist/Tooltip.d.ts +3 -0
- package/dist/Tooltip.js +289 -0
- package/dist/Tooltip.js.map +1 -0
- package/dist/UnifiedAddressAutoComplete.d.ts +2 -0
- package/dist/UnifiedAddressAutoComplete.js +23 -0
- package/dist/UnifiedAddressAutoComplete.js.map +1 -0
- package/dist/Unifier.d.ts +43 -0
- package/dist/Unifier.js +154 -0
- package/dist/Unifier.js.map +1 -0
- package/dist/Utilities.d.ts +56 -0
- package/dist/Utilities.js +193 -0
- package/dist/Utilities.js.map +1 -0
- package/dist/WebAddressAutocomplete.d.ts +3 -0
- package/dist/WebAddressAutocomplete.js +61 -0
- package/dist/WebAddressAutocomplete.js.map +1 -0
- package/dist/fieldElements/FieldError.d.ts +6 -0
- package/dist/fieldElements/FieldError.js +9 -0
- package/dist/fieldElements/FieldError.js.map +1 -0
- package/dist/fieldElements/FieldHelperText.d.ts +6 -0
- package/dist/fieldElements/FieldHelperText.js +8 -0
- package/dist/fieldElements/FieldHelperText.js.map +1 -0
- package/dist/fieldElements/FieldTitle.d.ts +6 -0
- package/dist/fieldElements/FieldTitle.js +16 -0
- package/dist/fieldElements/FieldTitle.js.map +1 -0
- package/dist/fieldElements/index.d.ts +3 -0
- package/dist/fieldElements/index.js +4 -0
- package/dist/fieldElements/index.js.map +1 -0
- package/dist/icons/MobileIcon.d.ts +2 -0
- package/dist/icons/MobileIcon.js +18 -0
- package/dist/icons/MobileIcon.js.map +1 -0
- package/dist/icons/OfflineIcon.d.ts +2 -0
- package/dist/icons/OfflineIcon.js +18 -0
- package/dist/icons/OfflineIcon.js.map +1 -0
- package/dist/icons/OnlineIcon.d.ts +2 -0
- package/dist/icons/OnlineIcon.js +19 -0
- package/dist/icons/OnlineIcon.js.map +1 -0
- package/dist/icons/OutOfficeIcon.d.ts +2 -0
- package/dist/icons/OutOfficeIcon.js +18 -0
- package/dist/icons/OutOfficeIcon.js.map +1 -0
- package/dist/icons/index.d.ts +4 -0
- package/dist/icons/index.js +5 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/index.d.ts +1328 -0
- package/dist/index.js +89 -0
- package/dist/index.js.map +1 -0
- package/dist/table/Table.d.ts +3 -0
- package/dist/table/Table.js +53 -0
- package/dist/table/Table.js.map +1 -0
- package/dist/table/TableBadge.d.ts +6 -0
- package/dist/table/TableBadge.js +23 -0
- package/dist/table/TableBadge.js.map +1 -0
- package/dist/table/TableBoolean.d.ts +6 -0
- package/dist/table/TableBoolean.js +37 -0
- package/dist/table/TableBoolean.js.map +1 -0
- package/dist/table/TableDate.d.ts +3 -0
- package/dist/table/TableDate.js +27 -0
- package/dist/table/TableDate.js.map +1 -0
- package/dist/table/TableHeader.d.ts +6 -0
- package/dist/table/TableHeader.js +10 -0
- package/dist/table/TableHeader.js.map +1 -0
- package/dist/table/TableHeaderCell.d.ts +6 -0
- package/dist/table/TableHeaderCell.js +54 -0
- package/dist/table/TableHeaderCell.js.map +1 -0
- package/dist/table/TableIconButton.d.ts +3 -0
- package/dist/table/TableIconButton.js +39 -0
- package/dist/table/TableIconButton.js.map +1 -0
- package/dist/table/TableNumber.d.ts +3 -0
- package/dist/table/TableNumber.js +18 -0
- package/dist/table/TableNumber.js.map +1 -0
- package/dist/table/TableRow.d.ts +6 -0
- package/dist/table/TableRow.js +22 -0
- package/dist/table/TableRow.js.map +1 -0
- package/dist/table/TableText.d.ts +3 -0
- package/dist/table/TableText.js +18 -0
- package/dist/table/TableText.js.map +1 -0
- package/dist/table/TableTitle.d.ts +3 -0
- package/dist/table/TableTitle.js +21 -0
- package/dist/table/TableTitle.js.map +1 -0
- package/dist/table/tableContext.d.ts +5 -0
- package/dist/table/tableContext.js +38 -0
- package/dist/table/tableContext.js.map +1 -0
- package/dist/useStoredState.d.ts +1 -0
- package/dist/useStoredState.js +49 -0
- package/dist/useStoredState.js.map +1 -0
- package/package.json +123 -0
- package/src/Accordion.test.tsx +104 -0
- package/src/Accordion.tsx +81 -0
- package/src/ActionSheet.tsx +881 -0
- package/src/AddressField.test.tsx +120 -0
- package/src/AddressField.tsx +122 -0
- package/src/Avatar.test.tsx +163 -0
- package/src/Avatar.tsx +298 -0
- package/src/Badge.test.tsx +116 -0
- package/src/Badge.tsx +136 -0
- package/src/Banner.tsx +200 -0
- package/src/Body.tsx +34 -0
- package/src/BooleanField.tsx +141 -0
- package/src/Box.test.tsx +662 -0
- package/src/Box.tsx +368 -0
- package/src/Button.tsx +196 -0
- package/src/Card.tsx +19 -0
- package/src/CheckBox.tsx +45 -0
- package/src/Common.ts +2787 -0
- package/src/CommonIconTypes.ts +2030 -0
- package/src/Constants.ts +3311 -0
- package/src/CustomSelectField.tsx +115 -0
- package/src/DataTable.tsx +674 -0
- package/src/DateTimeActionSheet.tsx +559 -0
- package/src/DateTimeField.test.tsx +393 -0
- package/src/DateTimeField.tsx +777 -0
- package/src/DateUtilities.test.ts +440 -0
- package/src/DateUtilities.tsx +370 -0
- package/src/DecimalRangeActionSheet.tsx +85 -0
- package/src/DismissButton.tsx +31 -0
- package/src/EmailField.tsx +66 -0
- package/src/EmojiSelector.test.tsx +61 -0
- package/src/EmojiSelector.tsx +510 -0
- package/src/ErrorBoundary.tsx +37 -0
- package/src/ErrorPage.tsx +41 -0
- package/src/Field.tsx +101 -0
- package/src/FlatList.tsx +2 -0
- package/src/Heading.tsx +66 -0
- package/src/HeightActionSheet.tsx +91 -0
- package/src/Hyperlink.tsx +179 -0
- package/src/Icon.tsx +36 -0
- package/src/IconButton.tsx +217 -0
- package/src/Image.tsx +51 -0
- package/src/ImageBackground.tsx +14 -0
- package/src/InfoModalIcon.tsx +42 -0
- package/src/InfoTooltipButton.tsx +16 -0
- package/src/Link.tsx +22 -0
- package/src/MarkdownView.tsx +67 -0
- package/src/MediaQuery.ts +46 -0
- package/src/MobileAddressAutoComplete.tsx +126 -0
- package/src/Modal.tsx +300 -0
- package/src/ModalSheet.tsx +58 -0
- package/src/MultiselectField.tsx +112 -0
- package/src/NumberField.tsx +67 -0
- package/src/NumberPickerActionSheet.tsx +51 -0
- package/src/OpenAPIContext.tsx +74 -0
- package/src/Page.tsx +105 -0
- package/src/Pagination.tsx +169 -0
- package/src/PasswordField.tsx +7 -0
- package/src/Permissions.ts +43 -0
- package/src/PhoneNumberField.tsx +109 -0
- package/src/PickerSelect.tsx +571 -0
- package/src/Radio.tsx +33 -0
- package/src/RadioField.tsx +43 -0
- package/src/ScrollView.tsx +2 -0
- package/src/SectionDivider.tsx +18 -0
- package/src/SegmentedControl.tsx +126 -0
- package/src/SelectBadge.tsx +280 -0
- package/src/SelectField.tsx +41 -0
- package/src/SideDrawer.tsx +56 -0
- package/src/Signature.native.tsx +57 -0
- package/src/Signature.tsx +44 -0
- package/src/SignatureField.tsx +92 -0
- package/src/Slider.tsx +199 -0
- package/src/Spinner.tsx +35 -0
- package/src/SplitPage.native.tsx +163 -0
- package/src/SplitPage.tsx +304 -0
- package/src/TapToEdit.tsx +292 -0
- package/src/TerrenoProvider.tsx +31 -0
- package/src/Text.tsx +123 -0
- package/src/TextArea.test.tsx +255 -0
- package/src/TextArea.tsx +8 -0
- package/src/TextField.test.tsx +487 -0
- package/src/TextField.tsx +260 -0
- package/src/TextFieldNumberActionSheet.tsx +46 -0
- package/src/Theme.tsx +248 -0
- package/src/TimezonePicker.tsx +45 -0
- package/src/Toast.tsx +234 -0
- package/src/Tooltip.tsx +407 -0
- package/src/UnifiedAddressAutoComplete.tsx +66 -0
- package/src/Unifier.ts +172 -0
- package/src/Utilities.tsx +329 -0
- package/src/WebAddressAutocomplete.tsx +84 -0
- package/src/__snapshots__/Accordion.test.tsx.snap +126 -0
- package/src/__snapshots__/AddressField.test.tsx.snap +1197 -0
- package/src/__snapshots__/Avatar.test.tsx.snap +57 -0
- package/src/__snapshots__/Badge.test.tsx.snap +55 -0
- package/src/__snapshots__/Box.test.tsx.snap +162 -0
- package/src/__snapshots__/EmojiSelector.test.tsx.snap +422 -0
- package/src/__snapshots__/TextArea.test.tsx.snap +521 -0
- package/src/__snapshots__/TextField.test.tsx.snap +569 -0
- package/src/bunSetup.ts +1235 -0
- package/src/fieldElements/FieldError.tsx +24 -0
- package/src/fieldElements/FieldHelperText.tsx +20 -0
- package/src/fieldElements/FieldTitle.tsx +31 -0
- package/src/fieldElements/index.tsx +3 -0
- package/src/icons/MobileIcon.tsx +40 -0
- package/src/icons/OfflineIcon.tsx +37 -0
- package/src/icons/OnlineIcon.tsx +39 -0
- package/src/icons/OutOfficeIcon.tsx +36 -0
- package/src/icons/index.ts +4 -0
- package/src/index.tsx +1375 -0
- package/src/polyfill.d.ts +11 -0
- package/src/table/Table.tsx +109 -0
- package/src/table/TableBadge.tsx +46 -0
- package/src/table/TableBoolean.tsx +70 -0
- package/src/table/TableDate.tsx +38 -0
- package/src/table/TableHeader.tsx +20 -0
- package/src/table/TableHeaderCell.tsx +94 -0
- package/src/table/TableIconButton.tsx +61 -0
- package/src/table/TableNumber.tsx +29 -0
- package/src/table/TableRow.tsx +67 -0
- package/src/table/TableText.tsx +29 -0
- package/src/table/TableTitle.tsx +31 -0
- package/src/table/tableContext.tsx +67 -0
- package/src/test-utils.tsx +27 -0
- package/src/types/react-native-swiper-flatlist.d.ts +56 -0
- package/src/useStoredState.test.tsx +143 -0
- package/src/useStoredState.ts +56 -0
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
import {afterEach, beforeEach, describe, expect, it, mock} from "bun:test";
|
|
2
|
+
import {act, fireEvent, userEvent} from "@testing-library/react-native";
|
|
3
|
+
import {TextField} from "./TextField";
|
|
4
|
+
import {renderWithTheme} from "./test-utils";
|
|
5
|
+
|
|
6
|
+
describe("TextField", () => {
|
|
7
|
+
let mockOnChange: ReturnType<typeof mock>;
|
|
8
|
+
let mockOnFocus: ReturnType<typeof mock>;
|
|
9
|
+
let mockOnBlur: ReturnType<typeof mock>;
|
|
10
|
+
let mockOnEnter: ReturnType<typeof mock>;
|
|
11
|
+
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
mockOnChange = mock(() => {});
|
|
14
|
+
mockOnFocus = mock(() => {});
|
|
15
|
+
mockOnBlur = mock(() => {});
|
|
16
|
+
mockOnEnter = mock(() => {});
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
// Reset mocks after each test
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
describe("basic rendering", () => {
|
|
24
|
+
it("should render with default props", () => {
|
|
25
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
26
|
+
<TextField onChange={mockOnChange} value="test value" />
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
expect(getByDisplayValue("test value").props.value).toBe("test value");
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("should render with title", () => {
|
|
33
|
+
const {getByText} = renderWithTheme(
|
|
34
|
+
<TextField onChange={mockOnChange} title="Test Title" value="" />
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
expect(getByText("Test Title")).toBeTruthy();
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("should render with placeholder", () => {
|
|
41
|
+
const {getByPlaceholderText} = renderWithTheme(
|
|
42
|
+
<TextField onChange={mockOnChange} placeholder="Enter text" value="" />
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
expect(getByPlaceholderText("Enter text")).toBeTruthy();
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("should render helper text", () => {
|
|
49
|
+
const {getByText} = renderWithTheme(
|
|
50
|
+
<TextField helperText="This is helper text" onChange={mockOnChange} value="" />
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
expect(getByText("This is helper text")).toBeTruthy();
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it("should render error text", () => {
|
|
57
|
+
const {getByText} = renderWithTheme(
|
|
58
|
+
<TextField errorText="This is an error" onChange={mockOnChange} value="" />
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
expect(getByText("This is an error")).toBeTruthy();
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
describe("user interactions", () => {
|
|
66
|
+
it("should call onChange when text is entered", async () => {
|
|
67
|
+
const user = userEvent.setup();
|
|
68
|
+
const {getByDisplayValue} = renderWithTheme(<TextField onChange={mockOnChange} value="" />);
|
|
69
|
+
|
|
70
|
+
const input = getByDisplayValue("");
|
|
71
|
+
await user.type(input, "hello");
|
|
72
|
+
|
|
73
|
+
expect(mockOnChange).toHaveBeenCalled();
|
|
74
|
+
expect(mockOnChange.mock.calls.length).toBeGreaterThan(0);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it("should call onFocus when input is focused", async () => {
|
|
78
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
79
|
+
<TextField onChange={mockOnChange} onFocus={mockOnFocus} value="" />
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
const input = getByDisplayValue("");
|
|
83
|
+
expect(input.props.onFocus).toBeTruthy();
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("should call onBlur when input loses focus", async () => {
|
|
87
|
+
const user = userEvent.setup();
|
|
88
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
89
|
+
<TextField onBlur={mockOnBlur} onChange={mockOnChange} value="test" />
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
const input = getByDisplayValue("test");
|
|
93
|
+
await user.press(input);
|
|
94
|
+
await act(async () => {
|
|
95
|
+
input.props.onBlur();
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
expect(mockOnBlur).toHaveBeenCalledTimes(1);
|
|
99
|
+
expect(mockOnBlur.mock.calls[0][0]).toBe("test");
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it("should call onEnter when enter key is pressed", async () => {
|
|
103
|
+
const _user = userEvent.setup();
|
|
104
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
105
|
+
<TextField onChange={mockOnChange} onEnter={mockOnEnter} value="" />
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
const input = getByDisplayValue("");
|
|
109
|
+
await act(async () => {
|
|
110
|
+
input.props.onSubmitEditing();
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
expect(mockOnEnter).toHaveBeenCalledTimes(1);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it("should trim value on blur if trimOnBlur is true, even if onBlur prop is not provided", () => {
|
|
117
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
118
|
+
<TextField onChange={mockOnChange} trimOnBlur value="test " />
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
const input = getByDisplayValue("test ");
|
|
122
|
+
|
|
123
|
+
fireEvent(input, "blur");
|
|
124
|
+
|
|
125
|
+
// on change should be called with trimmed value
|
|
126
|
+
expect(mockOnChange).toHaveBeenCalled();
|
|
127
|
+
const lastCall = mockOnChange.mock.calls.at(-1);
|
|
128
|
+
expect(lastCall?.[0]).toBe("test");
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it("should trim value on blur if trimOnBlur is true, with onBlur prop provided", async () => {
|
|
132
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
133
|
+
<TextField onBlur={mockOnBlur} onChange={mockOnChange} trimOnBlur={true} value="test " />
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
const input = getByDisplayValue("test ");
|
|
137
|
+
|
|
138
|
+
fireEvent(input, "blur");
|
|
139
|
+
|
|
140
|
+
// onChange should be called with trimmed value
|
|
141
|
+
expect(mockOnChange).toHaveBeenCalled();
|
|
142
|
+
const lastCall = mockOnChange.mock.calls[mockOnChange.mock.calls.length - 1];
|
|
143
|
+
expect(lastCall[0]).toBe("test");
|
|
144
|
+
|
|
145
|
+
// onBlur should also be called with trimmed value
|
|
146
|
+
expect(mockOnBlur).toHaveBeenCalledTimes(1);
|
|
147
|
+
expect(mockOnBlur.mock.calls[0][0]).toBe("test");
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it("should NOT trim value on blur if trimOnBlur is false", async () => {
|
|
151
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
152
|
+
<TextField onChange={mockOnChange} trimOnBlur={false} value="test " />
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
const input = getByDisplayValue("test ");
|
|
156
|
+
fireEvent(input, "blur");
|
|
157
|
+
|
|
158
|
+
// onChange should not be called because the value hasn't changed (no trimming)
|
|
159
|
+
expect(mockOnChange).not.toHaveBeenCalled();
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it("trims on blur by default when no prop is provided", async () => {
|
|
163
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
164
|
+
<TextField onChange={mockOnChange} value="test " />
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
const input = getByDisplayValue("test ");
|
|
168
|
+
fireEvent(input, "blur");
|
|
169
|
+
|
|
170
|
+
// onChange should be called with trimmed value
|
|
171
|
+
expect(mockOnChange).toHaveBeenCalled();
|
|
172
|
+
const lastCall = mockOnChange.mock.calls.at(-1);
|
|
173
|
+
expect(lastCall?.[0]).toBe("test");
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
describe("field types", () => {
|
|
178
|
+
it("should render email type with correct keyboard", () => {
|
|
179
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
180
|
+
<TextField onChange={mockOnChange} type="email" value="" />
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
const input = getByDisplayValue("");
|
|
184
|
+
expect(input.props.keyboardType).toBe("email-address");
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it("should render password type with secure text entry", () => {
|
|
188
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
189
|
+
<TextField onChange={mockOnChange} type="password" value="" />
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
const input = getByDisplayValue("");
|
|
193
|
+
expect(input.props.secureTextEntry).toBe(true);
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
it("should render url type with correct keyboard", () => {
|
|
197
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
198
|
+
<TextField onChange={mockOnChange} type="url" value="" />
|
|
199
|
+
);
|
|
200
|
+
|
|
201
|
+
const input = getByDisplayValue("");
|
|
202
|
+
expect(input.props.keyboardType === "url" || input.props.keyboardType === "default").toBe(
|
|
203
|
+
true
|
|
204
|
+
);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it("should render phoneNumber type with number keyboard", () => {
|
|
208
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
209
|
+
<TextField onChange={mockOnChange} type="phoneNumber" value="" />
|
|
210
|
+
);
|
|
211
|
+
|
|
212
|
+
const input = getByDisplayValue("");
|
|
213
|
+
expect(input.props.keyboardType).toBe("number-pad");
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
it("should render search type with default keyboard", () => {
|
|
217
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
218
|
+
<TextField onChange={mockOnChange} type="search" value="" />
|
|
219
|
+
);
|
|
220
|
+
|
|
221
|
+
const input = getByDisplayValue("");
|
|
222
|
+
expect(input.props.keyboardType).toBe("default");
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
describe("multiline behavior", () => {
|
|
227
|
+
it("should render as multiline when multiline prop is true", () => {
|
|
228
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
229
|
+
<TextField multiline onChange={mockOnChange} value="" />
|
|
230
|
+
);
|
|
231
|
+
|
|
232
|
+
const input = getByDisplayValue("");
|
|
233
|
+
expect(input.props.multiline).toBe(true);
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
it("should set number of lines when rows prop is provided", () => {
|
|
237
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
238
|
+
<TextField multiline onChange={mockOnChange} rows={5} value="" />
|
|
239
|
+
);
|
|
240
|
+
|
|
241
|
+
const input = getByDisplayValue("");
|
|
242
|
+
expect(input.props.numberOfLines).toBe(5);
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
it("should handle grow behavior with multiline", () => {
|
|
246
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
247
|
+
<TextField grow multiline onChange={mockOnChange} value="" />
|
|
248
|
+
);
|
|
249
|
+
|
|
250
|
+
const input = getByDisplayValue("");
|
|
251
|
+
expect(input.props.multiline).toBe(true);
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
describe("disabled state", () => {
|
|
256
|
+
it("should be read-only when disabled", () => {
|
|
257
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
258
|
+
<TextField disabled onChange={mockOnChange} value="test" />
|
|
259
|
+
);
|
|
260
|
+
|
|
261
|
+
const input = getByDisplayValue("test");
|
|
262
|
+
expect(input.props.readOnly).toBe(true);
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
it("should not call onFocus when disabled", async () => {
|
|
266
|
+
const _user = userEvent.setup();
|
|
267
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
268
|
+
<TextField disabled onChange={mockOnChange} onFocus={mockOnFocus} value="" />
|
|
269
|
+
);
|
|
270
|
+
|
|
271
|
+
const input = getByDisplayValue("");
|
|
272
|
+
expect(input.props.readOnly).toBe(true);
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
it("should not call onBlur when disabled", async () => {
|
|
276
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
277
|
+
<TextField disabled onBlur={mockOnBlur} onChange={mockOnChange} value="test" />
|
|
278
|
+
);
|
|
279
|
+
|
|
280
|
+
const input = getByDisplayValue("test");
|
|
281
|
+
await act(async () => {
|
|
282
|
+
input.props.onBlur();
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
expect(mockOnBlur).not.toHaveBeenCalled();
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
describe("icon functionality", () => {
|
|
290
|
+
it("should render icon when iconName is provided", () => {
|
|
291
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
292
|
+
<TextField iconName="check" onChange={mockOnChange} value="" />
|
|
293
|
+
);
|
|
294
|
+
|
|
295
|
+
const input = getByDisplayValue("");
|
|
296
|
+
expect(input).toBeTruthy();
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
it("should call onIconClick when icon is pressed", async () => {
|
|
300
|
+
const mockOnIconClick = mock(() => {});
|
|
301
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
302
|
+
<TextField
|
|
303
|
+
iconName="check"
|
|
304
|
+
onChange={mockOnChange}
|
|
305
|
+
onIconClick={mockOnIconClick}
|
|
306
|
+
value=""
|
|
307
|
+
/>
|
|
308
|
+
);
|
|
309
|
+
|
|
310
|
+
const input = getByDisplayValue("");
|
|
311
|
+
expect(input).toBeTruthy();
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
describe("accessibility", () => {
|
|
316
|
+
it("should have correct accessibility properties", () => {
|
|
317
|
+
const {getByDisplayValue} = renderWithTheme(<TextField onChange={mockOnChange} value="" />);
|
|
318
|
+
|
|
319
|
+
const input = getByDisplayValue("");
|
|
320
|
+
expect(input.props.accessibilityHint).toBe("Enter text here");
|
|
321
|
+
expect(input.props["aria-label"]).toBe("Text input field");
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
it("should indicate disabled state in accessibility", () => {
|
|
325
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
326
|
+
<TextField disabled onChange={mockOnChange} value="" />
|
|
327
|
+
);
|
|
328
|
+
|
|
329
|
+
const input = getByDisplayValue("");
|
|
330
|
+
expect(input.props.accessibilityState.disabled).toBe(true);
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
describe("auto-complete and text content", () => {
|
|
335
|
+
it("should set autoComplete property", () => {
|
|
336
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
337
|
+
<TextField autoComplete="username" onChange={mockOnChange} value="" />
|
|
338
|
+
);
|
|
339
|
+
|
|
340
|
+
const input = getByDisplayValue("");
|
|
341
|
+
expect(input).toBeTruthy();
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
it("should handle text content type for email", () => {
|
|
345
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
346
|
+
<TextField onChange={mockOnChange} type="email" value="" />
|
|
347
|
+
);
|
|
348
|
+
|
|
349
|
+
const input = getByDisplayValue("");
|
|
350
|
+
expect(input.props.textContentType).toBe("emailAddress");
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
it("should handle text content type for password", () => {
|
|
354
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
355
|
+
<TextField onChange={mockOnChange} type="password" value="" />
|
|
356
|
+
);
|
|
357
|
+
|
|
358
|
+
const input = getByDisplayValue("");
|
|
359
|
+
expect(input.props.textContentType).toBe("password");
|
|
360
|
+
});
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
describe("edge cases", () => {
|
|
364
|
+
it("should handle empty value", () => {
|
|
365
|
+
const {getByDisplayValue} = renderWithTheme(<TextField onChange={mockOnChange} value="" />);
|
|
366
|
+
|
|
367
|
+
const input = getByDisplayValue("");
|
|
368
|
+
expect(input.props.value).toBe("");
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
it("should handle undefined value", () => {
|
|
372
|
+
const {root} = renderWithTheme(<TextField onChange={mockOnChange} value={undefined} />);
|
|
373
|
+
|
|
374
|
+
expect(root).toBeTruthy();
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
it("should handle long text values", () => {
|
|
378
|
+
const longText = "a".repeat(1000);
|
|
379
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
380
|
+
<TextField onChange={mockOnChange} value={longText} />
|
|
381
|
+
);
|
|
382
|
+
|
|
383
|
+
const input = getByDisplayValue(longText);
|
|
384
|
+
expect(input.props.value).toBe(longText);
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
it("should handle special characters", () => {
|
|
388
|
+
const specialText = "!@#$%^&*()_+-=[]{}|;':\",./<>?";
|
|
389
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
390
|
+
<TextField onChange={mockOnChange} value={specialText} />
|
|
391
|
+
);
|
|
392
|
+
|
|
393
|
+
const input = getByDisplayValue(specialText);
|
|
394
|
+
expect(input.props.value).toBe(specialText);
|
|
395
|
+
});
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
describe("return key behavior", () => {
|
|
399
|
+
it("should set return key type", () => {
|
|
400
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
401
|
+
<TextField onChange={mockOnChange} returnKeyType="done" value="" />
|
|
402
|
+
);
|
|
403
|
+
|
|
404
|
+
const input = getByDisplayValue("");
|
|
405
|
+
expect(input.props.enterKeyHint).toBe("done");
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
it("should handle blur on submit", () => {
|
|
409
|
+
const {getByDisplayValue} = renderWithTheme(
|
|
410
|
+
<TextField blurOnSubmit={false} onChange={mockOnChange} value="" />
|
|
411
|
+
);
|
|
412
|
+
|
|
413
|
+
const input = getByDisplayValue("");
|
|
414
|
+
expect(input.props.blurOnSubmit).toBe(false);
|
|
415
|
+
});
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
describe("input ref", () => {
|
|
419
|
+
it("should call inputRef with the input reference", () => {
|
|
420
|
+
const mockInputRef = mock(() => {});
|
|
421
|
+
renderWithTheme(<TextField inputRef={mockInputRef} onChange={mockOnChange} value="" />);
|
|
422
|
+
|
|
423
|
+
expect(mockInputRef).toHaveBeenCalled();
|
|
424
|
+
});
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
describe("snapshots", () => {
|
|
428
|
+
it("should match snapshot with default props", () => {
|
|
429
|
+
const component = renderWithTheme(<TextField onChange={mockOnChange} value="test value" />);
|
|
430
|
+
expect(component.toJSON()).toMatchSnapshot();
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
it("should match snapshot with all props", () => {
|
|
434
|
+
const component = renderWithTheme(
|
|
435
|
+
<TextField
|
|
436
|
+
disabled={false}
|
|
437
|
+
errorText="Error text"
|
|
438
|
+
helperText="Helper text"
|
|
439
|
+
iconName="check"
|
|
440
|
+
multiline={false}
|
|
441
|
+
onBlur={mockOnBlur}
|
|
442
|
+
onChange={mockOnChange}
|
|
443
|
+
onEnter={mockOnEnter}
|
|
444
|
+
onFocus={mockOnFocus}
|
|
445
|
+
onIconClick={mock(() => {})}
|
|
446
|
+
placeholder="Enter text"
|
|
447
|
+
title="Test Title"
|
|
448
|
+
type="text"
|
|
449
|
+
value="test value"
|
|
450
|
+
/>
|
|
451
|
+
);
|
|
452
|
+
expect(component.toJSON()).toMatchSnapshot();
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
it("should match snapshot when disabled", () => {
|
|
456
|
+
const component = renderWithTheme(
|
|
457
|
+
<TextField disabled onChange={mockOnChange} title="Disabled Field" value="disabled value" />
|
|
458
|
+
);
|
|
459
|
+
expect(component.toJSON()).toMatchSnapshot();
|
|
460
|
+
});
|
|
461
|
+
|
|
462
|
+
it("should match snapshot with multiline", () => {
|
|
463
|
+
const component = renderWithTheme(
|
|
464
|
+
<TextField
|
|
465
|
+
multiline
|
|
466
|
+
onChange={mockOnChange}
|
|
467
|
+
rows={3}
|
|
468
|
+
title="Multiline Field"
|
|
469
|
+
value="line 1\nline 2"
|
|
470
|
+
/>
|
|
471
|
+
);
|
|
472
|
+
expect(component.toJSON()).toMatchSnapshot();
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
it("should match snapshot with error state", () => {
|
|
476
|
+
const component = renderWithTheme(
|
|
477
|
+
<TextField
|
|
478
|
+
errorText="This field is required"
|
|
479
|
+
onChange={mockOnChange}
|
|
480
|
+
title="Error Field"
|
|
481
|
+
value=""
|
|
482
|
+
/>
|
|
483
|
+
);
|
|
484
|
+
expect(component.toJSON()).toMatchSnapshot();
|
|
485
|
+
});
|
|
486
|
+
});
|
|
487
|
+
});
|