@capillarytech/creatives-library 8.0.345-alpha.15 → 8.0.345-alpha.16
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/constants/unified.js +0 -29
- package/package.json +1 -1
- package/services/tests/api.test.js +0 -13
- package/utils/commonUtils.js +1 -19
- package/v2Components/CapActionButton/constants.js +0 -7
- package/v2Components/CapActionButton/index.js +109 -167
- package/v2Components/CapActionButton/index.scss +6 -157
- package/v2Components/CapActionButton/messages.js +3 -19
- package/v2Components/CapActionButton/tests/index.test.js +17 -41
- package/v2Components/CapTagList/index.js +0 -10
- package/v2Components/CommonTestAndPreview/CustomValuesEditor.js +49 -70
- package/v2Components/CommonTestAndPreview/DeliverySettings/DeliverySettings.scss +2 -8
- package/v2Components/CommonTestAndPreview/DeliverySettings/ModifyDeliverySettings.js +21 -207
- package/v2Components/CommonTestAndPreview/DeliverySettings/constants.js +0 -16
- package/v2Components/CommonTestAndPreview/DeliverySettings/index.js +10 -85
- package/v2Components/CommonTestAndPreview/DeliverySettings/messages.js +0 -30
- package/v2Components/CommonTestAndPreview/DeliverySettings/utils/parseSenderDetailsResponse.js +11 -79
- package/v2Components/CommonTestAndPreview/SendTestMessage.js +5 -10
- package/v2Components/CommonTestAndPreview/UnifiedPreview/RcsPreviewContent.js +15 -160
- package/v2Components/CommonTestAndPreview/UnifiedPreview/_unifiedPreview.scss +76 -341
- package/v2Components/CommonTestAndPreview/UnifiedPreview/index.js +4 -133
- package/v2Components/CommonTestAndPreview/_commonTestAndPreview.scss +0 -11
- package/v2Components/CommonTestAndPreview/constants.js +2 -38
- package/v2Components/CommonTestAndPreview/index.js +186 -676
- package/v2Components/CommonTestAndPreview/messages.js +3 -49
- package/v2Components/CommonTestAndPreview/sagas.js +6 -15
- package/v2Components/CommonTestAndPreview/tests/CustomValuesEditor.test.js +284 -308
- package/v2Components/CommonTestAndPreview/tests/DeliverySettings/ModifyDeliverySettings.test.js +65 -231
- package/v2Components/CommonTestAndPreview/tests/DeliverySettings/index.test.js +5 -118
- package/v2Components/CommonTestAndPreview/tests/DeliverySettings/utils/parseSenderDetailsResponse.test.js +0 -341
- package/v2Components/CommonTestAndPreview/tests/PreviewSection.test.js +1 -8
- package/v2Components/CommonTestAndPreview/tests/SendTestMessage.test.js +13 -34
- package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/RcsPreviewContent.test.js +283 -281
- package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/index.test.js +1 -199
- package/v2Components/CommonTestAndPreview/tests/index.test.js +4 -132
- package/v2Components/CommonTestAndPreview/tests/sagas.test.js +2 -2
- package/v2Components/FormBuilder/index.js +10 -8
- package/v2Components/TemplatePreview/_templatePreview.scss +23 -33
- package/v2Components/TemplatePreview/index.js +28 -143
- package/v2Components/TemplatePreview/tests/index.test.js +0 -142
- package/v2Components/TestAndPreviewSlidebox/index.js +1 -13
- package/v2Components/TestAndPreviewSlidebox/sagas.js +4 -11
- package/v2Components/TestAndPreviewSlidebox/tests/saga.test.js +1 -3
- package/v2Containers/CreativesContainer/SlideBoxContent.js +4 -36
- package/v2Containers/CreativesContainer/SlideBoxFooter.js +1 -10
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +4 -29
- package/v2Containers/CreativesContainer/constants.js +0 -9
- package/v2Containers/CreativesContainer/index.js +103 -300
- package/v2Containers/CreativesContainer/index.scss +1 -51
- package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +34 -78
- package/v2Containers/CreativesContainer/tests/SlideBoxHeader.test.js +16 -79
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +0 -8
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxHeader.test.js.snap +98 -357
- package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +15 -20
- package/v2Containers/CreativesContainer/tests/index.test.js +9 -71
- package/v2Containers/Email/reducer.js +12 -3
- package/v2Containers/Email/sagas.js +9 -4
- package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +4 -0
- package/v2Containers/Email/tests/reducer.test.js +47 -0
- package/v2Containers/Email/tests/sagas.test.js +146 -6
- package/v2Containers/Rcs/constants.js +8 -119
- package/v2Containers/Rcs/index.js +811 -2383
- package/v2Containers/Rcs/index.scss +6 -276
- package/v2Containers/Rcs/messages.js +3 -38
- package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +70073 -98018
- package/v2Containers/Rcs/tests/__snapshots__/utils.test.js.snap +5 -0
- package/v2Containers/Rcs/tests/index.test.js +121 -152
- package/v2Containers/Rcs/tests/mockData.js +0 -38
- package/v2Containers/Rcs/tests/utils.test.js +30 -646
- package/v2Containers/Rcs/utils.js +11 -478
- package/v2Containers/Sms/Create/index.js +40 -100
- package/v2Containers/SmsTrai/Create/index.js +4 -9
- package/v2Containers/SmsTrai/Edit/constants.js +0 -2
- package/v2Containers/SmsTrai/Edit/index.js +130 -636
- package/v2Containers/SmsTrai/Edit/messages.js +4 -14
- package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +2296 -4249
- package/v2Containers/SmsWrapper/index.js +8 -37
- package/v2Containers/TagList/index.js +0 -6
- package/v2Containers/Templates/_templates.scss +2 -163
- package/v2Containers/Templates/actions.js +0 -11
- package/v2Containers/Templates/constants.js +0 -2
- package/v2Containers/Templates/index.js +54 -119
- package/v2Containers/Templates/sagas.js +12 -57
- package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +1079 -1043
- package/v2Containers/Templates/tests/sagas.test.js +123 -193
- package/v2Containers/TemplatesV2/TemplatesV2.style.js +1 -72
- package/v2Containers/TemplatesV2/index.js +23 -86
- package/v2Containers/Whatsapp/index.js +20 -3
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +34 -578
- package/utils/rcsPayloadUtils.js +0 -92
- package/utils/templateVarUtils.js +0 -201
- package/utils/tests/templateVarUtils.test.js +0 -204
- package/v2Components/CommonTestAndPreview/UnifiedPreview/RcsPreviewContent.js.rej +0 -18
- package/v2Components/CommonTestAndPreview/previewApiUtils.js +0 -59
- package/v2Components/CommonTestAndPreview/tests/previewApiUtils.test.js +0 -67
- package/v2Components/SmsFallback/SmsFallbackLocalSelector.js +0 -87
- package/v2Components/SmsFallback/constants.js +0 -73
- package/v2Components/SmsFallback/index.js +0 -955
- package/v2Components/SmsFallback/index.scss +0 -265
- package/v2Components/SmsFallback/messages.js +0 -78
- package/v2Components/SmsFallback/smsFallbackUtils.js +0 -118
- package/v2Components/SmsFallback/tests/SmsFallbackLocalSelector.test.js +0 -50
- package/v2Components/SmsFallback/tests/rcsSmsFallback.acceptance.test.js +0 -147
- package/v2Components/SmsFallback/tests/smsFallbackHandlers.test.js +0 -304
- package/v2Components/SmsFallback/tests/smsFallbackUi.test.js +0 -197
- package/v2Components/SmsFallback/tests/smsFallbackUtils.test.js +0 -277
- package/v2Components/SmsFallback/tests/useLocalTemplateList.test.js +0 -422
- package/v2Components/SmsFallback/useLocalTemplateList.js +0 -92
- package/v2Components/TemplatePreview/constants.js +0 -2
- package/v2Components/VarSegmentMessageEditor/constants.js +0 -2
- package/v2Components/VarSegmentMessageEditor/index.js +0 -125
- package/v2Components/VarSegmentMessageEditor/index.scss +0 -46
- package/v2Containers/CreativesContainer/CreativesSlideBoxWrapper.js +0 -43
- package/v2Containers/CreativesContainer/embeddedSlideboxUtils.js +0 -67
- package/v2Containers/CreativesContainer/tests/SlideBoxContent.localTemplates.test.js +0 -90
- package/v2Containers/CreativesContainer/tests/embeddedSlideboxUtils.test.js +0 -258
- package/v2Containers/CreativesContainer/tests/useLocalTemplatesProp.test.js +0 -125
- package/v2Containers/Rcs/index.js.rej +0 -1336
- package/v2Containers/Rcs/index.scss.rej +0 -74
- package/v2Containers/Rcs/rcsLibraryHydrationUtils.js +0 -225
- package/v2Containers/Rcs/tests/__snapshots__/utils.test.js.snap.rej +0 -128
- package/v2Containers/Rcs/tests/rcsLibraryHydrationUtils.test.js +0 -318
- package/v2Containers/Sms/smsFormDataHelpers.js +0 -67
- package/v2Containers/Sms/tests/smsFormDataHelpers.test.js +0 -253
- package/v2Containers/SmsTrai/Edit/index.scss +0 -121
- package/v2Containers/Templates/TemplatesActionBar.js +0 -101
- package/v2Containers/Templates/tests/TemplatesActionBar.test.js +0 -120
- package/v2Containers/Templates/tests/smsTemplatesListApi.test.js +0 -180
- package/v2Containers/Templates/utils/smsTemplatesListApi.js +0 -79
- package/v2Containers/TemplatesV2/tests/TemplatesV2.localTemplates.test.js +0 -131
|
@@ -1,95 +1,83 @@
|
|
|
1
1
|
/**
|
|
2
|
+
* Tests for CustomValuesEditor component.
|
|
3
|
+
* Covers: loading state, values-missing warning, JSON view, tag table, discard/update buttons.
|
|
2
4
|
* @jest-environment jsdom
|
|
3
5
|
*/
|
|
6
|
+
|
|
4
7
|
import React from 'react';
|
|
5
8
|
import { render, screen, fireEvent } from '@testing-library/react';
|
|
6
|
-
import '@testing-library/jest-dom';
|
|
7
9
|
import { IntlProvider } from 'react-intl';
|
|
8
10
|
import PropTypes from 'prop-types';
|
|
9
|
-
import CustomValuesEditor from '../CustomValuesEditor';
|
|
10
11
|
|
|
11
|
-
jest.mock('@capillarytech/cap-ui-library/CapRow', () => {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
jest.mock('@capillarytech/cap-ui-library/
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
placeholder: props?.placeholder,
|
|
53
|
-
onChange: props?.onChange,
|
|
54
|
-
});
|
|
55
|
-
};
|
|
56
|
-
});
|
|
57
|
-
jest.mock('@capillarytech/cap-ui-library/CapLabel', () => {
|
|
58
|
-
const React = require('react');
|
|
59
|
-
return function CapLabel(props) {
|
|
60
|
-
return React.createElement('div', { className: props?.className, 'data-testid': 'cap-label' }, props?.children);
|
|
61
|
-
};
|
|
62
|
-
});
|
|
12
|
+
jest.mock('@capillarytech/cap-ui-library/CapRow', () => ({ children, className }) => (
|
|
13
|
+
<div className={className}>{children}</div>
|
|
14
|
+
));
|
|
15
|
+
jest.mock('@capillarytech/cap-ui-library/CapSpin', () => ({ size }) => (
|
|
16
|
+
<div data-testid="cap-spin" data-size={size}>Loading...</div>
|
|
17
|
+
));
|
|
18
|
+
jest.mock('@capillarytech/cap-ui-library/CapSwitch', () => ({ checked, onChange }) => (
|
|
19
|
+
<button
|
|
20
|
+
type="button"
|
|
21
|
+
data-testid="cap-switch"
|
|
22
|
+
aria-checked={String(checked)}
|
|
23
|
+
onClick={() => onChange(!checked)}
|
|
24
|
+
>
|
|
25
|
+
Toggle
|
|
26
|
+
</button>
|
|
27
|
+
));
|
|
28
|
+
jest.mock('@capillarytech/cap-ui-library/CapButton', () => ({ children, onClick, disabled, loading, type: btnType, icon }) => (
|
|
29
|
+
<button
|
|
30
|
+
type="button"
|
|
31
|
+
data-testid="cap-button"
|
|
32
|
+
data-btntype={btnType}
|
|
33
|
+
data-icon={icon}
|
|
34
|
+
onClick={onClick}
|
|
35
|
+
disabled={!!(disabled || loading)}
|
|
36
|
+
>
|
|
37
|
+
{children}
|
|
38
|
+
</button>
|
|
39
|
+
));
|
|
40
|
+
jest.mock('@capillarytech/cap-ui-library/CapInput', () => ({ value, onChange, placeholder, isRequired, className }) => (
|
|
41
|
+
<input
|
|
42
|
+
data-testid="cap-input"
|
|
43
|
+
className={className}
|
|
44
|
+
value={value || ''}
|
|
45
|
+
onChange={onChange}
|
|
46
|
+
placeholder={placeholder}
|
|
47
|
+
required={!!isRequired}
|
|
48
|
+
/>
|
|
49
|
+
));
|
|
50
|
+
jest.mock('@capillarytech/cap-ui-library/CapLabel', () => ({ children, type, className }) => (
|
|
51
|
+
<span data-testid="cap-label" data-type={type} className={className}>{children}</span>
|
|
52
|
+
));
|
|
63
53
|
|
|
64
|
-
|
|
54
|
+
import CustomValuesEditor from '../CustomValuesEditor';
|
|
65
55
|
|
|
66
|
-
const
|
|
56
|
+
const defaultProps = {
|
|
67
57
|
isExtractingTags: false,
|
|
68
58
|
isUpdatePreviewDisabled: false,
|
|
69
59
|
showJSON: false,
|
|
70
60
|
setShowJSON: jest.fn(),
|
|
71
|
-
customValues: { '
|
|
61
|
+
customValues: { '{{customer.name}}': 'Alice', '{{customer.email}}': '' },
|
|
72
62
|
handleJSONTextChange: jest.fn(),
|
|
73
|
-
|
|
74
|
-
{
|
|
75
|
-
|
|
76
|
-
title: 'Section A',
|
|
77
|
-
requiredTags: [{ fullPath: 'tag.a', name: 'a' }],
|
|
78
|
-
optionalTags: [{ fullPath: 'tag.b', name: 'b' }],
|
|
79
|
-
},
|
|
63
|
+
extractedTags: [
|
|
64
|
+
{ fullPath: '{{customer.name}}' },
|
|
65
|
+
{ fullPath: '{{customer.email}}' },
|
|
80
66
|
],
|
|
67
|
+
requiredTags: [{ fullPath: '{{customer.name}}' }],
|
|
68
|
+
optionalTags: [{ fullPath: '{{customer.email}}' }],
|
|
81
69
|
handleCustomValueChange: jest.fn(),
|
|
82
70
|
handleDiscardCustomValues: jest.fn(),
|
|
83
71
|
handleUpdatePreview: jest.fn(),
|
|
84
72
|
isUpdatingPreview: false,
|
|
85
|
-
formatMessage,
|
|
73
|
+
formatMessage: jest.fn((msg) => msg.defaultMessage || msg.id),
|
|
86
74
|
};
|
|
87
75
|
|
|
88
76
|
// IntlProvider wrapper for incoming tests
|
|
89
77
|
const scope = 'app.v2Components.TestAndPreviewSlidebox';
|
|
90
78
|
const mockMessages = {
|
|
91
79
|
[`${scope}.extractingTags`]: 'Extracting tags...',
|
|
92
|
-
[`${scope}.valuesMissing`]: '
|
|
80
|
+
[`${scope}.valuesMissing`]: 'Values missing for some of the personalization tags',
|
|
93
81
|
[`${scope}.showJSON`]: 'Show JSON',
|
|
94
82
|
[`${scope}.personalizationTags`]: 'Personalization Tags',
|
|
95
83
|
[`${scope}.customValues`]: 'Custom Values',
|
|
@@ -109,268 +97,256 @@ TestWrapper.propTypes = {
|
|
|
109
97
|
};
|
|
110
98
|
|
|
111
99
|
describe('CustomValuesEditor', () => {
|
|
112
|
-
beforeEach(() =>
|
|
113
|
-
jest.clearAllMocks();
|
|
114
|
-
});
|
|
100
|
+
beforeEach(() => jest.clearAllMocks());
|
|
115
101
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
<
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
102
|
+
describe('loading state (isExtractingTags)', () => {
|
|
103
|
+
it('renders a spinner and extracting-tags message when isExtractingTags is true', () => {
|
|
104
|
+
render(
|
|
105
|
+
<TestWrapper>
|
|
106
|
+
<CustomValuesEditor {...defaultProps} isExtractingTags />
|
|
107
|
+
</TestWrapper>
|
|
108
|
+
);
|
|
109
|
+
expect(screen.getByTestId('cap-spin')).toBeTruthy();
|
|
110
|
+
expect(screen.getByText('Extracting tags...')).toBeTruthy();
|
|
111
|
+
});
|
|
124
112
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
113
|
+
it('does not render the editor toggle when extracting tags', () => {
|
|
114
|
+
render(
|
|
115
|
+
<TestWrapper>
|
|
116
|
+
<CustomValuesEditor {...defaultProps} isExtractingTags />
|
|
117
|
+
</TestWrapper>
|
|
118
|
+
);
|
|
119
|
+
expect(screen.queryByTestId('cap-switch')).toBeNull();
|
|
120
|
+
expect(screen.queryAllByTestId('cap-button')).toHaveLength(0);
|
|
121
|
+
});
|
|
133
122
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
123
|
+
it('renders the editor (not spinner) when isExtractingTags is false', () => {
|
|
124
|
+
render(
|
|
125
|
+
<TestWrapper>
|
|
126
|
+
<CustomValuesEditor {...defaultProps} isExtractingTags={false} />
|
|
127
|
+
</TestWrapper>
|
|
128
|
+
);
|
|
129
|
+
expect(screen.queryByTestId('cap-spin')).toBeNull();
|
|
130
|
+
expect(screen.getByTestId('cap-switch')).toBeTruthy();
|
|
131
|
+
});
|
|
143
132
|
});
|
|
144
133
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
<
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
expect(baseProps.handleJSONTextChange).toHaveBeenCalledWith('{}');
|
|
155
|
-
});
|
|
134
|
+
describe('values missing warning', () => {
|
|
135
|
+
it('shows values-missing label when isUpdatePreviewDisabled is true', () => {
|
|
136
|
+
render(
|
|
137
|
+
<TestWrapper>
|
|
138
|
+
<CustomValuesEditor {...defaultProps} isUpdatePreviewDisabled />
|
|
139
|
+
</TestWrapper>
|
|
140
|
+
);
|
|
141
|
+
expect(screen.getByText('Values missing for some of the personalization tags')).toBeTruthy();
|
|
142
|
+
});
|
|
156
143
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
144
|
+
it('does not show values-missing label when isUpdatePreviewDisabled is false', () => {
|
|
145
|
+
render(
|
|
146
|
+
<TestWrapper>
|
|
147
|
+
<CustomValuesEditor {...defaultProps} isUpdatePreviewDisabled={false} />
|
|
148
|
+
</TestWrapper>
|
|
149
|
+
);
|
|
150
|
+
expect(
|
|
151
|
+
screen.queryByText('Values missing for some of the personalization tags')
|
|
152
|
+
).toBeNull();
|
|
153
|
+
});
|
|
167
154
|
});
|
|
168
155
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
156
|
+
describe('JSON view (showJSON = true)', () => {
|
|
157
|
+
it('renders a textarea with the formatted JSON', () => {
|
|
158
|
+
const customValues = { name: 'Alice', age: 30 };
|
|
159
|
+
render(
|
|
160
|
+
<TestWrapper>
|
|
161
|
+
<CustomValuesEditor {...defaultProps} showJSON customValues={customValues} />
|
|
162
|
+
</TestWrapper>
|
|
163
|
+
);
|
|
164
|
+
const textarea = document.querySelector('textarea.json-textarea');
|
|
165
|
+
expect(textarea).toBeTruthy();
|
|
166
|
+
expect(textarea.value).toBe(JSON.stringify(customValues, null, 2));
|
|
167
|
+
});
|
|
181
168
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
<
|
|
186
|
-
{...
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
);
|
|
194
|
-
expect(screen.getAllByTestId('tag-input').length).toBeGreaterThan(0);
|
|
195
|
-
});
|
|
169
|
+
it('renders line numbers matching the number of JSON lines', () => {
|
|
170
|
+
const customValues = { a: 1, b: 2 };
|
|
171
|
+
render(
|
|
172
|
+
<TestWrapper>
|
|
173
|
+
<CustomValuesEditor {...defaultProps} showJSON customValues={customValues} />
|
|
174
|
+
</TestWrapper>
|
|
175
|
+
);
|
|
176
|
+
const lineCount = JSON.stringify(customValues, null, 2).split('\n').length;
|
|
177
|
+
const lineNumbers = document.querySelectorAll('.line-number');
|
|
178
|
+
expect(lineNumbers).toHaveLength(lineCount);
|
|
179
|
+
});
|
|
196
180
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
optionalTags: [],
|
|
208
|
-
},
|
|
209
|
-
]}
|
|
210
|
-
/>
|
|
211
|
-
</IntlProvider>,
|
|
212
|
-
);
|
|
213
|
-
expect(screen.getByText('Intl Section Title')).toBeInTheDocument();
|
|
214
|
-
});
|
|
181
|
+
it('calls handleJSONTextChange when the textarea value changes', () => {
|
|
182
|
+
render(
|
|
183
|
+
<TestWrapper>
|
|
184
|
+
<CustomValuesEditor {...defaultProps} showJSON />
|
|
185
|
+
</TestWrapper>
|
|
186
|
+
);
|
|
187
|
+
const textarea = document.querySelector('textarea.json-textarea');
|
|
188
|
+
fireEvent.change(textarea, { target: { value: '{"key": "val"}' } });
|
|
189
|
+
expect(defaultProps.handleJSONTextChange).toHaveBeenCalledWith('{"key": "val"}');
|
|
190
|
+
});
|
|
215
191
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
title: 'Plain String Title',
|
|
225
|
-
requiredTags: [{ fullPath: 'tag.a', name: 'a' }],
|
|
226
|
-
optionalTags: [],
|
|
227
|
-
},
|
|
228
|
-
]}
|
|
229
|
-
/>
|
|
230
|
-
</IntlProvider>,
|
|
231
|
-
);
|
|
232
|
-
expect(screen.getByText('Plain String Title')).toBeInTheDocument();
|
|
192
|
+
it('does not render the tag table in JSON view', () => {
|
|
193
|
+
render(
|
|
194
|
+
<TestWrapper>
|
|
195
|
+
<CustomValuesEditor {...defaultProps} showJSON />
|
|
196
|
+
</TestWrapper>
|
|
197
|
+
);
|
|
198
|
+
expect(screen.queryByText('Personalization Tags')).toBeNull();
|
|
199
|
+
});
|
|
233
200
|
});
|
|
234
201
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
<
|
|
239
|
-
{...
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
optionalTags: [],
|
|
246
|
-
},
|
|
247
|
-
]}
|
|
248
|
-
/>
|
|
249
|
-
</IntlProvider>,
|
|
250
|
-
);
|
|
251
|
-
const inputs = screen.getAllByTestId('tag-input');
|
|
252
|
-
expect(inputs.length).toBeGreaterThan(0);
|
|
253
|
-
});
|
|
202
|
+
describe('tag table view (showJSON = false)', () => {
|
|
203
|
+
it('renders Personalization Tags and Custom Values headers when extractedTags is non-empty', () => {
|
|
204
|
+
render(
|
|
205
|
+
<TestWrapper>
|
|
206
|
+
<CustomValuesEditor {...defaultProps} showJSON={false} />
|
|
207
|
+
</TestWrapper>
|
|
208
|
+
);
|
|
209
|
+
expect(screen.getByText('Personalization Tags')).toBeTruthy();
|
|
210
|
+
expect(screen.getByText('Custom Values')).toBeTruthy();
|
|
211
|
+
});
|
|
254
212
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
requiredTags: [{ name: 'myTag' }],
|
|
265
|
-
optionalTags: [],
|
|
266
|
-
},
|
|
267
|
-
]}
|
|
268
|
-
/>
|
|
269
|
-
</IntlProvider>,
|
|
270
|
-
);
|
|
271
|
-
expect(screen.getByText('myTag')).toBeInTheDocument();
|
|
272
|
-
});
|
|
213
|
+
it('renders required tags with a required indicator (*)', () => {
|
|
214
|
+
render(
|
|
215
|
+
<TestWrapper>
|
|
216
|
+
<CustomValuesEditor {...defaultProps} showJSON={false} />
|
|
217
|
+
</TestWrapper>
|
|
218
|
+
);
|
|
219
|
+
expect(screen.getByText('{{customer.name}}')).toBeTruthy();
|
|
220
|
+
expect(screen.getByText('*')).toBeTruthy();
|
|
221
|
+
});
|
|
273
222
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
title: 'Section',
|
|
283
|
-
requiredTags: [{}],
|
|
284
|
-
optionalTags: [],
|
|
285
|
-
},
|
|
286
|
-
]}
|
|
287
|
-
/>
|
|
288
|
-
</IntlProvider>,
|
|
289
|
-
);
|
|
290
|
-
const inputs = screen.getAllByTestId('tag-input');
|
|
291
|
-
expect(inputs.length).toBeGreaterThan(0);
|
|
292
|
-
});
|
|
223
|
+
it('renders optional tags without a required indicator', () => {
|
|
224
|
+
render(
|
|
225
|
+
<TestWrapper>
|
|
226
|
+
<CustomValuesEditor {...defaultProps} showJSON={false} />
|
|
227
|
+
</TestWrapper>
|
|
228
|
+
);
|
|
229
|
+
expect(screen.getByText('{{customer.email}}')).toBeTruthy();
|
|
230
|
+
});
|
|
293
231
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
{
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
</IntlProvider>,
|
|
309
|
-
);
|
|
310
|
-
expect(screen.getByText('Optional Section')).toBeInTheDocument();
|
|
311
|
-
const inputs = screen.getAllByTestId('tag-input');
|
|
312
|
-
expect(inputs.length).toBeGreaterThan(0);
|
|
313
|
-
});
|
|
232
|
+
it('does not render the table when extractedTags is empty', () => {
|
|
233
|
+
render(
|
|
234
|
+
<TestWrapper>
|
|
235
|
+
<CustomValuesEditor
|
|
236
|
+
{...defaultProps}
|
|
237
|
+
showJSON={false}
|
|
238
|
+
extractedTags={[]}
|
|
239
|
+
requiredTags={[]}
|
|
240
|
+
optionalTags={[]}
|
|
241
|
+
/>
|
|
242
|
+
</TestWrapper>
|
|
243
|
+
);
|
|
244
|
+
expect(screen.queryByText('Personalization Tags')).toBeNull();
|
|
245
|
+
});
|
|
314
246
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
247
|
+
it('calls handleCustomValueChange with the tag path and new value for required tags', () => {
|
|
248
|
+
render(
|
|
249
|
+
<TestWrapper>
|
|
250
|
+
<CustomValuesEditor {...defaultProps} showJSON={false} />
|
|
251
|
+
</TestWrapper>
|
|
252
|
+
);
|
|
253
|
+
const inputs = screen.getAllByTestId('cap-input');
|
|
254
|
+
fireEvent.change(inputs[0], { target: { value: 'Bob' } });
|
|
255
|
+
expect(defaultProps.handleCustomValueChange).toHaveBeenCalledWith('{{customer.name}}', 'Bob');
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
it('calls handleCustomValueChange with the tag path and new value for optional tags', () => {
|
|
259
|
+
render(
|
|
260
|
+
<TestWrapper>
|
|
261
|
+
<CustomValuesEditor {...defaultProps} showJSON={false} />
|
|
262
|
+
</TestWrapper>
|
|
263
|
+
);
|
|
264
|
+
const inputs = screen.getAllByTestId('cap-input');
|
|
265
|
+
fireEvent.change(inputs[1], { target: { value: 'bob@example.com' } });
|
|
266
|
+
expect(defaultProps.handleCustomValueChange).toHaveBeenCalledWith(
|
|
267
|
+
'{{customer.email}}',
|
|
268
|
+
'bob@example.com'
|
|
269
|
+
);
|
|
270
|
+
});
|
|
334
271
|
});
|
|
335
272
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
273
|
+
describe('JSON / tag toggle', () => {
|
|
274
|
+
it('calls setShowJSON(true) when toggle is clicked from tag view', () => {
|
|
275
|
+
render(
|
|
276
|
+
<TestWrapper>
|
|
277
|
+
<CustomValuesEditor {...defaultProps} showJSON={false} />
|
|
278
|
+
</TestWrapper>
|
|
279
|
+
);
|
|
280
|
+
fireEvent.click(screen.getByTestId('cap-switch'));
|
|
281
|
+
expect(defaultProps.setShowJSON).toHaveBeenCalledWith(true);
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
it('calls setShowJSON(false) when toggle is clicked from JSON view', () => {
|
|
285
|
+
render(
|
|
286
|
+
<TestWrapper>
|
|
287
|
+
<CustomValuesEditor {...defaultProps} showJSON />
|
|
288
|
+
</TestWrapper>
|
|
289
|
+
);
|
|
290
|
+
fireEvent.click(screen.getByTestId('cap-switch'));
|
|
291
|
+
expect(defaultProps.setShowJSON).toHaveBeenCalledWith(false);
|
|
292
|
+
});
|
|
350
293
|
});
|
|
351
294
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
295
|
+
describe('action buttons', () => {
|
|
296
|
+
it('calls handleDiscardCustomValues when the discard button is clicked', () => {
|
|
297
|
+
render(
|
|
298
|
+
<TestWrapper>
|
|
299
|
+
<CustomValuesEditor {...defaultProps} />
|
|
300
|
+
</TestWrapper>
|
|
301
|
+
);
|
|
302
|
+
const buttons = screen.getAllByTestId('cap-button');
|
|
303
|
+
fireEvent.click(buttons[0]); // discard is first
|
|
304
|
+
expect(defaultProps.handleDiscardCustomValues).toHaveBeenCalled();
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
it('calls handleUpdatePreview when the update-preview button is clicked', () => {
|
|
308
|
+
render(
|
|
309
|
+
<TestWrapper>
|
|
310
|
+
<CustomValuesEditor {...defaultProps} />
|
|
311
|
+
</TestWrapper>
|
|
312
|
+
);
|
|
313
|
+
const buttons = screen.getAllByTestId('cap-button');
|
|
314
|
+
fireEvent.click(buttons[1]); // update is second
|
|
315
|
+
expect(defaultProps.handleUpdatePreview).toHaveBeenCalled();
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
it('disables the update-preview button when isUpdatePreviewDisabled is true', () => {
|
|
319
|
+
render(
|
|
320
|
+
<TestWrapper>
|
|
321
|
+
<CustomValuesEditor {...defaultProps} isUpdatePreviewDisabled />
|
|
322
|
+
</TestWrapper>
|
|
323
|
+
);
|
|
324
|
+
const buttons = screen.getAllByTestId('cap-button');
|
|
325
|
+
expect(buttons[1].disabled).toBe(true);
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
it('disables the update-preview button when isUpdatingPreview is true', () => {
|
|
329
|
+
render(
|
|
330
|
+
<TestWrapper>
|
|
331
|
+
<CustomValuesEditor {...defaultProps} isUpdatingPreview />
|
|
332
|
+
</TestWrapper>
|
|
333
|
+
);
|
|
334
|
+
const buttons = screen.getAllByTestId('cap-button');
|
|
335
|
+
expect(buttons[1].disabled).toBe(true);
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
it('enables the update-preview button when neither flag is set', () => {
|
|
339
|
+
render(
|
|
340
|
+
<TestWrapper>
|
|
341
|
+
<CustomValuesEditor
|
|
342
|
+
{...defaultProps}
|
|
343
|
+
isUpdatePreviewDisabled={false}
|
|
344
|
+
isUpdatingPreview={false}
|
|
345
|
+
/>
|
|
346
|
+
</TestWrapper>
|
|
347
|
+
);
|
|
348
|
+
const buttons = screen.getAllByTestId('cap-button');
|
|
349
|
+
expect(buttons[1].disabled).toBe(false);
|
|
350
|
+
});
|
|
375
351
|
});
|
|
376
352
|
});
|