@capillarytech/creatives-library 9.0.14 → 9.0.15-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/constants/unified.js +32 -0
  2. package/global-styles.js +1 -1
  3. package/package.json +1 -1
  4. package/services/tests/api.test.js +35 -20
  5. package/utils/common.js +8 -0
  6. package/utils/commonUtils.js +19 -1
  7. package/utils/rcsPayloadUtils.js +92 -0
  8. package/utils/templateVarUtils.js +201 -0
  9. package/utils/tests/rcsPayloadUtils.test.js +226 -0
  10. package/utils/tests/templateVarUtils.test.js +204 -0
  11. package/v2Components/CapActionButton/constants.js +7 -0
  12. package/v2Components/CapActionButton/index.js +168 -109
  13. package/v2Components/CapActionButton/index.scss +156 -5
  14. package/v2Components/CapActionButton/messages.js +19 -3
  15. package/v2Components/CapActionButton/tests/index.test.js +42 -18
  16. package/v2Components/CapImageUpload/index.js +2 -2
  17. package/v2Components/CapTagList/index.js +10 -0
  18. package/v2Components/CommonTestAndPreview/CustomValuesEditor.js +70 -48
  19. package/v2Components/CommonTestAndPreview/DeliverySettings/DeliverySettings.scss +8 -2
  20. package/v2Components/CommonTestAndPreview/DeliverySettings/ModifyDeliverySettings.js +214 -21
  21. package/v2Components/CommonTestAndPreview/DeliverySettings/constants.js +16 -0
  22. package/v2Components/CommonTestAndPreview/DeliverySettings/index.js +83 -9
  23. package/v2Components/CommonTestAndPreview/DeliverySettings/messages.js +30 -0
  24. package/v2Components/CommonTestAndPreview/DeliverySettings/utils/parseSenderDetailsResponse.js +60 -11
  25. package/v2Components/CommonTestAndPreview/SendTestMessage.js +10 -5
  26. package/v2Components/CommonTestAndPreview/UnifiedPreview/RcsPreviewContent.js +201 -23
  27. package/v2Components/CommonTestAndPreview/UnifiedPreview/_unifiedPreview.scss +355 -76
  28. package/v2Components/CommonTestAndPreview/UnifiedPreview/index.js +155 -8
  29. package/v2Components/CommonTestAndPreview/_commonTestAndPreview.scss +11 -0
  30. package/v2Components/CommonTestAndPreview/constants.js +38 -2
  31. package/v2Components/CommonTestAndPreview/index.js +761 -222
  32. package/v2Components/CommonTestAndPreview/messages.js +45 -3
  33. package/v2Components/CommonTestAndPreview/previewApiUtils.js +59 -0
  34. package/v2Components/CommonTestAndPreview/sagas.js +25 -6
  35. package/v2Components/CommonTestAndPreview/tests/CommonTestAndPreview.addTestCustomer.test.js +1 -0
  36. package/v2Components/CommonTestAndPreview/tests/CustomValuesEditor.test.js +284 -267
  37. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/ModifyDeliverySettings.test.js +231 -65
  38. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/index.test.js +118 -5
  39. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/utils/parseSenderDetailsResponse.test.js +341 -0
  40. package/v2Components/CommonTestAndPreview/tests/PreviewSection.test.js +8 -1
  41. package/v2Components/CommonTestAndPreview/tests/SendTestMessage.test.js +34 -13
  42. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/RcsPreviewContent.test.js +281 -283
  43. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/index.test.js +199 -1
  44. package/v2Components/CommonTestAndPreview/tests/index.test.js +133 -4
  45. package/v2Components/CommonTestAndPreview/tests/previewApiUtils.test.js +67 -0
  46. package/v2Components/CommonTestAndPreview/tests/sagas.test.js +31 -24
  47. package/v2Components/CommonTestAndPreview/utils.js +84 -0
  48. package/v2Components/FormBuilder/Classic.js +4487 -0
  49. package/v2Components/FormBuilder/Functional/FormBuilderShell.js +366 -0
  50. package/v2Components/FormBuilder/Functional/channels/registry.js +17 -0
  51. package/v2Components/FormBuilder/Functional/channels/sms/buildSubmitPayload.js +9 -0
  52. package/v2Components/FormBuilder/Functional/channels/sms/config.js +30 -0
  53. package/v2Components/FormBuilder/Functional/channels/sms/getEditorErrorDescriptor.js +46 -0
  54. package/v2Components/FormBuilder/Functional/channels/sms/getLiquidContent.js +13 -0
  55. package/v2Components/FormBuilder/Functional/channels/sms/index.js +22 -0
  56. package/v2Components/FormBuilder/Functional/channels/sms/tests/getEditorErrorDescriptor.test.js +52 -0
  57. package/v2Components/FormBuilder/Functional/channels/sms/tests/getLiquidContent.test.js +25 -0
  58. package/v2Components/FormBuilder/Functional/channels/sms/tests/validate.test.js +87 -0
  59. package/v2Components/FormBuilder/Functional/channels/sms/validate.js +89 -0
  60. package/v2Components/FormBuilder/Functional/constants.js +42 -0
  61. package/v2Components/FormBuilder/Functional/core/schema/fieldRegistry.js +38 -0
  62. package/v2Components/FormBuilder/Functional/core/schema/initializeFormState.js +85 -0
  63. package/v2Components/FormBuilder/Functional/core/store/formReducer.js +81 -0
  64. package/v2Components/FormBuilder/Functional/core/store/selectors.js +30 -0
  65. package/v2Components/FormBuilder/Functional/core/store/toLegacyFormData.js +91 -0
  66. package/v2Components/FormBuilder/Functional/index.js +26 -0
  67. package/v2Components/FormBuilder/Functional/layout/FieldSlot.js +59 -0
  68. package/v2Components/FormBuilder/Functional/layout/SchemaForm.js +31 -0
  69. package/v2Components/FormBuilder/Functional/layout/Section.js +116 -0
  70. package/v2Components/FormBuilder/Functional/renderers/smsRenderers.js +258 -0
  71. package/v2Components/FormBuilder/Functional/tests/channelRegistry.test.js +21 -0
  72. package/v2Components/FormBuilder/Functional/tests/fieldRegistry.test.js +65 -0
  73. package/v2Components/FormBuilder/Functional/tests/fieldSlot.test.js +97 -0
  74. package/v2Components/FormBuilder/Functional/tests/fixtures/smsParityCases.js +192 -0
  75. package/v2Components/FormBuilder/Functional/tests/formReducer.test.js +129 -0
  76. package/v2Components/FormBuilder/Functional/tests/initializeFormState.test.js +132 -0
  77. package/v2Components/FormBuilder/Functional/tests/schemaForm.test.js +40 -0
  78. package/v2Components/FormBuilder/Functional/tests/section.test.js +99 -0
  79. package/v2Components/FormBuilder/Functional/tests/selectors.test.js +67 -0
  80. package/v2Components/FormBuilder/Functional/tests/sms.crossFlowParity.test.js +155 -0
  81. package/v2Components/FormBuilder/Functional/tests/sms.liquid.test.js +172 -0
  82. package/v2Components/FormBuilder/Functional/tests/sms.rollout.test.js +122 -0
  83. package/v2Components/FormBuilder/Functional/tests/sms.shell.parity.test.js +329 -0
  84. package/v2Components/FormBuilder/Functional/tests/smsRenderers.test.js +160 -0
  85. package/v2Components/FormBuilder/Functional/tests/toLegacyFormData.test.js +95 -0
  86. package/v2Components/FormBuilder/_formBuilder.scss +5 -0
  87. package/v2Components/FormBuilder/index.js +41 -4479
  88. package/v2Components/FormBuilder/tests/__snapshots__/sms.characterization.test.js.snap +114 -0
  89. package/v2Components/FormBuilder/tests/entryGate.test.js +106 -0
  90. package/v2Components/FormBuilder/tests/sms.characterization.test.js +336 -0
  91. package/v2Components/SmsFallback/SmsFallbackLocalSelector.js +91 -0
  92. package/v2Components/SmsFallback/constants.js +94 -0
  93. package/v2Components/SmsFallback/index.js +958 -0
  94. package/v2Components/SmsFallback/index.scss +266 -0
  95. package/v2Components/SmsFallback/messages.js +78 -0
  96. package/v2Components/SmsFallback/smsFallbackUtils.js +120 -0
  97. package/v2Components/SmsFallback/tests/SmsFallbackLocalSelector.test.js +50 -0
  98. package/v2Components/SmsFallback/tests/rcsSmsFallback.acceptance.test.js +147 -0
  99. package/v2Components/SmsFallback/tests/smsFallbackHandlers.test.js +304 -0
  100. package/v2Components/SmsFallback/tests/smsFallbackUi.test.js +208 -0
  101. package/v2Components/SmsFallback/tests/smsFallbackUtils.test.js +309 -0
  102. package/v2Components/SmsFallback/tests/useLocalTemplateList.test.js +422 -0
  103. package/v2Components/SmsFallback/useLocalTemplateList.js +92 -0
  104. package/v2Components/TemplatePreview/_templatePreview.scss +41 -22
  105. package/v2Components/TemplatePreview/constants.js +2 -0
  106. package/v2Components/TemplatePreview/index.js +143 -31
  107. package/v2Components/TemplatePreview/tests/index.test.js +142 -0
  108. package/v2Components/TestAndPreviewSlidebox/CustomValuesEditor.js +6 -6
  109. package/v2Components/TestAndPreviewSlidebox/index.js +13 -1
  110. package/v2Components/TestAndPreviewSlidebox/sagas.js +11 -4
  111. package/v2Components/TestAndPreviewSlidebox/tests/saga.test.js +3 -1
  112. package/v2Components/VarSegmentMessageEditor/constants.js +2 -0
  113. package/v2Components/VarSegmentMessageEditor/index.js +125 -0
  114. package/v2Components/VarSegmentMessageEditor/index.scss +46 -0
  115. package/v2Containers/CommunicationFlow/Tests/CommunicationFlow.test.js +4 -1
  116. package/v2Containers/CommunicationFlow/steps/DeliverySettingsStep/Tests/DeliverySettingsSection.test.js +4 -0
  117. package/v2Containers/CommunicationFlow/steps/DeliverySettingsStep/Tests/SenderDetails.test.js +20 -20
  118. package/v2Containers/CreativesContainer/CreativesSlideBoxWrapper.js +17 -0
  119. package/v2Containers/CreativesContainer/SlideBoxContent.js +36 -4
  120. package/v2Containers/CreativesContainer/SlideBoxFooter.js +14 -5
  121. package/v2Containers/CreativesContainer/SlideBoxHeader.js +36 -5
  122. package/v2Containers/CreativesContainer/constants.js +11 -0
  123. package/v2Containers/CreativesContainer/embeddedSlideboxUtils.js +79 -0
  124. package/v2Containers/CreativesContainer/index.js +323 -104
  125. package/v2Containers/CreativesContainer/index.scss +83 -1
  126. package/v2Containers/CreativesContainer/tests/SlideBoxContent.localTemplates.test.js +90 -0
  127. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +79 -34
  128. package/v2Containers/CreativesContainer/tests/SlideBoxHeader.test.js +79 -16
  129. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +8 -0
  130. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxHeader.test.js.snap +333 -90
  131. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +20 -15
  132. package/v2Containers/CreativesContainer/tests/embeddedSlideboxUtils.test.js +258 -0
  133. package/v2Containers/CreativesContainer/tests/index.test.js +71 -9
  134. package/v2Containers/CreativesContainer/tests/useLocalTemplatesProp.test.js +125 -0
  135. package/v2Containers/MobilePush/Create/test/saga.test.js +2 -2
  136. package/v2Containers/Rcs/constants.js +131 -11
  137. package/v2Containers/Rcs/index.js +2602 -807
  138. package/v2Containers/Rcs/index.scss +289 -8
  139. package/v2Containers/Rcs/messages.js +34 -3
  140. package/v2Containers/Rcs/rcsLibraryHydrationUtils.js +227 -0
  141. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +73535 -38537
  142. package/v2Containers/Rcs/tests/__snapshots__/utils.test.js.snap +0 -8
  143. package/v2Containers/Rcs/tests/index.test.js +147 -36
  144. package/v2Containers/Rcs/tests/mockData.js +38 -0
  145. package/v2Containers/Rcs/tests/rcsLibraryHydrationUtils.test.js +318 -0
  146. package/v2Containers/Rcs/tests/utils.test.js +646 -30
  147. package/v2Containers/Rcs/utils.js +478 -11
  148. package/v2Containers/Sms/Create/index.js +115 -48
  149. package/v2Containers/Sms/smsFormDataHelpers.js +67 -0
  150. package/v2Containers/Sms/tests/smsFormDataHelpers.test.js +253 -0
  151. package/v2Containers/SmsTrai/Create/index.js +9 -4
  152. package/v2Containers/SmsTrai/Edit/constants.js +2 -0
  153. package/v2Containers/SmsTrai/Edit/index.js +678 -169
  154. package/v2Containers/SmsTrai/Edit/index.scss +126 -0
  155. package/v2Containers/SmsTrai/Edit/messages.js +14 -4
  156. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +5615 -3014
  157. package/v2Containers/SmsWrapper/index.js +37 -8
  158. package/v2Containers/TagList/index.js +6 -0
  159. package/v2Containers/Templates/TemplatesActionBar.js +101 -0
  160. package/v2Containers/Templates/_templates.scss +171 -12
  161. package/v2Containers/Templates/actions.js +11 -0
  162. package/v2Containers/Templates/constants.js +2 -0
  163. package/v2Containers/Templates/index.js +125 -55
  164. package/v2Containers/Templates/sagas.js +57 -13
  165. package/v2Containers/Templates/tests/TemplatesActionBar.test.js +120 -0
  166. package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +1060 -1015
  167. package/v2Containers/Templates/tests/sagas.test.js +199 -16
  168. package/v2Containers/Templates/tests/smsTemplatesListApi.test.js +180 -0
  169. package/v2Containers/Templates/utils/smsTemplatesListApi.js +79 -0
  170. package/v2Containers/TemplatesV2/TemplatesV2.style.js +72 -1
  171. package/v2Containers/TemplatesV2/index.js +86 -23
  172. package/v2Containers/TemplatesV2/tests/TemplatesV2.localTemplates.test.js +131 -0
  173. package/v2Containers/WeChat/MapTemplates/test/saga.test.js +9 -9
  174. package/v2Containers/Whatsapp/index.js +3 -20
  175. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +578 -34
@@ -0,0 +1,309 @@
1
+ import {
2
+ buildFallbackDataFromTemplate,
3
+ mapFallbackValueToEditTemplateData,
4
+ getBaseFromSmsTraiFormData,
5
+ getSmsFallbackCardDisplayContent,
6
+ resolveContentFromTraiBase,
7
+ filterSmsTemplatesByCategory,
8
+ buildFallbackDataFromCreativesPayload,
9
+ } from '../smsFallbackUtils';
10
+ import { SMS_CATEGORY_FILTERS } from '../constants';
11
+
12
+ describe('smsFallbackUtils', () => {
13
+ describe('buildFallbackDataFromTemplate', () => {
14
+ it('returns safe defaults when template is nullish', () => {
15
+ expect(buildFallbackDataFromTemplate(null)).toEqual({
16
+ smsTemplateId: '',
17
+ templateName: '',
18
+ content: '',
19
+ templateContent: '',
20
+ senderId: '',
21
+ registeredSenderIds: [],
22
+ unicodeValidity: true,
23
+ });
24
+ });
25
+
26
+ it('maps template versions.base and header sender list', () => {
27
+ const template = {
28
+ name: 'My SMS',
29
+ versions: {
30
+ base: {
31
+ 'sms-editor': 'Hello {{1}}',
32
+ header: ['S1', 'S2'],
33
+ 'unicode-validity': false,
34
+ template_id: 'tid',
35
+ },
36
+ },
37
+ };
38
+ expect(buildFallbackDataFromTemplate(template)).toEqual({
39
+ smsTemplateId: 'tid',
40
+ templateName: 'My SMS',
41
+ content: 'Hello {{1}}',
42
+ templateContent: 'Hello {{1}}',
43
+ senderId: 'S1',
44
+ registeredSenderIds: ['S1', 'S2'],
45
+ unicodeValidity: false,
46
+ });
47
+ });
48
+
49
+ it('falls back to senderId when header is missing', () => {
50
+ const template = {
51
+ _id: '',
52
+ name: '',
53
+ versions: { base: { 'sms-editor': 'x', senderId: 'SID' } },
54
+ };
55
+ expect(buildFallbackDataFromTemplate(template).senderId).toBe('SID');
56
+ expect(buildFallbackDataFromTemplate(template).registeredSenderIds).toEqual([]);
57
+ });
58
+
59
+ it('defaults unicodeValidity to true when not a boolean', () => {
60
+ const template = {
61
+ versions: { base: { 'sms-editor': '' } },
62
+ };
63
+ expect(buildFallbackDataFromTemplate(template).unicodeValidity).toBe(true);
64
+ });
65
+
66
+ it('uses versions.base.template_name when root name is empty (DLT detail shape)', () => {
67
+ const template = {
68
+ _id: 'dlt1',
69
+ name: '',
70
+ versions: {
71
+ base: {
72
+ template_name: 'DLT Registered Name',
73
+ 'sms-editor': 'Hi',
74
+ header: ['H1'],
75
+ },
76
+ },
77
+ };
78
+ expect(buildFallbackDataFromTemplate(template).templateName).toBe('DLT Registered Name');
79
+ });
80
+ });
81
+
82
+ describe('getSmsFallbackCardDisplayContent', () => {
83
+ it('returns raw template when rcsSmsFallbackVarMapped is empty', () => {
84
+ expect(
85
+ getSmsFallbackCardDisplayContent({
86
+ templateContent: 'A {#var#} B',
87
+ rcsSmsFallbackVarMapped: {},
88
+ }),
89
+ ).toBe('A {#var#} B');
90
+ });
91
+
92
+ it('substitutes slot values like preview when var map is set', () => {
93
+ expect(
94
+ getSmsFallbackCardDisplayContent({
95
+ templateContent: 'Hi {{name}}',
96
+ rcsSmsFallbackVarMapped: { '{{name}}_1': 'Pat' },
97
+ }),
98
+ ).toBe('Hi Pat');
99
+ });
100
+
101
+ it('shows raw {#var#} in card when slots saved empty (DLT, no labels)', () => {
102
+ expect(
103
+ getSmsFallbackCardDisplayContent({
104
+ templateContent: 'Balance {#var#}',
105
+ rcsSmsFallbackVarMapped: { '{#var#}_1': '' },
106
+ }),
107
+ ).toBe('Balance {#var#}');
108
+ });
109
+ });
110
+
111
+ describe('mapFallbackValueToEditTemplateData', () => {
112
+ it('returns null when source is missing', () => {
113
+ expect(mapFallbackValueToEditTemplateData(null)).toBeNull();
114
+ expect(mapFallbackValueToEditTemplateData(undefined)).toBeNull();
115
+ });
116
+
117
+ it('maps content, optional header and unicode flag', () => {
118
+ const source = {
119
+ smsTemplateId: 'id1',
120
+ templateName: 'N',
121
+ templateContent: 'body',
122
+ registeredSenderIds: ['h1'],
123
+ unicodeValidity: false,
124
+ };
125
+ expect(mapFallbackValueToEditTemplateData(source)).toEqual({
126
+ _id: 'id1',
127
+ name: 'N',
128
+ versions: {
129
+ base: {
130
+ 'sms-editor': 'body',
131
+ template_name: 'N',
132
+ header: ['h1'],
133
+ 'unicode-validity': false,
134
+ },
135
+ },
136
+ });
137
+ });
138
+
139
+ it('uses content when templateContent is empty', () => {
140
+ const source = {
141
+ smsTemplateId: 'x',
142
+ templateName: 'y',
143
+ content: 'from-content',
144
+ };
145
+ expect(mapFallbackValueToEditTemplateData(source).versions.base['sms-editor']).toBe('from-content');
146
+ });
147
+
148
+ it('omits header when registeredSenderIds is empty', () => {
149
+ const source = {
150
+ smsTemplateId: 'x',
151
+ templateName: 'y',
152
+ templateContent: 't',
153
+ registeredSenderIds: [],
154
+ };
155
+ expect(mapFallbackValueToEditTemplateData(source).versions.base.header).toBeUndefined();
156
+ });
157
+
158
+ it('omits unicode-validity when value is not a boolean', () => {
159
+ const source = {
160
+ smsTemplateId: 'x',
161
+ templateName: 'y',
162
+ templateContent: 't',
163
+ unicodeValidity: 'yes',
164
+ };
165
+ expect(mapFallbackValueToEditTemplateData(source).versions.base['unicode-validity']).toBeUndefined();
166
+ });
167
+ });
168
+
169
+ describe('getBaseFromSmsTraiFormData', () => {
170
+ it('reads versions.base', () => {
171
+ const fd = { versions: { base: { 'sms-editor': 'a' } } };
172
+ expect(getBaseFromSmsTraiFormData(fd)).toEqual({ base: { 'sms-editor': 'a' } });
173
+ });
174
+
175
+ it('falls back to value.base', () => {
176
+ const fd = { value: { base: { 'sms-editor': 'b' } } };
177
+ expect(getBaseFromSmsTraiFormData(fd)).toEqual({ base: { 'sms-editor': 'b' } });
178
+ });
179
+
180
+ it('uses empty base when neither path exists', () => {
181
+ expect(getBaseFromSmsTraiFormData({})).toEqual({ base: {} });
182
+ });
183
+
184
+ it('normalizes null versions.base to empty object', () => {
185
+ expect(getBaseFromSmsTraiFormData({ versions: { base: null } })).toEqual({ base: {} });
186
+ });
187
+ });
188
+
189
+ describe('resolveContentFromTraiBase', () => {
190
+ it('returns sms-editor string', () => {
191
+ expect(resolveContentFromTraiBase({ 'sms-editor': 'z' })).toBe('z');
192
+ });
193
+
194
+ it('returns empty string when missing', () => {
195
+ expect(resolveContentFromTraiBase({})).toBe('');
196
+ });
197
+
198
+ it('returns empty string for nullish base', () => {
199
+ expect(resolveContentFromTraiBase(null)).toBe('');
200
+ expect(resolveContentFromTraiBase(undefined)).toBe('');
201
+ });
202
+ });
203
+
204
+ describe('filterSmsTemplatesByCategory', () => {
205
+ const templates = [
206
+ { versions: { base: { type: 'Promo' } } },
207
+ { versions: { base: { type: 'Explicit' } } },
208
+ ];
209
+
210
+ it('returns empty array for non-array input', () => {
211
+ expect(filterSmsTemplatesByCategory(null, SMS_CATEGORY_FILTERS.PROMOTIONAL)).toEqual([]);
212
+ });
213
+
214
+ it('returns all templates for ALL or missing filter', () => {
215
+ expect(filterSmsTemplatesByCategory(templates, SMS_CATEGORY_FILTERS.ALL)).toEqual(templates);
216
+ expect(filterSmsTemplatesByCategory(templates, null)).toEqual(templates);
217
+ });
218
+
219
+ it('filters by lowercase type substring', () => {
220
+ const filtered = filterSmsTemplatesByCategory(templates, SMS_CATEGORY_FILTERS.PROMOTIONAL);
221
+ expect(filtered).toHaveLength(1);
222
+ expect(filtered[0].versions.base.type).toBe('Promo');
223
+ });
224
+
225
+ it('treats missing type as empty string for filtering', () => {
226
+ const mixed = [{}, { versions: { base: {} } }];
227
+ expect(filterSmsTemplatesByCategory(mixed, SMS_CATEGORY_FILTERS.PROMOTIONAL)).toEqual([]);
228
+ });
229
+ });
230
+
231
+ describe('buildFallbackDataFromCreativesPayload', () => {
232
+ it('returns null for missing or non-SMS channel', () => {
233
+ expect(buildFallbackDataFromCreativesPayload(null)).toBeNull();
234
+ expect(buildFallbackDataFromCreativesPayload({ channel: 'RCS' })).toBeNull();
235
+ });
236
+
237
+ it('maps SMS payload with messageBody and templateConfigs', () => {
238
+ const creativesData = {
239
+ channel: 'SMS',
240
+ messageBody: 'Hello',
241
+ templateConfigs: {
242
+ templateId: 99,
243
+ templateName: 'T',
244
+ template: 'Template str',
245
+ registeredSenderIds: ['R1'],
246
+ },
247
+ };
248
+ expect(buildFallbackDataFromCreativesPayload(creativesData)).toEqual({
249
+ smsTemplateId: '99',
250
+ templateName: 'T',
251
+ content: 'Hello',
252
+ templateContent: 'Template str',
253
+ senderId: 'R1',
254
+ registeredSenderIds: ['R1'],
255
+ unicodeValidity: true,
256
+ });
257
+ });
258
+
259
+ it('uses template string as body when messageBody is not a string', () => {
260
+ const creativesData = {
261
+ channel: 'SMS',
262
+ messageBody: null,
263
+ templateConfigs: {
264
+ template: 'only-template',
265
+ },
266
+ };
267
+ const out = buildFallbackDataFromCreativesPayload(creativesData);
268
+ expect(out.content).toBe('only-template');
269
+ expect(out.templateContent).toBe('only-template');
270
+ });
271
+
272
+ it('stringifies templateId and templateName when present', () => {
273
+ const creativesData = {
274
+ channel: 'SMS',
275
+ messageBody: 'm',
276
+ templateConfigs: { templateId: 0, templateName: null },
277
+ };
278
+ const out = buildFallbackDataFromCreativesPayload(creativesData);
279
+ expect(out.smsTemplateId).toBe('0');
280
+ expect(out.templateName).toBe('');
281
+ });
282
+
283
+ it('uses empty templateConfigs when null', () => {
284
+ const creativesData = {
285
+ channel: 'SMS',
286
+ messageBody: 'only-body',
287
+ templateConfigs: null,
288
+ };
289
+ const out = buildFallbackDataFromCreativesPayload(creativesData);
290
+ expect(out.templateContent).toBe('only-body');
291
+ expect(out.content).toBe('only-body');
292
+ });
293
+
294
+ it('falls back to templateConfigs.senderId when registeredSenderIds is empty', () => {
295
+ const creativesData = {
296
+ channel: 'SMS',
297
+ messageBody: 'hello',
298
+ templateConfigs: {
299
+ template: 'hello',
300
+ senderId: 'SID_123',
301
+ registeredSenderIds: [],
302
+ },
303
+ };
304
+ const out = buildFallbackDataFromCreativesPayload(creativesData);
305
+ expect(out.senderId).toBe('SID_123');
306
+ expect(out.registeredSenderIds).toEqual([]);
307
+ });
308
+ });
309
+ });