@capillarytech/creatives-library 8.0.242-alpha.0 → 8.0.242-alpha.2
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/assets/Android.png +0 -0
- package/assets/iOS.png +0 -0
- package/constants/unified.js +2 -1
- package/initialReducer.js +2 -0
- package/package.json +1 -1
- package/sagas/__tests__/assetPolling.test.js +74 -3
- package/sagas/assetPolling.js +8 -1
- package/services/api.js +10 -5
- package/services/tests/api.test.js +18 -0
- package/translations/en.json +0 -1
- package/utils/common.js +5 -0
- package/utils/commonUtils.js +14 -1
- package/utils/tests/commonUtil.test.js +224 -0
- package/utils/transformTemplateConfig.js +0 -10
- package/utils/transformerUtils.js +0 -42
- package/v2Components/CapDeviceContent/index.js +61 -56
- package/v2Components/CapImageUpload/constants.js +0 -2
- package/v2Components/CapImageUpload/index.js +14 -54
- package/v2Components/CapImageUpload/index.scss +1 -4
- package/v2Components/CapImageUpload/messages.js +0 -4
- package/v2Components/CapTagList/index.js +6 -1
- package/v2Components/CapTagListWithInput/index.js +5 -1
- package/v2Components/CapTagListWithInput/messages.js +1 -1
- package/v2Components/CapWhatsappCTA/tests/index.test.js +5 -0
- package/v2Components/ErrorInfoNote/index.js +412 -72
- package/v2Components/ErrorInfoNote/messages.js +22 -0
- package/v2Components/ErrorInfoNote/style.scss +279 -2
- package/v2Components/HtmlEditor/HTMLEditor.js +217 -90
- package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +1132 -133
- package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +17 -12
- package/v2Components/HtmlEditor/_htmlEditor.scss +15 -23
- package/v2Components/HtmlEditor/_index.lazy.scss +1 -1
- package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +13 -101
- package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +148 -139
- package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +2 -1
- package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
- package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +1 -0
- package/v2Components/HtmlEditor/components/EditorToolbar/index.js +1 -1
- package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +1 -0
- package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +4 -7
- package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +35 -45
- package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +1 -3
- package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
- package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +7 -6
- package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +3 -6
- package/v2Components/HtmlEditor/components/PreviewPane/index.js +10 -11
- package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +87 -62
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +49 -31
- package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +254 -0
- package/v2Components/HtmlEditor/components/ValidationTabs/index.js +362 -0
- package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +51 -0
- package/v2Components/HtmlEditor/constants.js +29 -20
- package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +373 -16
- package/v2Components/HtmlEditor/hooks/useEditorContent.js +5 -2
- package/v2Components/HtmlEditor/hooks/useInAppContent.js +88 -146
- package/v2Components/HtmlEditor/index.js +1 -1
- package/v2Components/HtmlEditor/messages.js +95 -85
- package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +99 -101
- package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +23 -25
- package/v2Components/HtmlEditor/utils/validationAdapter.js +34 -41
- package/v2Components/MobilePushPreviewV2/index.js +32 -7
- package/v2Components/TemplatePreview/_templatePreview.scss +44 -24
- package/v2Components/TemplatePreview/index.js +47 -32
- package/v2Components/TemplatePreview/messages.js +4 -0
- package/v2Components/TestAndPreviewSlidebox/index.js +31 -25
- package/v2Containers/App/constants.js +0 -5
- package/v2Containers/BeeEditor/index.js +82 -80
- package/v2Containers/BeePopupEditor/constants.js +10 -0
- package/v2Containers/BeePopupEditor/index.js +193 -0
- package/v2Containers/BeePopupEditor/tests/index.test.js +627 -0
- package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +0 -1
- package/v2Containers/CreativesContainer/SlideBoxContent.js +148 -120
- package/v2Containers/CreativesContainer/SlideBoxFooter.js +9 -3
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
- package/v2Containers/CreativesContainer/constants.js +1 -2
- package/v2Containers/CreativesContainer/index.js +173 -193
- package/v2Containers/CreativesContainer/messages.js +4 -4
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +38 -50
- package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +36 -0
- package/v2Containers/Email/actions.js +7 -0
- package/v2Containers/Email/constants.js +5 -1
- package/v2Containers/Email/index.js +13 -0
- package/v2Containers/Email/messages.js +32 -0
- package/v2Containers/Email/reducer.js +12 -1
- package/v2Containers/Email/sagas.js +41 -6
- package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +2 -0
- package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +1046 -0
- package/v2Containers/EmailWrapper/components/EmailWrapperView.js +193 -7
- package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +40 -74
- package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +2 -67
- package/v2Containers/EmailWrapper/constants.js +2 -0
- package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +436 -67
- package/v2Containers/EmailWrapper/index.js +99 -23
- package/v2Containers/EmailWrapper/messages.js +61 -1
- package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +26 -1
- package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +111 -77
- package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +376 -0
- package/v2Containers/InApp/__tests__/sagas.test.js +363 -0
- package/v2Containers/InApp/actions.js +7 -0
- package/v2Containers/InApp/constants.js +20 -4
- package/v2Containers/InApp/index.js +800 -357
- package/v2Containers/InApp/index.scss +4 -3
- package/v2Containers/InApp/messages.js +7 -3
- package/v2Containers/InApp/reducer.js +21 -3
- package/v2Containers/InApp/sagas.js +29 -9
- package/v2Containers/InApp/selectors.js +25 -5
- package/v2Containers/InApp/tests/index.test.js +154 -50
- package/v2Containers/InApp/tests/reducer.test.js +34 -0
- package/v2Containers/InApp/tests/sagas.test.js +61 -9
- package/v2Containers/InApp/tests/selectors.test.js +612 -0
- package/v2Containers/InAppWrapper/components/InAppWrapperView.js +162 -0
- package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +267 -0
- package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +9 -0
- package/v2Containers/InAppWrapper/constants.js +16 -0
- package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +473 -0
- package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +198 -0
- package/v2Containers/InAppWrapper/index.js +148 -0
- package/v2Containers/InAppWrapper/messages.js +49 -0
- package/v2Containers/InappAdvance/index.js +1099 -0
- package/v2Containers/InappAdvance/index.scss +10 -0
- package/v2Containers/InappAdvance/tests/index.test.js +448 -0
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +3 -3
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +2 -2
- package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +2 -25
- package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +9 -18
- package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +12 -46
- package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +0 -4
- package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +4 -8
- package/v2Containers/TagList/index.js +67 -1
- package/v2Containers/Templates/ChannelTypeIllustration.js +1 -13
- package/v2Containers/Templates/_templates.scss +56 -200
- package/v2Containers/Templates/actions.js +1 -2
- package/v2Containers/Templates/constants.js +0 -1
- package/v2Containers/Templates/index.js +124 -277
- package/v2Containers/Templates/messages.js +4 -24
- package/v2Containers/Templates/reducer.js +0 -2
- package/v2Containers/Templates/tests/index.test.js +0 -10
- package/v2Containers/TemplatesV2/index.js +2 -3
- package/v2Containers/TemplatesV2/messages.js +0 -4
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +35 -132
- package/v2Components/CapImageUrlUpload/constants.js +0 -19
- package/v2Components/CapImageUrlUpload/index.js +0 -455
- package/v2Components/CapImageUrlUpload/index.scss +0 -35
- package/v2Components/CapImageUrlUpload/messages.js +0 -47
- package/v2Containers/WebPush/Create/components/ButtonForm.js +0 -175
- package/v2Containers/WebPush/Create/components/ButtonItem.js +0 -101
- package/v2Containers/WebPush/Create/components/ButtonList.js +0 -144
- package/v2Containers/WebPush/Create/components/_buttons.scss +0 -246
- package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +0 -554
- package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +0 -607
- package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +0 -633
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +0 -666
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +0 -74
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +0 -80
- package/v2Containers/WebPush/Create/index.js +0 -1755
- package/v2Containers/WebPush/Create/index.scss +0 -123
- package/v2Containers/WebPush/Create/messages.js +0 -199
- package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +0 -241
- package/v2Containers/WebPush/Create/preview/NotificationContainer.js +0 -290
- package/v2Containers/WebPush/Create/preview/PreviewContent.js +0 -81
- package/v2Containers/WebPush/Create/preview/PreviewControls.js +0 -240
- package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +0 -23
- package/v2Containers/WebPush/Create/preview/WebPushPreview.js +0 -144
- package/v2Containers/WebPush/Create/preview/assets/Light.svg +0 -53
- package/v2Containers/WebPush/Create/preview/assets/Top.svg +0 -5
- package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
- package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
- package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +0 -106
- package/v2Containers/WebPush/Create/preview/assets/iOS.svg +0 -26
- package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +0 -18
- package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +0 -29
- package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +0 -44
- package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +0 -110
- package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +0 -45
- package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +0 -72
- package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +0 -55
- package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +0 -70
- package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +0 -512
- package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +0 -77
- package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +0 -527
- package/v2Containers/WebPush/Create/preview/constants.js +0 -162
- package/v2Containers/WebPush/Create/preview/notification-container.scss +0 -104
- package/v2Containers/WebPush/Create/preview/preview.scss +0 -409
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +0 -300
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +0 -12
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +0 -12
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +0 -12
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +0 -303
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +0 -11
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +0 -11
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +0 -11
- package/v2Containers/WebPush/Create/preview/styles/_base.scss +0 -188
- package/v2Containers/WebPush/Create/preview/styles/_ios.scss +0 -106
- package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +0 -107
- package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +0 -75
- package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +0 -174
- package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +0 -909
- package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +0 -1077
- package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +0 -723
- package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +0 -943
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +0 -128
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +0 -121
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +0 -144
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +0 -127
- package/v2Containers/WebPush/Create/utils/urlValidation.js +0 -116
- package/v2Containers/WebPush/Create/utils/urlValidation.test.js +0 -449
- package/v2Containers/WebPush/actions.js +0 -60
- package/v2Containers/WebPush/constants.js +0 -108
- package/v2Containers/WebPush/index.js +0 -2
- package/v2Containers/WebPush/reducer.js +0 -104
- package/v2Containers/WebPush/sagas.js +0 -119
- package/v2Containers/WebPush/selectors.js +0 -65
- package/v2Containers/WebPush/tests/reducer.test.js +0 -863
- package/v2Containers/WebPush/tests/sagas.test.js +0 -566
- package/v2Containers/WebPush/tests/selectors.test.js +0 -960
|
@@ -1,554 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { mountWithIntl, shallowWithIntl } from '../../../../../helpers/intl-enzym-test-helpers';
|
|
3
|
-
import CapInput from '@capillarytech/cap-ui-library/CapInput';
|
|
4
|
-
import ButtonForm from '../ButtonForm';
|
|
5
|
-
import messages from '../../messages';
|
|
6
|
-
|
|
7
|
-
describe('ButtonForm', () => {
|
|
8
|
-
const mockFormatMessage = jest.fn((message) => message.defaultMessage || message);
|
|
9
|
-
const mockOnSave = jest.fn();
|
|
10
|
-
const mockOnCancel = jest.fn();
|
|
11
|
-
|
|
12
|
-
const defaultProps = {
|
|
13
|
-
buttonType: 'primary',
|
|
14
|
-
formatMessage: mockFormatMessage,
|
|
15
|
-
onSave: mockOnSave,
|
|
16
|
-
onCancel: mockOnCancel,
|
|
17
|
-
initialData: null,
|
|
18
|
-
isEditMode: false,
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
// Helper function to find CapInput by id
|
|
22
|
-
const findCapInputById = (wrapper, id) => {
|
|
23
|
-
return wrapper.find(CapInput).findWhere((node) => node.prop('id') === id).first();
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
// Helper function to find the actual input element inside CapInput
|
|
27
|
-
const findInputElement = (wrapper, id) => {
|
|
28
|
-
const capInput = findCapInputById(wrapper, id);
|
|
29
|
-
// CapInput wraps an actual input element - find it
|
|
30
|
-
return capInput.find('input').first();
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
beforeEach(() => {
|
|
34
|
-
jest.clearAllMocks();
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
describe('Rendering', () => {
|
|
38
|
-
it('should render correctly with default props', () => {
|
|
39
|
-
const wrapper = shallowWithIntl(<ButtonForm {...defaultProps} />);
|
|
40
|
-
expect(wrapper).toMatchSnapshot();
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('should render correctly for primary button type', () => {
|
|
44
|
-
const wrapper = shallowWithIntl(<ButtonForm {...defaultProps} buttonType="primary" />);
|
|
45
|
-
expect(wrapper).toMatchSnapshot();
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
it('should render correctly for secondary button type', () => {
|
|
49
|
-
const wrapper = shallowWithIntl(<ButtonForm {...defaultProps} buttonType="secondary" />);
|
|
50
|
-
expect(wrapper).toMatchSnapshot();
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it('should render correctly with initial data', () => {
|
|
54
|
-
const initialData = {
|
|
55
|
-
text: 'Click me',
|
|
56
|
-
url: 'https://example.com',
|
|
57
|
-
};
|
|
58
|
-
const wrapper = shallowWithIntl(
|
|
59
|
-
<ButtonForm {...defaultProps} initialData={initialData} />
|
|
60
|
-
);
|
|
61
|
-
expect(wrapper).toMatchSnapshot();
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it('should render correctly in edit mode', () => {
|
|
65
|
-
const wrapper = shallowWithIntl(<ButtonForm {...defaultProps} isEditMode={true} />);
|
|
66
|
-
expect(wrapper).toMatchSnapshot();
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it('should render character count suffix', () => {
|
|
70
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
71
|
-
const characterCount = wrapper.find('.button-character-count-suffix');
|
|
72
|
-
expect(characterCount.exists()).toBe(true);
|
|
73
|
-
expect(characterCount.text()).toBe('0/20');
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
describe('Button Text Input', () => {
|
|
78
|
-
it('should update button text when input changes', () => {
|
|
79
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
80
|
-
const inputElement = findInputElement(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
81
|
-
|
|
82
|
-
inputElement.simulate('change', { target: { value: 'New Button Text' } });
|
|
83
|
-
wrapper.update();
|
|
84
|
-
|
|
85
|
-
const updatedInput = findCapInputById(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
86
|
-
expect(updatedInput.prop('value')).toBe('New Button Text');
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
it('should display character count correctly', () => {
|
|
90
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
91
|
-
const inputElement = findInputElement(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
92
|
-
|
|
93
|
-
inputElement.simulate('change', { target: { value: 'Hello' } });
|
|
94
|
-
wrapper.update();
|
|
95
|
-
|
|
96
|
-
const characterCount = wrapper.find('.button-character-count-suffix');
|
|
97
|
-
expect(characterCount.text()).toBe('5/20');
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
it('should enforce max length of 20 characters', () => {
|
|
101
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
102
|
-
const textInput = findCapInputById(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
103
|
-
|
|
104
|
-
expect(textInput.prop('maxLength')).toBe(20);
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it('should show error when button text is empty', () => {
|
|
108
|
-
mockFormatMessage.mockReturnValue('Button text is required');
|
|
109
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
110
|
-
const inputElement = findInputElement(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
111
|
-
|
|
112
|
-
// Set text and then clear it
|
|
113
|
-
inputElement.simulate('change', { target: { value: 'Some text' } });
|
|
114
|
-
wrapper.update();
|
|
115
|
-
inputElement.simulate('change', { target: { value: '' } });
|
|
116
|
-
wrapper.update();
|
|
117
|
-
|
|
118
|
-
expect(mockFormatMessage).toHaveBeenCalledWith(messages.buttonTextRequired);
|
|
119
|
-
const updatedInput = findCapInputById(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
120
|
-
expect(updatedInput.prop('status')).toBe('error');
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
it('should show error when button text is only whitespace', () => {
|
|
124
|
-
mockFormatMessage.mockReturnValue('Button text is required');
|
|
125
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
126
|
-
const inputElement = findInputElement(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
127
|
-
|
|
128
|
-
inputElement.simulate('change', { target: { value: ' ' } });
|
|
129
|
-
wrapper.update();
|
|
130
|
-
|
|
131
|
-
expect(mockFormatMessage).toHaveBeenCalledWith(messages.buttonTextRequired);
|
|
132
|
-
const updatedInput = findCapInputById(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
133
|
-
expect(updatedInput.prop('status')).toBe('error');
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
it('should clear error when valid text is entered after error', () => {
|
|
137
|
-
mockFormatMessage.mockReturnValue('Button text is required');
|
|
138
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
139
|
-
const inputElement = findInputElement(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
140
|
-
|
|
141
|
-
// Trigger error
|
|
142
|
-
inputElement.simulate('change', { target: { value: '' } });
|
|
143
|
-
wrapper.update();
|
|
144
|
-
|
|
145
|
-
// Enter valid text
|
|
146
|
-
inputElement.simulate('change', { target: { value: 'Valid Text' } });
|
|
147
|
-
wrapper.update();
|
|
148
|
-
|
|
149
|
-
const updatedInput = findCapInputById(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
150
|
-
expect(updatedInput.prop('status')).toBe('');
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
describe('Button URL Input', () => {
|
|
155
|
-
it('should update button URL when input changes', () => {
|
|
156
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
157
|
-
const inputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
158
|
-
|
|
159
|
-
inputElement.simulate('change', { target: { value: 'https://example.com' } });
|
|
160
|
-
wrapper.update();
|
|
161
|
-
|
|
162
|
-
const updatedInput = findCapInputById(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
163
|
-
expect(updatedInput.prop('value')).toBe('https://example.com');
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
it('should show error when URL is empty', () => {
|
|
167
|
-
mockFormatMessage.mockReturnValue('Button URL is required');
|
|
168
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
169
|
-
const inputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
170
|
-
|
|
171
|
-
// Set URL and then clear it
|
|
172
|
-
inputElement.simulate('change', { target: { value: 'https://example.com' } });
|
|
173
|
-
wrapper.update();
|
|
174
|
-
inputElement.simulate('change', { target: { value: '' } });
|
|
175
|
-
wrapper.update();
|
|
176
|
-
|
|
177
|
-
expect(mockFormatMessage).toHaveBeenCalledWith(messages.buttonUrlRequired);
|
|
178
|
-
const updatedInput = findCapInputById(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
179
|
-
expect(updatedInput.prop('status')).toBe('error');
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
it('should show error when URL is only whitespace', () => {
|
|
183
|
-
mockFormatMessage.mockReturnValue('Button URL is required');
|
|
184
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
185
|
-
const inputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
186
|
-
|
|
187
|
-
inputElement.simulate('change', { target: { value: ' ' } });
|
|
188
|
-
wrapper.update();
|
|
189
|
-
|
|
190
|
-
expect(mockFormatMessage).toHaveBeenCalledWith(messages.buttonUrlRequired);
|
|
191
|
-
const updatedInput = findCapInputById(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
192
|
-
expect(updatedInput.prop('status')).toBe('error');
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
it('should show error when URL is invalid', () => {
|
|
196
|
-
mockFormatMessage.mockReturnValue('Please enter a valid URL');
|
|
197
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
198
|
-
const inputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
199
|
-
|
|
200
|
-
inputElement.simulate('change', { target: { value: 'not-a-valid-url' } });
|
|
201
|
-
wrapper.update();
|
|
202
|
-
|
|
203
|
-
expect(mockFormatMessage).toHaveBeenCalledWith(messages.buttonUrlInvalid);
|
|
204
|
-
const updatedInput = findCapInputById(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
205
|
-
expect(updatedInput.prop('status')).toBe('error');
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
it('should show error when URL lacks TLD (e.g., https://google)', () => {
|
|
209
|
-
mockFormatMessage.mockReturnValue('Please enter a valid URL');
|
|
210
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
211
|
-
const inputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
212
|
-
|
|
213
|
-
inputElement.simulate('change', { target: { value: 'https://google' } });
|
|
214
|
-
wrapper.update();
|
|
215
|
-
|
|
216
|
-
expect(mockFormatMessage).toHaveBeenCalledWith(messages.buttonUrlInvalid);
|
|
217
|
-
const updatedInput = findCapInputById(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
218
|
-
expect(updatedInput.prop('status')).toBe('error');
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
it('should accept valid HTTP URL', () => {
|
|
222
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
223
|
-
const inputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
224
|
-
|
|
225
|
-
inputElement.simulate('change', { target: { value: 'http://example.com' } });
|
|
226
|
-
wrapper.update();
|
|
227
|
-
|
|
228
|
-
const updatedInput = findCapInputById(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
229
|
-
expect(updatedInput.prop('status')).toBe('');
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
it('should accept valid HTTPS URL', () => {
|
|
233
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
234
|
-
const inputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
235
|
-
|
|
236
|
-
inputElement.simulate('change', { target: { value: 'https://example.com' } });
|
|
237
|
-
wrapper.update();
|
|
238
|
-
|
|
239
|
-
const updatedInput = findCapInputById(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
240
|
-
expect(updatedInput.prop('status')).toBe('');
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
it('should accept valid URL with www', () => {
|
|
244
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
245
|
-
const inputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
246
|
-
|
|
247
|
-
inputElement.simulate('change', { target: { value: 'https://www.example.com' } });
|
|
248
|
-
wrapper.update();
|
|
249
|
-
|
|
250
|
-
const updatedInput = findCapInputById(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
251
|
-
expect(updatedInput.prop('status')).toBe('');
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
it('should accept valid URL with path and query parameters', () => {
|
|
255
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
256
|
-
const inputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
257
|
-
|
|
258
|
-
inputElement.simulate('change', {
|
|
259
|
-
target: { value: 'https://example.com/path?param=value&other=123' },
|
|
260
|
-
});
|
|
261
|
-
wrapper.update();
|
|
262
|
-
|
|
263
|
-
const updatedInput = findCapInputById(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
264
|
-
expect(updatedInput.prop('status')).toBe('');
|
|
265
|
-
});
|
|
266
|
-
|
|
267
|
-
it('should accept valid URL with long gTLD (.company)', () => {
|
|
268
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
269
|
-
const inputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
270
|
-
|
|
271
|
-
inputElement.simulate('change', { target: { value: 'https://example.company' } });
|
|
272
|
-
wrapper.update();
|
|
273
|
-
|
|
274
|
-
const updatedInput = findCapInputById(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
275
|
-
expect(updatedInput.prop('status')).toBe('');
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
it('should accept valid URL with long gTLD (.technology)', () => {
|
|
279
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
280
|
-
const inputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
281
|
-
|
|
282
|
-
inputElement.simulate('change', { target: { value: 'https://example.technology' } });
|
|
283
|
-
wrapper.update();
|
|
284
|
-
|
|
285
|
-
const updatedInput = findCapInputById(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
286
|
-
expect(updatedInput.prop('status')).toBe('');
|
|
287
|
-
});
|
|
288
|
-
|
|
289
|
-
it('should accept valid URL with long gTLD (.international)', () => {
|
|
290
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
291
|
-
const inputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
292
|
-
|
|
293
|
-
inputElement.simulate('change', { target: { value: 'https://example.international' } });
|
|
294
|
-
wrapper.update();
|
|
295
|
-
|
|
296
|
-
const updatedInput = findCapInputById(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
297
|
-
expect(updatedInput.prop('status')).toBe('');
|
|
298
|
-
});
|
|
299
|
-
|
|
300
|
-
it('should accept valid URL with long gTLD and www prefix', () => {
|
|
301
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
302
|
-
const inputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
303
|
-
|
|
304
|
-
inputElement.simulate('change', { target: { value: 'https://www.example.company' } });
|
|
305
|
-
wrapper.update();
|
|
306
|
-
|
|
307
|
-
const updatedInput = findCapInputById(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
308
|
-
expect(updatedInput.prop('status')).toBe('');
|
|
309
|
-
});
|
|
310
|
-
|
|
311
|
-
it('should accept valid URL with long gTLD and path', () => {
|
|
312
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
313
|
-
const inputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
314
|
-
|
|
315
|
-
inputElement.simulate('change', { target: { value: 'https://example.technology/path/to/page' } });
|
|
316
|
-
wrapper.update();
|
|
317
|
-
|
|
318
|
-
const updatedInput = findCapInputById(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
319
|
-
expect(updatedInput.prop('status')).toBe('');
|
|
320
|
-
});
|
|
321
|
-
|
|
322
|
-
it('should clear error when valid URL is entered after error', () => {
|
|
323
|
-
mockFormatMessage.mockReturnValue('Please enter a valid URL');
|
|
324
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
325
|
-
const inputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
326
|
-
|
|
327
|
-
// Trigger error with invalid URL
|
|
328
|
-
inputElement.simulate('change', { target: { value: 'invalid-url' } });
|
|
329
|
-
wrapper.update();
|
|
330
|
-
|
|
331
|
-
// Enter valid URL
|
|
332
|
-
inputElement.simulate('change', { target: { value: 'https://example.com' } });
|
|
333
|
-
wrapper.update();
|
|
334
|
-
|
|
335
|
-
const updatedInput = findCapInputById(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
336
|
-
expect(updatedInput.prop('status')).toBe('');
|
|
337
|
-
});
|
|
338
|
-
});
|
|
339
|
-
|
|
340
|
-
describe('Save Button', () => {
|
|
341
|
-
it('should be disabled when button text is empty', () => {
|
|
342
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
343
|
-
const saveButton = wrapper.find('.button-form-save').find('CapButton').first();
|
|
344
|
-
|
|
345
|
-
expect(saveButton.prop('disabled')).toBe(true);
|
|
346
|
-
});
|
|
347
|
-
|
|
348
|
-
it('should be disabled when button URL is empty', () => {
|
|
349
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
350
|
-
const inputElement = findInputElement(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
351
|
-
const saveButton = wrapper.find('.button-form-save').find('CapButton').first();
|
|
352
|
-
|
|
353
|
-
inputElement.simulate('change', { target: { value: 'Button Text' } });
|
|
354
|
-
wrapper.update();
|
|
355
|
-
|
|
356
|
-
expect(saveButton.prop('disabled')).toBe(true);
|
|
357
|
-
});
|
|
358
|
-
|
|
359
|
-
it('should be disabled when button text has error', () => {
|
|
360
|
-
mockFormatMessage.mockReturnValue('Button text is required');
|
|
361
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
362
|
-
const textInputElement = findInputElement(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
363
|
-
const urlInputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
364
|
-
const saveButton = wrapper.find('.button-form-save').find('CapButton').first();
|
|
365
|
-
|
|
366
|
-
urlInputElement.simulate('change', { target: { value: 'https://example.com' } });
|
|
367
|
-
textInputElement.simulate('change', { target: { value: '' } });
|
|
368
|
-
wrapper.update();
|
|
369
|
-
|
|
370
|
-
expect(saveButton.prop('disabled')).toBe(true);
|
|
371
|
-
});
|
|
372
|
-
|
|
373
|
-
it('should be disabled when button URL has error', () => {
|
|
374
|
-
mockFormatMessage.mockReturnValue('Please enter a valid URL');
|
|
375
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
376
|
-
const textInputElement = findInputElement(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
377
|
-
const urlInputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
378
|
-
const saveButton = wrapper.find('.button-form-save').find('CapButton').first();
|
|
379
|
-
|
|
380
|
-
textInputElement.simulate('change', { target: { value: 'Button Text' } });
|
|
381
|
-
urlInputElement.simulate('change', { target: { value: 'invalid-url' } });
|
|
382
|
-
wrapper.update();
|
|
383
|
-
|
|
384
|
-
expect(saveButton.prop('disabled')).toBe(true);
|
|
385
|
-
});
|
|
386
|
-
|
|
387
|
-
it('should be enabled when both text and URL are valid', () => {
|
|
388
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
389
|
-
const textInputElement = findInputElement(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
390
|
-
const urlInputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
391
|
-
|
|
392
|
-
textInputElement.simulate('change', { target: { value: 'Button Text' } });
|
|
393
|
-
urlInputElement.simulate('change', { target: { value: 'https://example.com' } });
|
|
394
|
-
wrapper.update();
|
|
395
|
-
|
|
396
|
-
// Re-find the save button after state updates to get fresh props
|
|
397
|
-
const saveButton = wrapper.find('.button-form-save').find('CapButton').first();
|
|
398
|
-
// CapButton may return empty string or false when disabled is false, so check for falsiness
|
|
399
|
-
expect(saveButton.prop('disabled')).toBeFalsy();
|
|
400
|
-
});
|
|
401
|
-
|
|
402
|
-
it('should call onSave with trimmed values when save is clicked', () => {
|
|
403
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
404
|
-
const textInputElement = findInputElement(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
405
|
-
const urlInputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
406
|
-
|
|
407
|
-
textInputElement.simulate('change', { target: { value: ' Button Text ' } });
|
|
408
|
-
urlInputElement.simulate('change', { target: { value: ' https://example.com ' } });
|
|
409
|
-
wrapper.update();
|
|
410
|
-
|
|
411
|
-
// Re-find the save button after state updates to get fresh props
|
|
412
|
-
const saveButton = wrapper.find('.button-form-save').find('CapButton').first();
|
|
413
|
-
saveButton.prop('onClick')();
|
|
414
|
-
|
|
415
|
-
expect(mockOnSave).toHaveBeenCalledWith({
|
|
416
|
-
text: 'Button Text',
|
|
417
|
-
url: 'https://example.com',
|
|
418
|
-
type: 'primary',
|
|
419
|
-
});
|
|
420
|
-
});
|
|
421
|
-
|
|
422
|
-
it('should not call onSave when validation fails', () => {
|
|
423
|
-
mockFormatMessage.mockReturnValue('Button text is required');
|
|
424
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
425
|
-
const textInputElement = findInputElement(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
426
|
-
const urlInputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
427
|
-
const saveButton = wrapper.find('.button-form-save').find('CapButton').first();
|
|
428
|
-
|
|
429
|
-
textInputElement.simulate('change', { target: { value: '' } });
|
|
430
|
-
urlInputElement.simulate('change', { target: { value: 'https://example.com' } });
|
|
431
|
-
wrapper.update();
|
|
432
|
-
|
|
433
|
-
// Save button should be disabled, so clicking it won't trigger onSave
|
|
434
|
-
// Even if we simulate the click, validation should prevent onSave from being called
|
|
435
|
-
expect(saveButton.prop('disabled')).toBe(true);
|
|
436
|
-
expect(mockOnSave).not.toHaveBeenCalled();
|
|
437
|
-
});
|
|
438
|
-
|
|
439
|
-
it('should trigger save on Enter key when form is valid', () => {
|
|
440
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
441
|
-
const textInputElement = findInputElement(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
442
|
-
const urlInputElement = findInputElement(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
443
|
-
const form = wrapper.find('.webpush-button-form').hostNodes().first();
|
|
444
|
-
|
|
445
|
-
textInputElement.simulate('change', { target: { value: 'Button Text' } });
|
|
446
|
-
urlInputElement.simulate('change', { target: { value: 'https://example.com' } });
|
|
447
|
-
wrapper.update();
|
|
448
|
-
|
|
449
|
-
form.simulate('keyDown', { key: 'Enter' });
|
|
450
|
-
|
|
451
|
-
expect(mockOnSave).toHaveBeenCalledWith({
|
|
452
|
-
text: 'Button Text',
|
|
453
|
-
url: 'https://example.com',
|
|
454
|
-
type: 'primary',
|
|
455
|
-
});
|
|
456
|
-
});
|
|
457
|
-
|
|
458
|
-
it('should not trigger save on Enter key when form is invalid', () => {
|
|
459
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
460
|
-
const form = wrapper.find('.webpush-button-form').hostNodes().first();
|
|
461
|
-
|
|
462
|
-
form.simulate('keyDown', { key: 'Enter' });
|
|
463
|
-
|
|
464
|
-
expect(mockOnSave).not.toHaveBeenCalled();
|
|
465
|
-
});
|
|
466
|
-
});
|
|
467
|
-
|
|
468
|
-
describe('Cancel Button', () => {
|
|
469
|
-
it('should call onCancel when cancel button is clicked', () => {
|
|
470
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
471
|
-
const cancelButton = wrapper.find('.button-form-cancel').find('CapButton').first();
|
|
472
|
-
|
|
473
|
-
cancelButton.prop('onClick')();
|
|
474
|
-
|
|
475
|
-
expect(mockOnCancel).toHaveBeenCalled();
|
|
476
|
-
});
|
|
477
|
-
|
|
478
|
-
it('should show "Delete" text when not in edit mode', () => {
|
|
479
|
-
const wrapper = shallowWithIntl(<ButtonForm {...defaultProps} isEditMode={false} />);
|
|
480
|
-
expect(wrapper).toMatchSnapshot();
|
|
481
|
-
});
|
|
482
|
-
|
|
483
|
-
it('should show "Cancel" text when in edit mode', () => {
|
|
484
|
-
const wrapper = shallowWithIntl(<ButtonForm {...defaultProps} isEditMode={true} />);
|
|
485
|
-
expect(wrapper).toMatchSnapshot();
|
|
486
|
-
});
|
|
487
|
-
});
|
|
488
|
-
|
|
489
|
-
describe('Initial Data', () => {
|
|
490
|
-
it('should initialize with provided button text', () => {
|
|
491
|
-
const initialData = {
|
|
492
|
-
text: 'Initial Text',
|
|
493
|
-
url: 'https://initial.com',
|
|
494
|
-
};
|
|
495
|
-
const wrapper = mountWithIntl(
|
|
496
|
-
<ButtonForm {...defaultProps} initialData={initialData} />
|
|
497
|
-
);
|
|
498
|
-
const textInput = findCapInputById(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
499
|
-
|
|
500
|
-
expect(textInput.prop('value')).toBe('Initial Text');
|
|
501
|
-
});
|
|
502
|
-
|
|
503
|
-
it('should initialize with provided button URL', () => {
|
|
504
|
-
const initialData = {
|
|
505
|
-
text: 'Initial Text',
|
|
506
|
-
url: 'https://initial.com',
|
|
507
|
-
};
|
|
508
|
-
const wrapper = mountWithIntl(
|
|
509
|
-
<ButtonForm {...defaultProps} initialData={initialData} />
|
|
510
|
-
);
|
|
511
|
-
const urlInput = findCapInputById(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
512
|
-
|
|
513
|
-
expect(urlInput.prop('value')).toBe('https://initial.com');
|
|
514
|
-
});
|
|
515
|
-
|
|
516
|
-
it('should handle empty initial data', () => {
|
|
517
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} initialData={null} />);
|
|
518
|
-
const textInput = findCapInputById(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
519
|
-
const urlInput = findCapInputById(wrapper, `webpush-button-url-input-${defaultProps.buttonType}`);
|
|
520
|
-
|
|
521
|
-
expect(textInput.prop('value')).toBe('');
|
|
522
|
-
expect(urlInput.prop('value')).toBe('');
|
|
523
|
-
});
|
|
524
|
-
});
|
|
525
|
-
|
|
526
|
-
describe('Max Length', () => {
|
|
527
|
-
it('should display correct character count at max length', () => {
|
|
528
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
529
|
-
const inputElement = findInputElement(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
530
|
-
|
|
531
|
-
const maxLengthText = 'A'.repeat(20);
|
|
532
|
-
inputElement.simulate('change', { target: { value: maxLengthText } });
|
|
533
|
-
wrapper.update();
|
|
534
|
-
|
|
535
|
-
const characterCount = wrapper.find('.button-character-count-suffix');
|
|
536
|
-
expect(characterCount.text()).toBe('20/20');
|
|
537
|
-
});
|
|
538
|
-
|
|
539
|
-
it('should prevent input beyond max length', () => {
|
|
540
|
-
const wrapper = mountWithIntl(<ButtonForm {...defaultProps} />);
|
|
541
|
-
const textInput = findCapInputById(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
542
|
-
const inputElement = findInputElement(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
543
|
-
|
|
544
|
-
expect(textInput.prop('maxLength')).toBe(20);
|
|
545
|
-
|
|
546
|
-
const maxLengthText = 'A'.repeat(20);
|
|
547
|
-
inputElement.simulate('change', { target: { value: maxLengthText } });
|
|
548
|
-
wrapper.update();
|
|
549
|
-
|
|
550
|
-
const updatedInput = findCapInputById(wrapper, `webpush-button-text-input-${defaultProps.buttonType}`);
|
|
551
|
-
expect(updatedInput.prop('value').length).toBe(20);
|
|
552
|
-
});
|
|
553
|
-
});
|
|
554
|
-
});
|