@capillarytech/creatives-library 8.0.316-alpha.2 → 8.0.316-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/constants/unified.js +14 -0
- package/package.json +1 -1
- package/utils/templateVarUtils.js +172 -0
- package/utils/tests/templateVarUtils.test.js +160 -0
- package/v2Components/CapTagList/index.js +10 -0
- package/v2Components/CommonTestAndPreview/CustomValuesEditor.js +70 -49
- package/v2Components/CommonTestAndPreview/DeliverySettings/DeliverySettings.scss +8 -2
- package/v2Components/CommonTestAndPreview/DeliverySettings/ModifyDeliverySettings.js +207 -21
- package/v2Components/CommonTestAndPreview/DeliverySettings/constants.js +16 -0
- package/v2Components/CommonTestAndPreview/DeliverySettings/index.js +85 -10
- package/v2Components/CommonTestAndPreview/DeliverySettings/messages.js +30 -0
- package/v2Components/CommonTestAndPreview/DeliverySettings/utils/parseSenderDetailsResponse.js +79 -11
- package/v2Components/CommonTestAndPreview/SendTestMessage.js +11 -5
- package/v2Components/CommonTestAndPreview/UnifiedPreview/_unifiedPreview.scss +20 -1
- package/v2Components/CommonTestAndPreview/UnifiedPreview/index.js +133 -4
- package/v2Components/CommonTestAndPreview/_commonTestAndPreview.scss +12 -0
- package/v2Components/CommonTestAndPreview/constants.js +38 -0
- package/v2Components/CommonTestAndPreview/index.js +693 -155
- package/v2Components/CommonTestAndPreview/messages.js +41 -3
- package/v2Components/CommonTestAndPreview/previewApiUtils.js +59 -0
- package/v2Components/CommonTestAndPreview/sagas.js +15 -6
- package/v2Components/CommonTestAndPreview/tests/CustomValuesEditor.test.js +172 -0
- package/v2Components/CommonTestAndPreview/tests/DeliverySettings/ModifyDeliverySettings.test.js +269 -1
- package/v2Components/CommonTestAndPreview/tests/DeliverySettings/index.test.js +118 -5
- package/v2Components/CommonTestAndPreview/tests/DeliverySettings/utils/parseSenderDetailsResponse.test.js +245 -0
- package/v2Components/CommonTestAndPreview/tests/SendTestMessage.test.js +25 -4
- package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/index.test.js +100 -1
- package/v2Components/CommonTestAndPreview/tests/index.test.js +19 -1
- package/v2Components/CommonTestAndPreview/tests/previewApiUtils.test.js +67 -0
- package/v2Components/CommonTestAndPreview/tests/sagas.test.js +2 -2
- package/v2Components/FormBuilder/index.js +13 -13
- package/v2Components/SmsFallback/SmsFallbackLocalSelector.js +87 -0
- package/v2Components/SmsFallback/constants.js +73 -0
- package/v2Components/SmsFallback/index.js +956 -0
- package/v2Components/SmsFallback/index.scss +265 -0
- package/v2Components/SmsFallback/messages.js +78 -0
- package/v2Components/SmsFallback/smsFallbackUtils.js +107 -0
- package/v2Components/SmsFallback/tests/SmsFallbackLocalSelector.test.js +50 -0
- package/v2Components/SmsFallback/tests/rcsSmsFallback.acceptance.test.js +147 -0
- package/v2Components/SmsFallback/tests/smsFallbackHandlers.test.js +304 -0
- package/v2Components/SmsFallback/tests/smsFallbackUi.test.js +197 -0
- package/v2Components/SmsFallback/tests/smsFallbackUtils.test.js +261 -0
- package/v2Components/SmsFallback/tests/useLocalTemplateList.test.js +327 -0
- package/v2Components/SmsFallback/useLocalTemplateList.js +92 -0
- package/v2Components/TestAndPreviewSlidebox/index.js +8 -1
- package/v2Components/TestAndPreviewSlidebox/sagas.js +11 -4
- package/v2Components/TestAndPreviewSlidebox/tests/saga.test.js +3 -1
- package/v2Components/VarSegmentMessageEditor/constants.js +2 -0
- package/v2Components/VarSegmentMessageEditor/index.js +125 -0
- package/v2Components/VarSegmentMessageEditor/index.scss +46 -0
- package/v2Containers/CreativesContainer/CreativesSlideBoxWrapper.js +43 -0
- package/v2Containers/CreativesContainer/SlideBoxContent.js +36 -4
- package/v2Containers/CreativesContainer/SlideBoxFooter.js +10 -1
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +29 -4
- package/v2Containers/CreativesContainer/constants.js +9 -0
- package/v2Containers/CreativesContainer/embeddedSlideboxUtils.js +67 -0
- package/v2Containers/CreativesContainer/index.js +286 -93
- package/v2Containers/CreativesContainer/index.scss +51 -1
- package/v2Containers/CreativesContainer/tests/SlideBoxContent.localTemplates.test.js +90 -0
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +8 -0
- package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +20 -10
- package/v2Containers/CreativesContainer/tests/index.test.js +71 -9
- package/v2Containers/CreativesContainer/tests/useLocalTemplatesProp.test.js +125 -0
- package/v2Containers/InApp/index.js +4 -5
- package/v2Containers/Rcs/constants.js +32 -1
- package/v2Containers/Rcs/index.js +953 -882
- package/v2Containers/Rcs/index.scss +85 -6
- package/v2Containers/Rcs/messages.js +10 -1
- package/v2Containers/Rcs/rcsLibraryHydrationUtils.js +205 -0
- package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +40834 -1963
- package/v2Containers/Rcs/tests/__snapshots__/utils.test.js.snap +0 -5
- package/v2Containers/Rcs/tests/index.test.js +41 -38
- package/v2Containers/Rcs/tests/mockData.js +38 -0
- package/v2Containers/Rcs/tests/rcsLibraryHydrationUtils.test.js +251 -0
- package/v2Containers/Rcs/tests/utils.test.js +379 -1
- package/v2Containers/Rcs/utils.js +358 -10
- package/v2Containers/Sms/Create/index.js +81 -36
- package/v2Containers/Sms/smsFormDataHelpers.js +67 -0
- package/v2Containers/SmsTrai/Create/index.js +9 -4
- package/v2Containers/SmsTrai/Edit/constants.js +2 -0
- package/v2Containers/SmsTrai/Edit/index.js +609 -128
- package/v2Containers/SmsTrai/Edit/index.scss +121 -0
- package/v2Containers/SmsTrai/Edit/messages.js +9 -4
- package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +4327 -2374
- package/v2Containers/SmsWrapper/index.js +37 -8
- package/v2Containers/TagList/index.js +6 -0
- package/v2Containers/Templates/TemplatesActionBar.js +101 -0
- package/v2Containers/Templates/_templates.scss +61 -2
- package/v2Containers/Templates/actions.js +11 -0
- package/v2Containers/Templates/constants.js +2 -0
- package/v2Containers/Templates/index.js +90 -40
- package/v2Containers/Templates/sagas.js +57 -12
- package/v2Containers/Templates/tests/TemplatesActionBar.test.js +120 -0
- package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +1043 -1079
- package/v2Containers/Templates/tests/sagas.test.js +110 -12
- package/v2Containers/Templates/tests/smsTemplatesListApi.test.js +180 -0
- package/v2Containers/Templates/utils/smsTemplatesListApi.js +79 -0
- package/v2Containers/TemplatesV2/TemplatesV2.style.js +72 -1
- package/v2Containers/TemplatesV2/index.js +86 -23
- package/v2Containers/TemplatesV2/tests/TemplatesV2.localTemplates.test.js +131 -0
- package/v2Containers/Viber/index.js +4 -9
- package/v2Containers/WebPush/Create/components/MessageSection.js +54 -18
- package/v2Containers/WebPush/Create/components/MessageSection.test.js +28 -0
- package/v2Containers/WebPush/Create/components/__snapshots__/MessageSection.test.js.snap +7 -3
- package/v2Containers/Whatsapp/index.js +10 -32
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +578 -34
- package/v2Containers/Whatsapp/tests/index.test.js +172 -0
|
@@ -40,7 +40,7 @@ describe('DeliverySettings', () => {
|
|
|
40
40
|
const defaultProps = {
|
|
41
41
|
channel: CHANNELS.SMS,
|
|
42
42
|
deliverySettings: {},
|
|
43
|
-
|
|
43
|
+
senderDetailsByChannel: {},
|
|
44
44
|
wecrmAccounts: [],
|
|
45
45
|
onSaveDeliverySettings: jest.fn(),
|
|
46
46
|
isLoadingSenderDetails: false,
|
|
@@ -85,14 +85,14 @@ describe('DeliverySettings', () => {
|
|
|
85
85
|
});
|
|
86
86
|
|
|
87
87
|
it('should show summary values for SMS when deliverySettings and senderDetailsOptions match', () => {
|
|
88
|
-
const
|
|
88
|
+
const senderDetailsByChannel = { [CHANNELS.SMS]: [{ domainId: 1, domainName: 'SMS Domain' }] };
|
|
89
89
|
const deliverySettings = { domainId: 1, gsmSenderId: 'SENDER1' };
|
|
90
90
|
render(
|
|
91
91
|
<DeliverySettings
|
|
92
92
|
{...defaultProps}
|
|
93
93
|
channel={CHANNELS.SMS}
|
|
94
94
|
deliverySettings={deliverySettings}
|
|
95
|
-
|
|
95
|
+
senderDetailsByChannel={senderDetailsByChannel}
|
|
96
96
|
/>
|
|
97
97
|
);
|
|
98
98
|
expect(screen.getAllByText(/SMS Domain/).length).toBeGreaterThan(0);
|
|
@@ -105,7 +105,7 @@ describe('DeliverySettings', () => {
|
|
|
105
105
|
});
|
|
106
106
|
|
|
107
107
|
it('should show summary for EMAIL when has domain and sender', () => {
|
|
108
|
-
const
|
|
108
|
+
const senderDetailsByChannel = { [CHANNELS.EMAIL]: [{ domainId: 2, domainName: 'Email Domain' }] };
|
|
109
109
|
const deliverySettings = {
|
|
110
110
|
domainId: 2,
|
|
111
111
|
senderEmail: 'noreply@test.com',
|
|
@@ -117,7 +117,7 @@ describe('DeliverySettings', () => {
|
|
|
117
117
|
{...defaultProps}
|
|
118
118
|
channel={CHANNELS.EMAIL}
|
|
119
119
|
deliverySettings={deliverySettings}
|
|
120
|
-
|
|
120
|
+
senderDetailsByChannel={senderDetailsByChannel}
|
|
121
121
|
/>
|
|
122
122
|
);
|
|
123
123
|
expect(screen.getAllByText(/Email Domain/).length).toBeGreaterThan(0);
|
|
@@ -141,6 +141,76 @@ describe('DeliverySettings', () => {
|
|
|
141
141
|
expect(screen.getAllByText(/WABA One/).length).toBeGreaterThan(0);
|
|
142
142
|
expect(screen.getAllByText(/\+1234567890/).length).toBeGreaterThan(0);
|
|
143
143
|
});
|
|
144
|
+
|
|
145
|
+
it('RCS: when isChannelSmsFallbackPreviewEnabled is false, summary omits fallback SMS sender even if cdma is set', () => {
|
|
146
|
+
const rcsDomain = {
|
|
147
|
+
domainId: 10,
|
|
148
|
+
domainName: 'RCS D',
|
|
149
|
+
gsmSenders: [{ value: 'R1', default: true }],
|
|
150
|
+
};
|
|
151
|
+
const smsDomain = {
|
|
152
|
+
domainId: 20,
|
|
153
|
+
domainName: 'SMS D',
|
|
154
|
+
gsmSenders: [{ value: 'F1', default: true }],
|
|
155
|
+
};
|
|
156
|
+
const senderDetailsByChannel = {
|
|
157
|
+
[CHANNELS.RCS]: [rcsDomain],
|
|
158
|
+
[CHANNELS.SMS]: [smsDomain],
|
|
159
|
+
};
|
|
160
|
+
const deliverySettings = {
|
|
161
|
+
gsmSenderId: '10|R1',
|
|
162
|
+
cdmaSenderId: '20|F1',
|
|
163
|
+
};
|
|
164
|
+
render(
|
|
165
|
+
<IntlProvider locale="en" messages={{}}>
|
|
166
|
+
<DeliverySettings
|
|
167
|
+
{...defaultProps}
|
|
168
|
+
channel={CHANNELS.RCS}
|
|
169
|
+
deliverySettings={deliverySettings}
|
|
170
|
+
senderDetailsByChannel={senderDetailsByChannel}
|
|
171
|
+
isChannelSmsFallbackPreviewEnabled={false}
|
|
172
|
+
formatMessage={(m) => m?.defaultMessage || m?.id || ''}
|
|
173
|
+
/>
|
|
174
|
+
</IntlProvider>,
|
|
175
|
+
);
|
|
176
|
+
expect(screen.getAllByText(/R1/).length).toBeGreaterThan(0);
|
|
177
|
+
expect(screen.queryByText(/F1/)).toBeNull();
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it('RCS: when isChannelSmsFallbackPreviewEnabled is true, summary includes fallback SMS sender', () => {
|
|
181
|
+
const rcsDomain = {
|
|
182
|
+
domainId: 10,
|
|
183
|
+
domainName: 'RCS D',
|
|
184
|
+
gsmSenders: [{ value: 'R1', default: true }],
|
|
185
|
+
};
|
|
186
|
+
const smsDomain = {
|
|
187
|
+
domainId: 20,
|
|
188
|
+
domainName: 'SMS D',
|
|
189
|
+
gsmSenders: [{ value: 'F1', default: true }],
|
|
190
|
+
};
|
|
191
|
+
const senderDetailsByChannel = {
|
|
192
|
+
[CHANNELS.RCS]: [rcsDomain],
|
|
193
|
+
[CHANNELS.SMS]: [smsDomain],
|
|
194
|
+
};
|
|
195
|
+
const deliverySettings = {
|
|
196
|
+
gsmSenderId: '10|R1',
|
|
197
|
+
cdmaSenderId: '20|F1',
|
|
198
|
+
};
|
|
199
|
+
render(
|
|
200
|
+
<IntlProvider locale="en" messages={{}}>
|
|
201
|
+
<DeliverySettings
|
|
202
|
+
{...defaultProps}
|
|
203
|
+
channel={CHANNELS.RCS}
|
|
204
|
+
deliverySettings={deliverySettings}
|
|
205
|
+
senderDetailsByChannel={senderDetailsByChannel}
|
|
206
|
+
isChannelSmsFallbackPreviewEnabled
|
|
207
|
+
formatMessage={(m) => m?.defaultMessage || m?.id || ''}
|
|
208
|
+
/>
|
|
209
|
+
</IntlProvider>,
|
|
210
|
+
);
|
|
211
|
+
expect(screen.getAllByText(/R1/).length).toBeGreaterThan(0);
|
|
212
|
+
expect(screen.getAllByText(/F1/).length).toBeGreaterThan(0);
|
|
213
|
+
});
|
|
144
214
|
});
|
|
145
215
|
|
|
146
216
|
describe('edit and slidebox', () => {
|
|
@@ -169,6 +239,49 @@ describe('DeliverySettings', () => {
|
|
|
169
239
|
);
|
|
170
240
|
});
|
|
171
241
|
|
|
242
|
+
it('RCS: should not pass smsFallbackSenderDetailsOptions when isChannelSmsFallbackPreviewEnabled is false', () => {
|
|
243
|
+
render(
|
|
244
|
+
<DeliverySettings
|
|
245
|
+
{...defaultProps}
|
|
246
|
+
channel={CHANNELS.RCS}
|
|
247
|
+
senderDetailsByChannel={{
|
|
248
|
+
[CHANNELS.RCS]: [{ domainId: 1, domainName: 'R', gsmSenders: [] }],
|
|
249
|
+
[CHANNELS.SMS]: [{ domainId: 2, domainName: 'S', gsmSenders: [] }],
|
|
250
|
+
}}
|
|
251
|
+
isChannelSmsFallbackPreviewEnabled={false}
|
|
252
|
+
/>,
|
|
253
|
+
);
|
|
254
|
+
fireEvent.click(screen.getByTestId('delivery-settings-edit'));
|
|
255
|
+
expect(mockModifyDeliverySettings).toHaveBeenCalledWith(
|
|
256
|
+
expect.objectContaining({
|
|
257
|
+
channel: CHANNELS.RCS,
|
|
258
|
+
smsFallbackSenderDetailsOptions: undefined,
|
|
259
|
+
}),
|
|
260
|
+
);
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
it('RCS: should pass smsFallbackSenderDetailsOptions when isChannelSmsFallbackPreviewEnabled is true', () => {
|
|
264
|
+
const smsDomains = [{ domainId: 2, domainName: 'S', gsmSenders: [] }];
|
|
265
|
+
render(
|
|
266
|
+
<DeliverySettings
|
|
267
|
+
{...defaultProps}
|
|
268
|
+
channel={CHANNELS.RCS}
|
|
269
|
+
senderDetailsByChannel={{
|
|
270
|
+
[CHANNELS.RCS]: [{ domainId: 1, domainName: 'R', gsmSenders: [] }],
|
|
271
|
+
[CHANNELS.SMS]: smsDomains,
|
|
272
|
+
}}
|
|
273
|
+
isChannelSmsFallbackPreviewEnabled
|
|
274
|
+
/>,
|
|
275
|
+
);
|
|
276
|
+
fireEvent.click(screen.getByTestId('delivery-settings-edit'));
|
|
277
|
+
expect(mockModifyDeliverySettings).toHaveBeenCalledWith(
|
|
278
|
+
expect.objectContaining({
|
|
279
|
+
channel: CHANNELS.RCS,
|
|
280
|
+
smsFallbackSenderDetailsOptions: smsDomains,
|
|
281
|
+
}),
|
|
282
|
+
);
|
|
283
|
+
});
|
|
284
|
+
|
|
172
285
|
it('should call onSaveDeliverySettings and close slidebox when Done is clicked', () => {
|
|
173
286
|
const onSave = jest.fn();
|
|
174
287
|
render(
|
|
@@ -55,6 +55,33 @@ describe('parseSenderDetailsResponse', () => {
|
|
|
55
55
|
expect(result.domains[0].cdmaSenders[0].value).toBe('CDMA1');
|
|
56
56
|
});
|
|
57
57
|
|
|
58
|
+
it('should populate SMS senders when channel argument is lowercase (normalized for branches)', () => {
|
|
59
|
+
const response = {
|
|
60
|
+
entity: {
|
|
61
|
+
SMS: [
|
|
62
|
+
{
|
|
63
|
+
id: 10,
|
|
64
|
+
priority: 1,
|
|
65
|
+
domainProperties: {
|
|
66
|
+
domainName: 'SMS Domain 1',
|
|
67
|
+
id: 100,
|
|
68
|
+
contactInfo: [
|
|
69
|
+
{ type: 'gsm_sender_id', valid: true, value: 'GSM1', default: true },
|
|
70
|
+
{ type: 'cdma_sender_id', valid: true, value: 'CDMA1' },
|
|
71
|
+
],
|
|
72
|
+
connectionProperties: {},
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
const result = parseSenderDetailsResponse('sms', response);
|
|
79
|
+
expect(result.domains).toHaveLength(1);
|
|
80
|
+
expect(result.domains[0].gsmSenders).toHaveLength(1);
|
|
81
|
+
expect(result.domains[0].gsmSenders[0].value).toBe('GSM1');
|
|
82
|
+
expect(result.domains[0].cdmaSenders).toHaveLength(1);
|
|
83
|
+
});
|
|
84
|
+
|
|
58
85
|
it('should parse EMAIL channel entity array', () => {
|
|
59
86
|
const response = {
|
|
60
87
|
entity: {
|
|
@@ -231,5 +258,223 @@ describe('parseSenderDetailsResponse', () => {
|
|
|
231
258
|
const result = parseSenderDetailsResponse('WHATSAPP', response);
|
|
232
259
|
expect(result.domains[0].sourceAccountIdentifier).toBe('waba-456');
|
|
233
260
|
});
|
|
261
|
+
|
|
262
|
+
it('should map hostName to domainName when domainName missing (RCS)', () => {
|
|
263
|
+
const response = {
|
|
264
|
+
entity: {
|
|
265
|
+
RCS: [
|
|
266
|
+
{
|
|
267
|
+
id: 1,
|
|
268
|
+
priority: 0,
|
|
269
|
+
domainProperties: {
|
|
270
|
+
hostName: 'rcs-host',
|
|
271
|
+
id: 42,
|
|
272
|
+
contactInfo: [
|
|
273
|
+
{ type: 'gsm_sender_id', valid: true, value: 'S1', default: true },
|
|
274
|
+
],
|
|
275
|
+
},
|
|
276
|
+
},
|
|
277
|
+
],
|
|
278
|
+
},
|
|
279
|
+
};
|
|
280
|
+
const result = parseSenderDetailsResponse('RCS', response);
|
|
281
|
+
expect(result.domains[0].domainName).toBe('rcs-host');
|
|
282
|
+
expect(result.domains[0].domainId).toBe(42);
|
|
283
|
+
expect(result.domains[0].gsmSenders[0].value).toBe('S1');
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
it('should unwrap result.entity when top-level entity is absent', () => {
|
|
287
|
+
const response = {
|
|
288
|
+
result: {
|
|
289
|
+
entity: {
|
|
290
|
+
SMS: [
|
|
291
|
+
{
|
|
292
|
+
id: 1,
|
|
293
|
+
priority: 0,
|
|
294
|
+
domainProperties: {
|
|
295
|
+
domainName: 'ViaResult',
|
|
296
|
+
id: 9,
|
|
297
|
+
contactInfo: [{ type: 'gsm_sender_id', valid: true, value: 'G' }],
|
|
298
|
+
},
|
|
299
|
+
},
|
|
300
|
+
],
|
|
301
|
+
},
|
|
302
|
+
},
|
|
303
|
+
};
|
|
304
|
+
const result = parseSenderDetailsResponse('SMS', response);
|
|
305
|
+
expect(result.domains[0].domainName).toBe('ViaResult');
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
it('should merge rcs_sender_id into gsmSenders for RCS', () => {
|
|
309
|
+
const response = {
|
|
310
|
+
entity: {
|
|
311
|
+
RCS: [
|
|
312
|
+
{
|
|
313
|
+
id: 1,
|
|
314
|
+
priority: 0,
|
|
315
|
+
domainProperties: {
|
|
316
|
+
domainName: 'RCS Domain',
|
|
317
|
+
id: 1,
|
|
318
|
+
contactInfo: [
|
|
319
|
+
{ type: 'rcs_sender_id', valid: true, value: 'RCS123', default: true },
|
|
320
|
+
],
|
|
321
|
+
},
|
|
322
|
+
},
|
|
323
|
+
],
|
|
324
|
+
},
|
|
325
|
+
};
|
|
326
|
+
const result = parseSenderDetailsResponse('RCS', response);
|
|
327
|
+
expect(result.domains[0].gsmSenders).toHaveLength(1);
|
|
328
|
+
expect(result.domains[0].gsmSenders[0].value).toBe('RCS123');
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
it('should unwrap data.entity when top-level entity is absent', () => {
|
|
332
|
+
const response = {
|
|
333
|
+
data: {
|
|
334
|
+
entity: {
|
|
335
|
+
SMS: [
|
|
336
|
+
{
|
|
337
|
+
id: 1,
|
|
338
|
+
priority: 0,
|
|
339
|
+
domainProperties: {
|
|
340
|
+
domainName: 'ViaData',
|
|
341
|
+
id: 9,
|
|
342
|
+
contactInfo: [{ type: 'gsm_sender_id', valid: true, value: 'G' }],
|
|
343
|
+
},
|
|
344
|
+
},
|
|
345
|
+
],
|
|
346
|
+
},
|
|
347
|
+
},
|
|
348
|
+
};
|
|
349
|
+
const result = parseSenderDetailsResponse('SMS', response);
|
|
350
|
+
expect(result.domains[0].domainName).toBe('ViaData');
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
it('should return empty domains when entity is explicitly null', () => {
|
|
354
|
+
expect(parseSenderDetailsResponse('SMS', { entity: null })).toEqual({ domains: [] });
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
it('should return empty when channel data is a non-domain object', () => {
|
|
358
|
+
expect(parseSenderDetailsResponse('SMS', { entity: { notAnArray: true } })).toEqual({ domains: [] });
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
it('should use userid when sourceAccountIdentifier and wabaId are missing (WHATSAPP)', () => {
|
|
362
|
+
const response = {
|
|
363
|
+
entity: {
|
|
364
|
+
WHATSAPP: [
|
|
365
|
+
{
|
|
366
|
+
id: 1,
|
|
367
|
+
priority: 0,
|
|
368
|
+
domainProperties: {
|
|
369
|
+
domainName: 'W',
|
|
370
|
+
id: 1,
|
|
371
|
+
connectionProperties: { userid: 'user-99' },
|
|
372
|
+
},
|
|
373
|
+
},
|
|
374
|
+
],
|
|
375
|
+
},
|
|
376
|
+
};
|
|
377
|
+
const result = parseSenderDetailsResponse('WHATSAPP', response);
|
|
378
|
+
expect(result.domains[0].sourceAccountIdentifier).toBe('user-99');
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
it('should dedupe duplicate GSM values for RCS (merged contact types)', () => {
|
|
382
|
+
const response = {
|
|
383
|
+
entity: {
|
|
384
|
+
RCS: [
|
|
385
|
+
{
|
|
386
|
+
id: 1,
|
|
387
|
+
priority: 0,
|
|
388
|
+
domainProperties: {
|
|
389
|
+
domainName: 'R',
|
|
390
|
+
id: 1,
|
|
391
|
+
contactInfo: [
|
|
392
|
+
{ type: 'gsm_sender_id', valid: true, value: 'SAME', default: true },
|
|
393
|
+
{ type: 'rcs_sender_id', valid: true, value: 'SAME' },
|
|
394
|
+
],
|
|
395
|
+
},
|
|
396
|
+
},
|
|
397
|
+
],
|
|
398
|
+
},
|
|
399
|
+
};
|
|
400
|
+
const result = parseSenderDetailsResponse('RCS', response);
|
|
401
|
+
expect(result.domains[0].gsmSenders.filter((r) => r.value === 'SAME')).toHaveLength(1);
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
it('should return empty domains when response is not an object', () => {
|
|
405
|
+
expect(parseSenderDetailsResponse('SMS', 42)).toEqual({ domains: [] });
|
|
406
|
+
expect(parseSenderDetailsResponse('SMS', 'x')).toEqual({ domains: [] });
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
it('should return empty domains when entity is empty string', () => {
|
|
410
|
+
expect(parseSenderDetailsResponse('SMS', { entity: '' })).toEqual({ domains: [] });
|
|
411
|
+
});
|
|
412
|
+
|
|
413
|
+
it('should normalize hyphenated contactInfo.type to match gsm_sender_id', () => {
|
|
414
|
+
const response = {
|
|
415
|
+
entity: {
|
|
416
|
+
SMS: [
|
|
417
|
+
{
|
|
418
|
+
id: 1,
|
|
419
|
+
domainProperties: {
|
|
420
|
+
domainName: 'D',
|
|
421
|
+
id: 1,
|
|
422
|
+
contactInfo: [
|
|
423
|
+
{ type: 'gsm-sender-id', valid: true, value: 'HYPH' },
|
|
424
|
+
],
|
|
425
|
+
},
|
|
426
|
+
},
|
|
427
|
+
],
|
|
428
|
+
},
|
|
429
|
+
};
|
|
430
|
+
const result = parseSenderDetailsResponse('SMS', response);
|
|
431
|
+
expect(result.domains[0].gsmSenders[0].value).toBe('HYPH');
|
|
432
|
+
});
|
|
433
|
+
|
|
434
|
+
it('should skip whitespace-only GSM values when merging RCS contact types', () => {
|
|
435
|
+
const response = {
|
|
436
|
+
entity: {
|
|
437
|
+
RCS: [
|
|
438
|
+
{
|
|
439
|
+
id: 1,
|
|
440
|
+
domainProperties: {
|
|
441
|
+
domainName: 'R',
|
|
442
|
+
id: 1,
|
|
443
|
+
contactInfo: [
|
|
444
|
+
{ type: 'gsm_sender_id', valid: true, value: ' ' },
|
|
445
|
+
{ type: 'gsm_sender_id', valid: true, value: 'OK' },
|
|
446
|
+
],
|
|
447
|
+
},
|
|
448
|
+
},
|
|
449
|
+
],
|
|
450
|
+
},
|
|
451
|
+
};
|
|
452
|
+
const values = parseSenderDetailsResponse('RCS', response).domains[0].gsmSenders.map((g) => g.value);
|
|
453
|
+
expect(values).toEqual(['OK']);
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
it('should use default priority 0 when priority is null', () => {
|
|
457
|
+
const response = {
|
|
458
|
+
entity: {
|
|
459
|
+
SMS: [
|
|
460
|
+
{
|
|
461
|
+
id: 1,
|
|
462
|
+
priority: null,
|
|
463
|
+
domainProperties: {
|
|
464
|
+
domainName: 'P',
|
|
465
|
+
id: 9,
|
|
466
|
+
contactInfo: [],
|
|
467
|
+
},
|
|
468
|
+
},
|
|
469
|
+
],
|
|
470
|
+
},
|
|
471
|
+
};
|
|
472
|
+
expect(parseSenderDetailsResponse('SMS', response).domains[0].priority).toBe(0);
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
it('should unwrap entity from raw response object when entity key is absent', () => {
|
|
476
|
+
const response = { misc: 1 };
|
|
477
|
+
expect(parseSenderDetailsResponse('SMS', response)).toEqual({ domains: [] });
|
|
478
|
+
});
|
|
234
479
|
});
|
|
235
480
|
});
|
|
@@ -24,17 +24,19 @@ import SendTestMessage from '../SendTestMessage';
|
|
|
24
24
|
|
|
25
25
|
// Mock DeliverySettings to assert props
|
|
26
26
|
jest.mock('../DeliverySettings', () => function MockDeliverySettings(props) {
|
|
27
|
-
|
|
27
|
+
const smsRows = props.senderDetailsByChannel?.SMS || [];
|
|
28
|
+
return (
|
|
28
29
|
<div data-testid="delivery-settings" data-props={JSON.stringify({
|
|
29
30
|
channel: props.channel,
|
|
30
31
|
hasDeliverySettings: !!props.deliverySettings,
|
|
31
|
-
senderDetailsLength:
|
|
32
|
+
senderDetailsLength: smsRows.length,
|
|
32
33
|
wecrmAccountsLength: (props.wecrmAccounts || []).length,
|
|
33
34
|
hasOnSave: typeof props.onSaveDeliverySettings === 'function',
|
|
34
35
|
isLoadingSenderDetails: props.isLoadingSenderDetails,
|
|
35
36
|
smsTraiDltEnabled: props.smsTraiDltEnabled,
|
|
36
37
|
registeredSenderIds: props.registeredSenderIds,
|
|
37
38
|
whatsappAccountFromForm: props.whatsappAccountFromForm,
|
|
39
|
+
isChannelSmsFallbackPreviewEnabled: props.isChannelSmsFallbackPreviewEnabled,
|
|
38
40
|
})}
|
|
39
41
|
/>
|
|
40
42
|
);
|
|
@@ -129,12 +131,13 @@ describe('SendTestMessage', () => {
|
|
|
129
131
|
formatMessage: jest.fn((msg) => msg.defaultMessage || msg.id),
|
|
130
132
|
channel: 'EMAIL',
|
|
131
133
|
deliverySettings: {},
|
|
132
|
-
|
|
134
|
+
senderDetailsByChannel: {},
|
|
133
135
|
wecrmAccounts: [],
|
|
134
136
|
onSaveDeliverySettings: jest.fn(),
|
|
135
137
|
isLoadingSenderDetails: false,
|
|
136
138
|
smsTraiDltEnabled: false,
|
|
137
139
|
registeredSenderIds: [],
|
|
140
|
+
isChannelSmsFallbackPreviewEnabled: false,
|
|
138
141
|
};
|
|
139
142
|
|
|
140
143
|
beforeEach(() => {
|
|
@@ -229,6 +232,22 @@ describe('SendTestMessage', () => {
|
|
|
229
232
|
expect(screen.getByTestId('delivery-settings')).toBeTruthy();
|
|
230
233
|
});
|
|
231
234
|
|
|
235
|
+
it('should render DeliverySettings when channel is RCS and pass SMS fallback preview flag', () => {
|
|
236
|
+
render(
|
|
237
|
+
<TestWrapper>
|
|
238
|
+
<SendTestMessage
|
|
239
|
+
{...defaultProps}
|
|
240
|
+
channel="RCS"
|
|
241
|
+
isChannelSmsFallbackPreviewEnabled
|
|
242
|
+
/>
|
|
243
|
+
</TestWrapper>
|
|
244
|
+
);
|
|
245
|
+
const el = screen.getByTestId('delivery-settings');
|
|
246
|
+
const data = JSON.parse(el.getAttribute('data-props'));
|
|
247
|
+
expect(data.channel).toBe('RCS');
|
|
248
|
+
expect(data.isChannelSmsFallbackPreviewEnabled).toBe(true);
|
|
249
|
+
});
|
|
250
|
+
|
|
232
251
|
it('should not render DeliverySettings when channel is INAPP', () => {
|
|
233
252
|
render(
|
|
234
253
|
<TestWrapper>
|
|
@@ -276,7 +295,9 @@ describe('SendTestMessage', () => {
|
|
|
276
295
|
{...defaultProps}
|
|
277
296
|
channel="SMS"
|
|
278
297
|
deliverySettings={{ domainId: 1 }}
|
|
279
|
-
|
|
298
|
+
senderDetailsByChannel={{
|
|
299
|
+
SMS: [{ domainId: 1, domainName: 'SMS Dom' }],
|
|
300
|
+
}}
|
|
280
301
|
wecrmAccounts={[]}
|
|
281
302
|
onSaveDeliverySettings={onSave}
|
|
282
303
|
isLoadingSenderDetails={true}
|
|
@@ -9,7 +9,16 @@ import { render, screen } from '@testing-library/react';
|
|
|
9
9
|
import '@testing-library/jest-dom';
|
|
10
10
|
import { injectIntl, IntlProvider } from 'react-intl';
|
|
11
11
|
import UnifiedPreview from '../../UnifiedPreview';
|
|
12
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
CHANNELS,
|
|
14
|
+
DESKTOP,
|
|
15
|
+
TABLET,
|
|
16
|
+
MOBILE,
|
|
17
|
+
ANDROID,
|
|
18
|
+
IOS,
|
|
19
|
+
PREVIEW_TAB_RCS,
|
|
20
|
+
PREVIEW_TAB_SMS_FALLBACK,
|
|
21
|
+
} from '../../constants';
|
|
13
22
|
import messages from '../../messages';
|
|
14
23
|
|
|
15
24
|
// Convert messages object to format expected by IntlProvider
|
|
@@ -547,6 +556,96 @@ describe('UnifiedPreview', () => {
|
|
|
547
556
|
|
|
548
557
|
expect(screen.getByTestId('rcs-sender-id')).toHaveTextContent('RCS_SENDER');
|
|
549
558
|
});
|
|
559
|
+
|
|
560
|
+
describe('RCS SMS fallback — Test & Preview tabs', () => {
|
|
561
|
+
it('without SMS fallback selected, shows only RCS preview (no RCS+SMS tab layout)', () => {
|
|
562
|
+
const props = {
|
|
563
|
+
...defaultProps,
|
|
564
|
+
channel: CHANNELS.RCS,
|
|
565
|
+
content: { rcsTitle: 'Hello RCS' },
|
|
566
|
+
smsFallbackContent: undefined,
|
|
567
|
+
};
|
|
568
|
+
|
|
569
|
+
const { container } = render(
|
|
570
|
+
<TestWrapper>
|
|
571
|
+
<ComponentToRender {...props} />
|
|
572
|
+
</TestWrapper>
|
|
573
|
+
);
|
|
574
|
+
|
|
575
|
+
expect(container.querySelector('.unified-preview-rcs-tabs')).toBeNull();
|
|
576
|
+
expect(screen.getByTestId('rcs-preview')).toBeInTheDocument();
|
|
577
|
+
expect(screen.queryByTestId('sms-preview')).not.toBeInTheDocument();
|
|
578
|
+
});
|
|
579
|
+
|
|
580
|
+
it('with SMS fallback template body, shows RCS and Fallback SMS tabs', () => {
|
|
581
|
+
const props = {
|
|
582
|
+
...defaultProps,
|
|
583
|
+
channel: CHANNELS.RCS,
|
|
584
|
+
content: { rcsTitle: 'Hello RCS' },
|
|
585
|
+
smsFallbackContent: {
|
|
586
|
+
content: 'SMS fallback body',
|
|
587
|
+
templateContent: 'SMS fallback body',
|
|
588
|
+
},
|
|
589
|
+
};
|
|
590
|
+
|
|
591
|
+
const { container } = render(
|
|
592
|
+
<TestWrapper>
|
|
593
|
+
<ComponentToRender {...props} />
|
|
594
|
+
</TestWrapper>
|
|
595
|
+
);
|
|
596
|
+
|
|
597
|
+
expect(container.querySelector('.unified-preview-rcs-tabs')).toBeInTheDocument();
|
|
598
|
+
expect(
|
|
599
|
+
screen.getByRole('tab', { name: messages.rcsTab.defaultMessage })
|
|
600
|
+
).toBeInTheDocument();
|
|
601
|
+
expect(
|
|
602
|
+
screen.getByRole('tab', { name: messages.smsFallbackTab.defaultMessage })
|
|
603
|
+
).toBeInTheDocument();
|
|
604
|
+
});
|
|
605
|
+
|
|
606
|
+
it('on SMS fallback tab, renders SMS preview with resolved fallback text when smsFallbackResolvedText is set', () => {
|
|
607
|
+
const props = {
|
|
608
|
+
...defaultProps,
|
|
609
|
+
channel: CHANNELS.RCS,
|
|
610
|
+
content: { rcsTitle: 'Hello RCS' },
|
|
611
|
+
smsFallbackContent: {
|
|
612
|
+
content: '{{var}}',
|
|
613
|
+
templateContent: '{{var}}',
|
|
614
|
+
},
|
|
615
|
+
smsFallbackResolvedText: 'Resolved SMS for preview',
|
|
616
|
+
activePreviewTab: PREVIEW_TAB_SMS_FALLBACK,
|
|
617
|
+
onPreviewTabChange: jest.fn(),
|
|
618
|
+
};
|
|
619
|
+
|
|
620
|
+
render(
|
|
621
|
+
<TestWrapper>
|
|
622
|
+
<ComponentToRender {...props} />
|
|
623
|
+
</TestWrapper>
|
|
624
|
+
);
|
|
625
|
+
|
|
626
|
+
expect(screen.getByTestId('sms-content')).toHaveTextContent('Resolved SMS for preview');
|
|
627
|
+
});
|
|
628
|
+
|
|
629
|
+
it('on RCS tab (default), renders RCS preview when dual tabs are shown', () => {
|
|
630
|
+
const props = {
|
|
631
|
+
...defaultProps,
|
|
632
|
+
channel: CHANNELS.RCS,
|
|
633
|
+
content: { rcsTitle: 'Only RCS pane' },
|
|
634
|
+
smsFallbackContent: { content: 'SMS', templateContent: 'SMS' },
|
|
635
|
+
activePreviewTab: PREVIEW_TAB_RCS,
|
|
636
|
+
onPreviewTabChange: jest.fn(),
|
|
637
|
+
};
|
|
638
|
+
|
|
639
|
+
render(
|
|
640
|
+
<TestWrapper>
|
|
641
|
+
<ComponentToRender {...props} />
|
|
642
|
+
</TestWrapper>
|
|
643
|
+
);
|
|
644
|
+
|
|
645
|
+
expect(screen.getByTestId('rcs-preview')).toBeInTheDocument();
|
|
646
|
+
expect(screen.getByTestId('rcs-content')).toHaveTextContent(/Only RCS pane/);
|
|
647
|
+
});
|
|
648
|
+
});
|
|
550
649
|
});
|
|
551
650
|
|
|
552
651
|
describe('Channel Routing - INAPP', () => {
|
|
@@ -238,6 +238,24 @@ describe('CommonTestAndPreview', () => {
|
|
|
238
238
|
});
|
|
239
239
|
});
|
|
240
240
|
|
|
241
|
+
it('should call getSenderDetailsRequested for RCS and SMS when channel is RCS', async () => {
|
|
242
|
+
render(
|
|
243
|
+
<TestWrapper>
|
|
244
|
+
<CommonTestAndPreview {...defaultProps} channel={CHANNELS.RCS} />
|
|
245
|
+
</TestWrapper>
|
|
246
|
+
);
|
|
247
|
+
await waitFor(() => {
|
|
248
|
+
expect(mockActions.getSenderDetailsRequested).toHaveBeenCalledWith({
|
|
249
|
+
channel: CHANNELS.RCS,
|
|
250
|
+
orgUnitId: -1,
|
|
251
|
+
});
|
|
252
|
+
expect(mockActions.getSenderDetailsRequested).toHaveBeenCalledWith({
|
|
253
|
+
channel: CHANNELS.SMS,
|
|
254
|
+
orgUnitId: -1,
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
|
|
241
259
|
it('should not call getSenderDetailsRequested when channel is INAPP', async () => {
|
|
242
260
|
render(
|
|
243
261
|
<TestWrapper>
|
|
@@ -296,7 +314,7 @@ describe('CommonTestAndPreview', () => {
|
|
|
296
314
|
});
|
|
297
315
|
expect(lastSendTestMessageProps).toBeDefined();
|
|
298
316
|
expect(lastSendTestMessageProps.deliverySettings).toBeDefined();
|
|
299
|
-
expect(lastSendTestMessageProps.
|
|
317
|
+
expect(lastSendTestMessageProps.senderDetailsByChannel).toEqual(senderDetailsByChannel);
|
|
300
318
|
expect(lastSendTestMessageProps.wecrmAccounts).toEqual([]);
|
|
301
319
|
expect(typeof lastSendTestMessageProps.onSaveDeliverySettings).toBe('function');
|
|
302
320
|
expect(lastSendTestMessageProps.isLoadingSenderDetails).toBe(false);
|