@capillarytech/creatives-library 8.0.295 → 8.0.296
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/package.json +1 -1
- package/v2Components/CommonTestAndPreview/DeliverySettings/DeliverySettings.scss +33 -0
- package/v2Components/CommonTestAndPreview/DeliverySettings/ModifyDeliverySettings.js +425 -0
- package/v2Components/CommonTestAndPreview/DeliverySettings/ModifyDeliverySettings.scss +36 -0
- package/v2Components/CommonTestAndPreview/DeliverySettings/constants.js +92 -0
- package/v2Components/CommonTestAndPreview/DeliverySettings/index.js +251 -0
- package/v2Components/CommonTestAndPreview/DeliverySettings/messages.js +111 -0
- package/v2Components/CommonTestAndPreview/DeliverySettings/utils/parseSenderDetailsResponse.js +88 -0
- package/v2Components/CommonTestAndPreview/SendTestMessage.js +51 -1
- package/v2Components/CommonTestAndPreview/actions.js +20 -0
- package/v2Components/CommonTestAndPreview/constants.js +15 -0
- package/v2Components/CommonTestAndPreview/index.js +200 -16
- package/v2Components/CommonTestAndPreview/reducer.js +47 -0
- package/v2Components/CommonTestAndPreview/sagas.js +61 -0
- package/v2Components/CommonTestAndPreview/selectors.js +51 -0
- package/v2Components/CommonTestAndPreview/tests/DeliverySettings/ModifyDeliverySettings.test.js +889 -0
- package/v2Components/CommonTestAndPreview/tests/DeliverySettings/index.test.js +222 -0
- package/v2Components/CommonTestAndPreview/tests/DeliverySettings/utils/parseSenderDetailsResponse.test.js +235 -0
- package/v2Components/CommonTestAndPreview/tests/SendTestMessage.test.js +135 -0
- package/v2Components/CommonTestAndPreview/tests/actions.test.js +50 -0
- package/v2Components/CommonTestAndPreview/tests/constants.test.js +18 -0
- package/v2Components/CommonTestAndPreview/tests/index.test.js +783 -2
- package/v2Components/CommonTestAndPreview/tests/reducer.test.js +118 -0
- package/v2Components/CommonTestAndPreview/tests/sagas.test.js +145 -0
- package/v2Components/CommonTestAndPreview/tests/selectors.test.js +146 -0
- package/v2Components/FormBuilder/index.js +1 -1
- package/v2Components/HtmlEditor/HTMLEditor.js +0 -1
- package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +0 -1
- package/v2Components/HtmlEditor/hooks/__tests__/useValidation.test.js +3 -132
- package/v2Components/HtmlEditor/hooks/useValidation.js +9 -12
- package/v2Components/HtmlEditor/utils/htmlValidator.js +2 -4
- package/v2Components/TestAndPreviewSlidebox/index.js +14 -0
- package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +2 -2
- package/v2Containers/EmailWrapper/components/__tests__/EmailHTMLEditor.test.js +18 -110
- package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +697 -12
- package/v2Containers/SmsTrai/Edit/index.js +5 -1
- package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +201 -0
- package/v2Containers/Whatsapp/index.js +1 -1
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +26242 -4225
package/v2Components/CommonTestAndPreview/tests/DeliverySettings/ModifyDeliverySettings.test.js
ADDED
|
@@ -0,0 +1,889 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for ModifyDeliverySettings component (delivery settings form in slidebox)
|
|
3
|
+
* @jest-environment jsdom
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/* eslint-disable react/prop-types */
|
|
7
|
+
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import { fireEvent, render, screen } from '@testing-library/react';
|
|
10
|
+
import ModifyDeliverySettings from '../../DeliverySettings/ModifyDeliverySettings';
|
|
11
|
+
import { CHANNELS } from '../../constants';
|
|
12
|
+
|
|
13
|
+
jest.mock('../../DeliverySettings/ModifyDeliverySettings.scss', () => ({}));
|
|
14
|
+
|
|
15
|
+
jest.mock('@capillarytech/cap-ui-library/CapRow', () => ({ children, className }) => <div className={className} data-testid="cap-row">{children}</div>);
|
|
16
|
+
jest.mock('@capillarytech/cap-ui-library/CapHeader', () => ({ title, className }) => <div className={className} data-testid="cap-header">{title}</div>);
|
|
17
|
+
jest.mock('@capillarytech/cap-ui-library/CapSelect', () => ({
|
|
18
|
+
options = [],
|
|
19
|
+
value,
|
|
20
|
+
onChange,
|
|
21
|
+
disabled,
|
|
22
|
+
placeholder,
|
|
23
|
+
componentClassName,
|
|
24
|
+
}) => (
|
|
25
|
+
<div>
|
|
26
|
+
<select
|
|
27
|
+
data-testid="cap-select"
|
|
28
|
+
data-placeholder={placeholder}
|
|
29
|
+
data-component-classname={componentClassName}
|
|
30
|
+
value={value ?? ''}
|
|
31
|
+
onChange={(e) => {
|
|
32
|
+
const matched = options.find((opt) => String(opt.value) === e.target.value);
|
|
33
|
+
onChange(matched ? matched.value : e.target.value);
|
|
34
|
+
}}
|
|
35
|
+
disabled={disabled}
|
|
36
|
+
aria-label={placeholder}
|
|
37
|
+
>
|
|
38
|
+
<option value="">--empty--</option>
|
|
39
|
+
{(options || []).map((opt) => (
|
|
40
|
+
<option key={`${opt.label}-${opt.value}`} value={String(opt.value)}>
|
|
41
|
+
{opt.label}
|
|
42
|
+
</option>
|
|
43
|
+
))}
|
|
44
|
+
</select>
|
|
45
|
+
<input
|
|
46
|
+
data-testid="cap-select-raw-input"
|
|
47
|
+
onChange={(e) => onChange(e.target.value)}
|
|
48
|
+
/>
|
|
49
|
+
</div>
|
|
50
|
+
));
|
|
51
|
+
jest.mock('@capillarytech/cap-ui-library/CapButton', () => ({ children, onClick, type }) => (
|
|
52
|
+
<button type="button" onClick={onClick} data-testid="cap-button" data-buttontype={type}>
|
|
53
|
+
{children}
|
|
54
|
+
</button>
|
|
55
|
+
));
|
|
56
|
+
jest.mock('@capillarytech/cap-ui-library/CapSpin', () => ({ spinning }) => (spinning ? <div data-testid="cap-spin">Loading...</div> : null));
|
|
57
|
+
jest.mock('@capillarytech/cap-ui-library/CapLabel', () => ({ children, type }) => <span data-testid="cap-label" data-type={type}>{children}</span>);
|
|
58
|
+
|
|
59
|
+
jest.mock('react-intl', () => ({
|
|
60
|
+
FormattedMessage: ({ defaultMessage }) => <span>{defaultMessage}</span>,
|
|
61
|
+
defineMessages: (obj) => obj,
|
|
62
|
+
}));
|
|
63
|
+
|
|
64
|
+
describe('ModifyDeliverySettings', () => {
|
|
65
|
+
const defaultProps = {
|
|
66
|
+
channel: CHANNELS.SMS,
|
|
67
|
+
deliverySettings: {},
|
|
68
|
+
senderDetailsOptions: [],
|
|
69
|
+
wecrmAccounts: [],
|
|
70
|
+
onSaveDeliverySettings: jest.fn(),
|
|
71
|
+
onClose: jest.fn(),
|
|
72
|
+
isLoading: false,
|
|
73
|
+
formatMessage: (msg) => msg?.defaultMessage || msg?.id,
|
|
74
|
+
whatsappAccountFromForm: undefined,
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const smsDomains = [
|
|
78
|
+
{
|
|
79
|
+
domainId: 11,
|
|
80
|
+
domainName: 'SMS Domain',
|
|
81
|
+
dgmId: 111,
|
|
82
|
+
gsmSenders: [{ value: 'GSM_A' }, { value: 'GSM_DEFAULT', default: true }],
|
|
83
|
+
cdmaSenders: [{ value: 'CDMA_A' }, { value: 'CDMA_DEFAULT', default: true }],
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
domainId: 22,
|
|
87
|
+
dgmId: 222,
|
|
88
|
+
gsmSenders: [],
|
|
89
|
+
cdmaSenders: [],
|
|
90
|
+
},
|
|
91
|
+
];
|
|
92
|
+
|
|
93
|
+
const emailDomains = [
|
|
94
|
+
{
|
|
95
|
+
domainId: 31,
|
|
96
|
+
domainName: 'Email Domain',
|
|
97
|
+
dgmId: 331,
|
|
98
|
+
emailSenders: [
|
|
99
|
+
{ value: 'noreply@test.com', label: 'No Reply' },
|
|
100
|
+
{ value: 'default@test.com', label: 'Default Label', default: true },
|
|
101
|
+
],
|
|
102
|
+
emailRepliers: [
|
|
103
|
+
{ value: 'reply@test.com' },
|
|
104
|
+
{ value: 'default-reply@test.com', default: true },
|
|
105
|
+
],
|
|
106
|
+
},
|
|
107
|
+
];
|
|
108
|
+
|
|
109
|
+
const whatsappDomains = [
|
|
110
|
+
{
|
|
111
|
+
domainId: 41,
|
|
112
|
+
sourceAccountIdentifier: 'waba-1',
|
|
113
|
+
gsmSenders: [{ value: '+111' }, { value: '+112' }],
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
domainId: 42,
|
|
117
|
+
sourceAccountIdentifier: 'waba-2',
|
|
118
|
+
gsmSenders: [{ value: '+221' }],
|
|
119
|
+
},
|
|
120
|
+
];
|
|
121
|
+
|
|
122
|
+
const wecrmAccounts = [
|
|
123
|
+
{ name: 'Account One', sourceAccountIdentifier: 'waba-1' },
|
|
124
|
+
{ name: 'Account Two', sourceAccountIdentifier: 'waba-2' },
|
|
125
|
+
];
|
|
126
|
+
|
|
127
|
+
const renderComponent = (props = {}) => render(
|
|
128
|
+
<ModifyDeliverySettings
|
|
129
|
+
{...defaultProps}
|
|
130
|
+
{...props}
|
|
131
|
+
/>
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
const getSelects = () => screen.getAllByTestId('cap-select');
|
|
135
|
+
const getRawInputs = () => screen.getAllByTestId('cap-select-raw-input');
|
|
136
|
+
|
|
137
|
+
beforeEach(() => {
|
|
138
|
+
jest.clearAllMocks();
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
describe('loading state', () => {
|
|
142
|
+
it('should render CapSpin when isLoading is true', () => {
|
|
143
|
+
renderComponent({ isLoading: true });
|
|
144
|
+
expect(screen.getByTestId('cap-spin')).toBeTruthy();
|
|
145
|
+
expect(screen.getByText('Loading...')).toBeTruthy();
|
|
146
|
+
expect(screen.queryByTestId('cap-button')).toBeNull();
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
describe('fallbacks and unsupported channel', () => {
|
|
151
|
+
it('should use destructured default values when optional props are undefined', () => {
|
|
152
|
+
const onSave = jest.fn();
|
|
153
|
+
|
|
154
|
+
render(
|
|
155
|
+
<ModifyDeliverySettings
|
|
156
|
+
channel={CHANNELS.SMS}
|
|
157
|
+
deliverySettings={undefined}
|
|
158
|
+
senderDetailsOptions={undefined}
|
|
159
|
+
wecrmAccounts={undefined}
|
|
160
|
+
onSaveDeliverySettings={onSave}
|
|
161
|
+
onClose={jest.fn()}
|
|
162
|
+
isLoading={false}
|
|
163
|
+
formatMessage={(msg) => msg?.defaultMessage || msg?.id}
|
|
164
|
+
/>
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
expect(getSelects()).toHaveLength(2);
|
|
168
|
+
fireEvent.click(screen.getByText('Done'));
|
|
169
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
170
|
+
domainId: null,
|
|
171
|
+
domainGatewayMapId: null,
|
|
172
|
+
gsmSenderId: '',
|
|
173
|
+
cdmaSenderId: '',
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('should use fallback placeholder when formatMessage is not provided', () => {
|
|
178
|
+
renderComponent({
|
|
179
|
+
channel: CHANNELS.SMS,
|
|
180
|
+
senderDetailsOptions: smsDomains,
|
|
181
|
+
formatMessage: undefined,
|
|
182
|
+
});
|
|
183
|
+
expect(getSelects()[0].getAttribute('data-placeholder')).toBe('No options');
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
it('should render no select rows for unsupported channel and still save empty object', () => {
|
|
187
|
+
const onSave = jest.fn();
|
|
188
|
+
const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
|
|
189
|
+
|
|
190
|
+
renderComponent({
|
|
191
|
+
channel: 'RCS',
|
|
192
|
+
onSaveDeliverySettings: onSave,
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
expect(screen.queryAllByTestId('cap-select')).toHaveLength(0);
|
|
196
|
+
fireEvent.click(screen.getByText('Done'));
|
|
197
|
+
expect(onSave).toHaveBeenCalledWith({});
|
|
198
|
+
|
|
199
|
+
consoleErrorSpy.mockRestore();
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
it('should handle locked WhatsApp lookup when wecrmAccounts is null', () => {
|
|
203
|
+
const onSave = jest.fn();
|
|
204
|
+
|
|
205
|
+
renderComponent({
|
|
206
|
+
channel: CHANNELS.WHATSAPP,
|
|
207
|
+
wecrmAccounts: null,
|
|
208
|
+
senderDetailsOptions: whatsappDomains,
|
|
209
|
+
whatsappAccountFromForm: { accountName: 'Account One' },
|
|
210
|
+
onSaveDeliverySettings: onSave,
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
fireEvent.click(screen.getByText('Done'));
|
|
214
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
215
|
+
domainId: null,
|
|
216
|
+
senderMobNum: '',
|
|
217
|
+
sourceAccountIdentifier: '',
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
it('should evaluate account name fallback when locked WhatsApp account entry has no name', () => {
|
|
222
|
+
const onSave = jest.fn();
|
|
223
|
+
|
|
224
|
+
renderComponent({
|
|
225
|
+
channel: CHANNELS.WHATSAPP,
|
|
226
|
+
wecrmAccounts: [{ sourceAccountIdentifier: 'waba-1' }],
|
|
227
|
+
senderDetailsOptions: whatsappDomains,
|
|
228
|
+
whatsappAccountFromForm: { accountName: 'Account One' },
|
|
229
|
+
onSaveDeliverySettings: onSave,
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
fireEvent.click(screen.getByText('Done'));
|
|
233
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
234
|
+
domainId: null,
|
|
235
|
+
senderMobNum: '',
|
|
236
|
+
sourceAccountIdentifier: '',
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
describe('SMS flow', () => {
|
|
242
|
+
it('should render SMS fields and button type', () => {
|
|
243
|
+
renderComponent({
|
|
244
|
+
channel: CHANNELS.SMS,
|
|
245
|
+
senderDetailsOptions: smsDomains,
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
expect(getSelects()).toHaveLength(2);
|
|
249
|
+
expect(screen.getByTestId('cap-button').getAttribute('data-buttontype')).toBe('primary');
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
it('should update gateway map, gsm sender, and cdma sender on SMS domain change using defaults', () => {
|
|
253
|
+
const onSave = jest.fn();
|
|
254
|
+
|
|
255
|
+
renderComponent({
|
|
256
|
+
channel: CHANNELS.SMS,
|
|
257
|
+
senderDetailsOptions: smsDomains,
|
|
258
|
+
onSaveDeliverySettings: onSave,
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
fireEvent.change(getSelects()[0], { target: { value: '11' } });
|
|
262
|
+
fireEvent.click(screen.getByText('Done'));
|
|
263
|
+
|
|
264
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
265
|
+
domainId: 11,
|
|
266
|
+
domainGatewayMapId: 111,
|
|
267
|
+
gsmSenderId: 'GSM_DEFAULT',
|
|
268
|
+
cdmaSenderId: 'CDMA_DEFAULT',
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
it('should set empty sender values when SMS domain has no senders', () => {
|
|
273
|
+
const onSave = jest.fn();
|
|
274
|
+
|
|
275
|
+
renderComponent({
|
|
276
|
+
channel: CHANNELS.SMS,
|
|
277
|
+
senderDetailsOptions: smsDomains,
|
|
278
|
+
deliverySettings: {
|
|
279
|
+
domainId: null,
|
|
280
|
+
domainGatewayMapId: null,
|
|
281
|
+
gsmSenderId: 'OLD_GSM',
|
|
282
|
+
cdmaSenderId: 'OLD_CDMA',
|
|
283
|
+
},
|
|
284
|
+
onSaveDeliverySettings: onSave,
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
fireEvent.change(getSelects()[0], { target: { value: '22' } });
|
|
288
|
+
fireEvent.click(screen.getByText('Done'));
|
|
289
|
+
|
|
290
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
291
|
+
domainId: 22,
|
|
292
|
+
domainGatewayMapId: 222,
|
|
293
|
+
gsmSenderId: '',
|
|
294
|
+
cdmaSenderId: '',
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
it('should keep previous gateway values when SMS domain is not found and still update domainId', () => {
|
|
299
|
+
const onSave = jest.fn();
|
|
300
|
+
|
|
301
|
+
renderComponent({
|
|
302
|
+
channel: CHANNELS.SMS,
|
|
303
|
+
senderDetailsOptions: smsDomains,
|
|
304
|
+
deliverySettings: {
|
|
305
|
+
domainId: 11,
|
|
306
|
+
domainGatewayMapId: 999,
|
|
307
|
+
gsmSenderId: 'KEEP_GSM',
|
|
308
|
+
cdmaSenderId: 'KEEP_CDMA',
|
|
309
|
+
},
|
|
310
|
+
onSaveDeliverySettings: onSave,
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
fireEvent.change(getRawInputs()[0], { target: { value: '9999' } });
|
|
314
|
+
fireEvent.click(screen.getByText('Done'));
|
|
315
|
+
|
|
316
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
317
|
+
domainId: '9999',
|
|
318
|
+
domainGatewayMapId: 999,
|
|
319
|
+
gsmSenderId: 'KEEP_GSM',
|
|
320
|
+
cdmaSenderId: 'KEEP_CDMA',
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
it('should update SMS sender field directly', () => {
|
|
325
|
+
const onSave = jest.fn();
|
|
326
|
+
|
|
327
|
+
renderComponent({
|
|
328
|
+
channel: CHANNELS.SMS,
|
|
329
|
+
senderDetailsOptions: smsDomains,
|
|
330
|
+
deliverySettings: {
|
|
331
|
+
domainId: 11,
|
|
332
|
+
domainGatewayMapId: 111,
|
|
333
|
+
gsmSenderId: 'GSM_A',
|
|
334
|
+
cdmaSenderId: 'CDMA_A',
|
|
335
|
+
},
|
|
336
|
+
onSaveDeliverySettings: onSave,
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
fireEvent.change(getSelects()[1], { target: { value: 'GSM_DEFAULT' } });
|
|
340
|
+
fireEvent.click(screen.getByText('Done'));
|
|
341
|
+
|
|
342
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
343
|
+
domainId: 11,
|
|
344
|
+
domainGatewayMapId: 111,
|
|
345
|
+
gsmSenderId: 'GSM_DEFAULT',
|
|
346
|
+
cdmaSenderId: 'CDMA_A',
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
it('should use sender label when gsm sender value is missing', () => {
|
|
351
|
+
renderComponent({
|
|
352
|
+
channel: CHANNELS.SMS,
|
|
353
|
+
senderDetailsOptions: [{
|
|
354
|
+
domainId: 55,
|
|
355
|
+
domainName: 'Label Domain',
|
|
356
|
+
gsmSenders: [{ label: 'Label GSM', value: '' }],
|
|
357
|
+
cdmaSenders: [],
|
|
358
|
+
}],
|
|
359
|
+
deliverySettings: { domainId: 55 },
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
const senderOptions = Array.from(getSelects()[1].querySelectorAll('option')).map((opt) => opt.textContent);
|
|
363
|
+
expect(senderOptions).toEqual(expect.arrayContaining(['Label GSM']));
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
it('should keep existing SMS domain options when TRAI DLT is not enabled', () => {
|
|
367
|
+
renderComponent({
|
|
368
|
+
channel: CHANNELS.SMS,
|
|
369
|
+
senderDetailsOptions: [
|
|
370
|
+
{
|
|
371
|
+
domainId: 11,
|
|
372
|
+
domainName: 'Domain One',
|
|
373
|
+
gsmSenders: [{ value: 'ID1' }],
|
|
374
|
+
cdmaSenders: [],
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
domainId: 22,
|
|
378
|
+
domainName: 'Domain Two',
|
|
379
|
+
gsmSenders: [{ value: 'ID2' }],
|
|
380
|
+
cdmaSenders: [],
|
|
381
|
+
},
|
|
382
|
+
],
|
|
383
|
+
smsTraiDltEnabled: false,
|
|
384
|
+
registeredSenderIds: ['ID2'],
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
const domainOptions = Array.from(getSelects()[0].querySelectorAll('option')).map((opt) => opt.textContent);
|
|
388
|
+
expect(domainOptions).toEqual(expect.arrayContaining(['Domain One', 'Domain Two']));
|
|
389
|
+
});
|
|
390
|
+
|
|
391
|
+
it('should filter SMS domains and sender IDs when TRAI DLT is enabled', () => {
|
|
392
|
+
renderComponent({
|
|
393
|
+
channel: CHANNELS.SMS,
|
|
394
|
+
senderDetailsOptions: [
|
|
395
|
+
{
|
|
396
|
+
domainId: 11,
|
|
397
|
+
domainName: 'Domain One',
|
|
398
|
+
dgmId: 111,
|
|
399
|
+
gsmSenders: [{ value: 'ID1' }, { value: 'ID2' }],
|
|
400
|
+
cdmaSenders: [],
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
domainId: 22,
|
|
404
|
+
domainName: 'Domain Two',
|
|
405
|
+
dgmId: 222,
|
|
406
|
+
gsmSenders: [{ value: 'ID3' }],
|
|
407
|
+
cdmaSenders: [],
|
|
408
|
+
},
|
|
409
|
+
],
|
|
410
|
+
smsTraiDltEnabled: true,
|
|
411
|
+
registeredSenderIds: ['ID2'],
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
const domainOptions = Array.from(getSelects()[0].querySelectorAll('option')).map((opt) => opt.textContent);
|
|
415
|
+
expect(domainOptions).toEqual(expect.arrayContaining(['Domain One']));
|
|
416
|
+
expect(domainOptions).not.toEqual(expect.arrayContaining(['Domain Two']));
|
|
417
|
+
|
|
418
|
+
fireEvent.change(getSelects()[0], { target: { value: '11' } });
|
|
419
|
+
const senderOptions = Array.from(getSelects()[1].querySelectorAll('option')).map((opt) => opt.textContent);
|
|
420
|
+
expect(senderOptions).toEqual(expect.arrayContaining(['ID2']));
|
|
421
|
+
expect(senderOptions).not.toEqual(expect.arrayContaining(['ID1']));
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
it('should default to the first allowed GSM sender when SMS domain changes in TRAI DLT mode', () => {
|
|
425
|
+
const onSave = jest.fn();
|
|
426
|
+
|
|
427
|
+
renderComponent({
|
|
428
|
+
channel: CHANNELS.SMS,
|
|
429
|
+
senderDetailsOptions: [
|
|
430
|
+
{
|
|
431
|
+
domainId: 11,
|
|
432
|
+
domainName: 'Domain One',
|
|
433
|
+
dgmId: 111,
|
|
434
|
+
gsmSenders: [{ value: 'ID1' }, { value: 'ID2' }],
|
|
435
|
+
cdmaSenders: [{ value: 'CDMA1' }],
|
|
436
|
+
},
|
|
437
|
+
],
|
|
438
|
+
smsTraiDltEnabled: true,
|
|
439
|
+
registeredSenderIds: ['ID2'],
|
|
440
|
+
onSaveDeliverySettings: onSave,
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
fireEvent.change(getSelects()[0], { target: { value: '11' } });
|
|
444
|
+
fireEvent.click(screen.getByText('Done'));
|
|
445
|
+
|
|
446
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
447
|
+
domainId: 11,
|
|
448
|
+
domainGatewayMapId: 111,
|
|
449
|
+
gsmSenderId: 'ID2',
|
|
450
|
+
cdmaSenderId: 'CDMA1',
|
|
451
|
+
});
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
it('should show no SMS domain options when TRAI DLT is enabled and no registered sender ID matches', () => {
|
|
455
|
+
renderComponent({
|
|
456
|
+
channel: CHANNELS.SMS,
|
|
457
|
+
senderDetailsOptions: [
|
|
458
|
+
{
|
|
459
|
+
domainId: 11,
|
|
460
|
+
domainName: 'Domain One',
|
|
461
|
+
gsmSenders: [{ value: 'ID1' }],
|
|
462
|
+
cdmaSenders: [],
|
|
463
|
+
},
|
|
464
|
+
],
|
|
465
|
+
smsTraiDltEnabled: true,
|
|
466
|
+
registeredSenderIds: ['UNMATCHED'],
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
const domainOptions = Array.from(getSelects()[0].querySelectorAll('option')).map((opt) => opt.textContent);
|
|
470
|
+
expect(domainOptions).not.toEqual(expect.arrayContaining(['Domain One']));
|
|
471
|
+
});
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
describe('EMAIL flow', () => {
|
|
475
|
+
it('should render EMAIL fields', () => {
|
|
476
|
+
renderComponent({
|
|
477
|
+
channel: CHANNELS.EMAIL,
|
|
478
|
+
senderDetailsOptions: emailDomains,
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
expect(getSelects()).toHaveLength(4);
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
it('should update email defaults on domain change', () => {
|
|
485
|
+
const onSave = jest.fn();
|
|
486
|
+
|
|
487
|
+
renderComponent({
|
|
488
|
+
channel: CHANNELS.EMAIL,
|
|
489
|
+
senderDetailsOptions: emailDomains,
|
|
490
|
+
onSaveDeliverySettings: onSave,
|
|
491
|
+
});
|
|
492
|
+
|
|
493
|
+
fireEvent.change(getSelects()[0], { target: { value: '31' } });
|
|
494
|
+
fireEvent.click(screen.getByText('Done'));
|
|
495
|
+
|
|
496
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
497
|
+
domainId: 31,
|
|
498
|
+
domainGatewayMapId: 331,
|
|
499
|
+
senderEmail: 'default@test.com',
|
|
500
|
+
senderLabel: 'Default Label',
|
|
501
|
+
senderReplyTo: 'default-reply@test.com',
|
|
502
|
+
});
|
|
503
|
+
});
|
|
504
|
+
|
|
505
|
+
it('should update sender email and fallback label from sender id selection', () => {
|
|
506
|
+
const onSave = jest.fn();
|
|
507
|
+
|
|
508
|
+
renderComponent({
|
|
509
|
+
channel: CHANNELS.EMAIL,
|
|
510
|
+
senderDetailsOptions: [{
|
|
511
|
+
...emailDomains[0],
|
|
512
|
+
emailSenders: [{ value: 'solo@test.com' }],
|
|
513
|
+
}],
|
|
514
|
+
deliverySettings: { domainId: 31, domainGatewayMapId: 331 },
|
|
515
|
+
onSaveDeliverySettings: onSave,
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
fireEvent.change(getSelects()[1], { target: { value: 'solo@test.com' } });
|
|
519
|
+
fireEvent.click(screen.getByText('Done'));
|
|
520
|
+
|
|
521
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
522
|
+
domainId: 31,
|
|
523
|
+
domainGatewayMapId: 331,
|
|
524
|
+
senderEmail: 'solo@test.com',
|
|
525
|
+
senderLabel: 'solo@test.com',
|
|
526
|
+
senderReplyTo: '',
|
|
527
|
+
});
|
|
528
|
+
});
|
|
529
|
+
|
|
530
|
+
it('should update sender email and sender label from sender name selection when match exists', () => {
|
|
531
|
+
const onSave = jest.fn();
|
|
532
|
+
|
|
533
|
+
renderComponent({
|
|
534
|
+
channel: CHANNELS.EMAIL,
|
|
535
|
+
senderDetailsOptions: emailDomains,
|
|
536
|
+
deliverySettings: { domainId: 31, domainGatewayMapId: 331 },
|
|
537
|
+
onSaveDeliverySettings: onSave,
|
|
538
|
+
});
|
|
539
|
+
|
|
540
|
+
fireEvent.change(getSelects()[2], { target: { value: 'No Reply' } });
|
|
541
|
+
fireEvent.click(screen.getByText('Done'));
|
|
542
|
+
|
|
543
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
544
|
+
domainId: 31,
|
|
545
|
+
domainGatewayMapId: 331,
|
|
546
|
+
senderEmail: 'noreply@test.com',
|
|
547
|
+
senderLabel: 'No Reply',
|
|
548
|
+
senderReplyTo: '',
|
|
549
|
+
});
|
|
550
|
+
});
|
|
551
|
+
|
|
552
|
+
it('should update only sender label when sender name selection has no match', () => {
|
|
553
|
+
const onSave = jest.fn();
|
|
554
|
+
|
|
555
|
+
renderComponent({
|
|
556
|
+
channel: CHANNELS.EMAIL,
|
|
557
|
+
senderDetailsOptions: emailDomains,
|
|
558
|
+
deliverySettings: {
|
|
559
|
+
domainId: 31,
|
|
560
|
+
domainGatewayMapId: 331,
|
|
561
|
+
senderEmail: 'keep@test.com',
|
|
562
|
+
},
|
|
563
|
+
onSaveDeliverySettings: onSave,
|
|
564
|
+
});
|
|
565
|
+
|
|
566
|
+
fireEvent.change(getRawInputs()[2], { target: { value: 'Custom Label' } });
|
|
567
|
+
fireEvent.click(screen.getByText('Done'));
|
|
568
|
+
|
|
569
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
570
|
+
domainId: 31,
|
|
571
|
+
domainGatewayMapId: 331,
|
|
572
|
+
senderEmail: 'keep@test.com',
|
|
573
|
+
senderLabel: 'Custom Label',
|
|
574
|
+
senderReplyTo: '',
|
|
575
|
+
});
|
|
576
|
+
});
|
|
577
|
+
|
|
578
|
+
it('should update reply-to selection directly', () => {
|
|
579
|
+
const onSave = jest.fn();
|
|
580
|
+
|
|
581
|
+
renderComponent({
|
|
582
|
+
channel: CHANNELS.EMAIL,
|
|
583
|
+
senderDetailsOptions: emailDomains,
|
|
584
|
+
deliverySettings: { domainId: 31, domainGatewayMapId: 331 },
|
|
585
|
+
onSaveDeliverySettings: onSave,
|
|
586
|
+
});
|
|
587
|
+
|
|
588
|
+
fireEvent.change(getSelects()[3], { target: { value: 'reply@test.com' } });
|
|
589
|
+
fireEvent.click(screen.getByText('Done'));
|
|
590
|
+
|
|
591
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
592
|
+
domainId: 31,
|
|
593
|
+
domainGatewayMapId: 331,
|
|
594
|
+
senderEmail: '',
|
|
595
|
+
senderLabel: '',
|
|
596
|
+
senderReplyTo: 'reply@test.com',
|
|
597
|
+
});
|
|
598
|
+
});
|
|
599
|
+
|
|
600
|
+
it('should use fallback labels for email sender name and reply-to options', () => {
|
|
601
|
+
renderComponent({
|
|
602
|
+
channel: CHANNELS.EMAIL,
|
|
603
|
+
senderDetailsOptions: [{
|
|
604
|
+
domainId: 88,
|
|
605
|
+
domainName: 'Fallback Email Domain',
|
|
606
|
+
emailSenders: [{ value: 'fallback@test.com' }],
|
|
607
|
+
emailRepliers: [{ label: 'Reply Label', value: '' }],
|
|
608
|
+
}],
|
|
609
|
+
deliverySettings: { domainId: 88 },
|
|
610
|
+
});
|
|
611
|
+
|
|
612
|
+
const senderNameOptions = Array.from(getSelects()[2].querySelectorAll('option')).map((opt) => opt.textContent);
|
|
613
|
+
const replyToOptions = Array.from(getSelects()[3].querySelectorAll('option')).map((opt) => opt.textContent);
|
|
614
|
+
|
|
615
|
+
expect(senderNameOptions).toEqual(expect.arrayContaining(['fallback@test.com']));
|
|
616
|
+
expect(replyToOptions).toEqual(expect.arrayContaining(['Reply Label']));
|
|
617
|
+
});
|
|
618
|
+
});
|
|
619
|
+
|
|
620
|
+
describe('WHATSAPP flow', () => {
|
|
621
|
+
it('should render WhatsApp fields', () => {
|
|
622
|
+
renderComponent({
|
|
623
|
+
channel: CHANNELS.WHATSAPP,
|
|
624
|
+
senderDetailsOptions: whatsappDomains,
|
|
625
|
+
wecrmAccounts,
|
|
626
|
+
});
|
|
627
|
+
|
|
628
|
+
expect(getSelects()).toHaveLength(2);
|
|
629
|
+
});
|
|
630
|
+
|
|
631
|
+
it('should show all sender numbers when no account is selected', () => {
|
|
632
|
+
renderComponent({
|
|
633
|
+
channel: CHANNELS.WHATSAPP,
|
|
634
|
+
senderDetailsOptions: whatsappDomains,
|
|
635
|
+
wecrmAccounts,
|
|
636
|
+
});
|
|
637
|
+
|
|
638
|
+
const senderSelect = getSelects()[1];
|
|
639
|
+
const optionTexts = Array.from(senderSelect.querySelectorAll('option')).map((opt) => opt.textContent);
|
|
640
|
+
|
|
641
|
+
expect(optionTexts).toEqual(expect.arrayContaining(['+111', '+112', '+221']));
|
|
642
|
+
});
|
|
643
|
+
|
|
644
|
+
it('should show sender numbers only for selected account', () => {
|
|
645
|
+
renderComponent({
|
|
646
|
+
channel: CHANNELS.WHATSAPP,
|
|
647
|
+
senderDetailsOptions: whatsappDomains,
|
|
648
|
+
wecrmAccounts,
|
|
649
|
+
deliverySettings: { sourceAccountIdentifier: 'waba-2', senderMobNum: '' },
|
|
650
|
+
});
|
|
651
|
+
|
|
652
|
+
const senderSelect = getSelects()[1];
|
|
653
|
+
const optionTexts = Array.from(senderSelect.querySelectorAll('option')).map((opt) => opt.textContent);
|
|
654
|
+
|
|
655
|
+
expect(optionTexts).toEqual(expect.arrayContaining(['+221']));
|
|
656
|
+
expect(optionTexts).not.toEqual(expect.arrayContaining(['+111']));
|
|
657
|
+
});
|
|
658
|
+
|
|
659
|
+
it('should update account and sender number when account selection changes', () => {
|
|
660
|
+
const onSave = jest.fn();
|
|
661
|
+
|
|
662
|
+
renderComponent({
|
|
663
|
+
channel: CHANNELS.WHATSAPP,
|
|
664
|
+
senderDetailsOptions: whatsappDomains,
|
|
665
|
+
wecrmAccounts,
|
|
666
|
+
onSaveDeliverySettings: onSave,
|
|
667
|
+
});
|
|
668
|
+
|
|
669
|
+
fireEvent.change(getSelects()[0], { target: { value: 'waba-2' } });
|
|
670
|
+
fireEvent.click(screen.getByText('Done'));
|
|
671
|
+
|
|
672
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
673
|
+
domainId: null,
|
|
674
|
+
senderMobNum: '+221',
|
|
675
|
+
sourceAccountIdentifier: 'waba-2',
|
|
676
|
+
});
|
|
677
|
+
});
|
|
678
|
+
|
|
679
|
+
it('should set empty sender number when selected WhatsApp account has no matching domain', () => {
|
|
680
|
+
const onSave = jest.fn();
|
|
681
|
+
|
|
682
|
+
renderComponent({
|
|
683
|
+
channel: CHANNELS.WHATSAPP,
|
|
684
|
+
senderDetailsOptions: whatsappDomains,
|
|
685
|
+
wecrmAccounts,
|
|
686
|
+
onSaveDeliverySettings: onSave,
|
|
687
|
+
});
|
|
688
|
+
|
|
689
|
+
fireEvent.change(getRawInputs()[0], { target: { value: 'missing-account' } });
|
|
690
|
+
fireEvent.click(screen.getByText('Done'));
|
|
691
|
+
|
|
692
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
693
|
+
domainId: null,
|
|
694
|
+
senderMobNum: '',
|
|
695
|
+
sourceAccountIdentifier: 'missing-account',
|
|
696
|
+
});
|
|
697
|
+
});
|
|
698
|
+
|
|
699
|
+
it('should update sender number directly', () => {
|
|
700
|
+
const onSave = jest.fn();
|
|
701
|
+
|
|
702
|
+
renderComponent({
|
|
703
|
+
channel: CHANNELS.WHATSAPP,
|
|
704
|
+
senderDetailsOptions: whatsappDomains,
|
|
705
|
+
wecrmAccounts,
|
|
706
|
+
deliverySettings: { sourceAccountIdentifier: 'waba-1', senderMobNum: '+111' },
|
|
707
|
+
onSaveDeliverySettings: onSave,
|
|
708
|
+
});
|
|
709
|
+
|
|
710
|
+
fireEvent.change(getSelects()[1], { target: { value: '+112' } });
|
|
711
|
+
fireEvent.click(screen.getByText('Done'));
|
|
712
|
+
|
|
713
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
714
|
+
domainId: null,
|
|
715
|
+
senderMobNum: '+112',
|
|
716
|
+
sourceAccountIdentifier: 'waba-1',
|
|
717
|
+
});
|
|
718
|
+
});
|
|
719
|
+
|
|
720
|
+
it('should lock account select, show disabled message, and seed settings from matching form account', () => {
|
|
721
|
+
const onSave = jest.fn();
|
|
722
|
+
|
|
723
|
+
renderComponent({
|
|
724
|
+
channel: CHANNELS.WHATSAPP,
|
|
725
|
+
senderDetailsOptions: whatsappDomains,
|
|
726
|
+
wecrmAccounts,
|
|
727
|
+
whatsappAccountFromForm: { accountName: 'Account One' },
|
|
728
|
+
onSaveDeliverySettings: onSave,
|
|
729
|
+
});
|
|
730
|
+
|
|
731
|
+
const [accountSelect] = getSelects();
|
|
732
|
+
expect(accountSelect.disabled).toBe(true);
|
|
733
|
+
expect(accountSelect.getAttribute('data-component-classname')).toContain('modify-delivery-settings__select--disabled');
|
|
734
|
+
expect(screen.getByText('Message template selected belongs to this account')).toBeTruthy();
|
|
735
|
+
|
|
736
|
+
fireEvent.click(screen.getByText('Done'));
|
|
737
|
+
|
|
738
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
739
|
+
domainId: null,
|
|
740
|
+
senderMobNum: '+111',
|
|
741
|
+
sourceAccountIdentifier: 'waba-1',
|
|
742
|
+
});
|
|
743
|
+
});
|
|
744
|
+
|
|
745
|
+
it('should keep previous state when locked account already matches source account identifier', () => {
|
|
746
|
+
const onSave = jest.fn();
|
|
747
|
+
|
|
748
|
+
renderComponent({
|
|
749
|
+
channel: CHANNELS.WHATSAPP,
|
|
750
|
+
senderDetailsOptions: whatsappDomains,
|
|
751
|
+
wecrmAccounts,
|
|
752
|
+
whatsappAccountFromForm: { accountName: 'Account One' },
|
|
753
|
+
deliverySettings: {
|
|
754
|
+
domainId: null,
|
|
755
|
+
senderMobNum: 'KEEP_ME',
|
|
756
|
+
sourceAccountIdentifier: 'waba-1',
|
|
757
|
+
},
|
|
758
|
+
onSaveDeliverySettings: onSave,
|
|
759
|
+
});
|
|
760
|
+
|
|
761
|
+
fireEvent.click(screen.getByText('Done'));
|
|
762
|
+
|
|
763
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
764
|
+
domainId: null,
|
|
765
|
+
senderMobNum: 'KEEP_ME',
|
|
766
|
+
sourceAccountIdentifier: 'waba-1',
|
|
767
|
+
});
|
|
768
|
+
});
|
|
769
|
+
|
|
770
|
+
it('should show fallback account option when locked account name is not found in wecrm accounts', () => {
|
|
771
|
+
renderComponent({
|
|
772
|
+
channel: CHANNELS.WHATSAPP,
|
|
773
|
+
senderDetailsOptions: whatsappDomains,
|
|
774
|
+
wecrmAccounts,
|
|
775
|
+
whatsappAccountFromForm: { accountName: 'Unknown Account' },
|
|
776
|
+
});
|
|
777
|
+
|
|
778
|
+
const accountSelect = getSelects()[0];
|
|
779
|
+
const optionTexts = Array.from(accountSelect.querySelectorAll('option')).map((opt) => opt.textContent);
|
|
780
|
+
|
|
781
|
+
expect(optionTexts).toEqual(expect.arrayContaining(['Unknown Account']));
|
|
782
|
+
});
|
|
783
|
+
|
|
784
|
+
it('should not update source account when locked account has no matching source identifier', () => {
|
|
785
|
+
const onSave = jest.fn();
|
|
786
|
+
|
|
787
|
+
renderComponent({
|
|
788
|
+
channel: CHANNELS.WHATSAPP,
|
|
789
|
+
senderDetailsOptions: whatsappDomains,
|
|
790
|
+
wecrmAccounts: [{ name: 'Broken Account' }],
|
|
791
|
+
whatsappAccountFromForm: { accountName: 'Broken Account' },
|
|
792
|
+
onSaveDeliverySettings: onSave,
|
|
793
|
+
});
|
|
794
|
+
|
|
795
|
+
fireEvent.click(screen.getByText('Done'));
|
|
796
|
+
|
|
797
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
798
|
+
domainId: null,
|
|
799
|
+
senderMobNum: '',
|
|
800
|
+
sourceAccountIdentifier: '',
|
|
801
|
+
});
|
|
802
|
+
});
|
|
803
|
+
|
|
804
|
+
it('should use sourceAccountIdentifier as account label when account name is missing', () => {
|
|
805
|
+
renderComponent({
|
|
806
|
+
channel: CHANNELS.WHATSAPP,
|
|
807
|
+
senderDetailsOptions: whatsappDomains,
|
|
808
|
+
wecrmAccounts: [{ sourceAccountIdentifier: 'fallback-waba' }],
|
|
809
|
+
});
|
|
810
|
+
|
|
811
|
+
const accountOptions = Array.from(getSelects()[0].querySelectorAll('option')).map((opt) => opt.textContent);
|
|
812
|
+
expect(accountOptions).toEqual(expect.arrayContaining(['fallback-waba']));
|
|
813
|
+
});
|
|
814
|
+
|
|
815
|
+
it('should keep sender number unchanged when locked account maps to domain without first sender value', () => {
|
|
816
|
+
const onSave = jest.fn();
|
|
817
|
+
|
|
818
|
+
renderComponent({
|
|
819
|
+
channel: CHANNELS.WHATSAPP,
|
|
820
|
+
senderDetailsOptions: [{
|
|
821
|
+
sourceAccountIdentifier: 'waba-1',
|
|
822
|
+
gsmSenders: [{}],
|
|
823
|
+
}],
|
|
824
|
+
wecrmAccounts: [{ name: 'Account One', sourceAccountIdentifier: 'waba-1' }],
|
|
825
|
+
whatsappAccountFromForm: { accountName: 'Account One' },
|
|
826
|
+
deliverySettings: {
|
|
827
|
+
domainId: null,
|
|
828
|
+
senderMobNum: 'KEEP_NUMBER',
|
|
829
|
+
sourceAccountIdentifier: '',
|
|
830
|
+
},
|
|
831
|
+
onSaveDeliverySettings: onSave,
|
|
832
|
+
});
|
|
833
|
+
|
|
834
|
+
fireEvent.click(screen.getByText('Done'));
|
|
835
|
+
|
|
836
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
837
|
+
domainId: null,
|
|
838
|
+
senderMobNum: 'KEEP_NUMBER',
|
|
839
|
+
sourceAccountIdentifier: 'waba-1',
|
|
840
|
+
});
|
|
841
|
+
});
|
|
842
|
+
});
|
|
843
|
+
|
|
844
|
+
describe('Done and close handling', () => {
|
|
845
|
+
it('should call onSaveDeliverySettings with channel defaults when nothing changes', () => {
|
|
846
|
+
const onSave = jest.fn();
|
|
847
|
+
|
|
848
|
+
renderComponent({
|
|
849
|
+
channel: CHANNELS.SMS,
|
|
850
|
+
onSaveDeliverySettings: onSave,
|
|
851
|
+
onClose: jest.fn(),
|
|
852
|
+
});
|
|
853
|
+
|
|
854
|
+
fireEvent.click(screen.getByText('Done'));
|
|
855
|
+
|
|
856
|
+
expect(onSave).toHaveBeenCalledTimes(1);
|
|
857
|
+
expect(onSave).toHaveBeenCalledWith({
|
|
858
|
+
domainId: null,
|
|
859
|
+
domainGatewayMapId: null,
|
|
860
|
+
gsmSenderId: '',
|
|
861
|
+
cdmaSenderId: '',
|
|
862
|
+
});
|
|
863
|
+
});
|
|
864
|
+
|
|
865
|
+
it('should call onClose when Done is clicked if onClose is provided', () => {
|
|
866
|
+
const onClose = jest.fn();
|
|
867
|
+
|
|
868
|
+
renderComponent({
|
|
869
|
+
onSaveDeliverySettings: jest.fn(),
|
|
870
|
+
onClose,
|
|
871
|
+
});
|
|
872
|
+
|
|
873
|
+
fireEvent.click(screen.getByText('Done'));
|
|
874
|
+
expect(onClose).toHaveBeenCalled();
|
|
875
|
+
});
|
|
876
|
+
|
|
877
|
+
it('should save successfully when onClose is not provided', () => {
|
|
878
|
+
const onSave = jest.fn();
|
|
879
|
+
|
|
880
|
+
renderComponent({
|
|
881
|
+
onSaveDeliverySettings: onSave,
|
|
882
|
+
onClose: undefined,
|
|
883
|
+
});
|
|
884
|
+
|
|
885
|
+
fireEvent.click(screen.getByText('Done'));
|
|
886
|
+
expect(onSave).toHaveBeenCalled();
|
|
887
|
+
});
|
|
888
|
+
});
|
|
889
|
+
});
|