@pushwoosh/dumb-components 2.9.12 → 2.9.13
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 +4 -6
- package/Banner/__tests__/Banner.test.d.ts +0 -1
- package/Banner/__tests__/Banner.test.js +0 -57
- package/Button/__tests__/Button.test.d.ts +0 -1
- package/Button/__tests__/Button.test.js +0 -27
- package/Calendar/__tests__/CalendarMonthSlider.test.d.ts +0 -1
- package/Calendar/__tests__/CalendarMonthSlider.test.js +0 -85
- package/Calendar/__tests__/CellBox.test.d.ts +0 -1
- package/Calendar/__tests__/CellBox.test.js +0 -34
- package/Calendar/__tests__/helpers.test.d.ts +0 -1
- package/Calendar/__tests__/helpers.test.js +0 -143
- package/CardMetric/__tests__/CardMetric.test.d.ts +0 -1
- package/CardMetric/__tests__/CardMetric.test.js +0 -31
- package/Chip/__tests__/Chip.test.d.ts +0 -1
- package/Chip/__tests__/Chip.test.js +0 -101
- package/DateTimePicker/__tests__/YearView.test.d.ts +0 -1
- package/DateTimePicker/__tests__/YearView.test.js +0 -15
- package/DropdownMenu/__tests__/DropdownMenuItem.test.d.ts +0 -1
- package/DropdownMenu/__tests__/DropdownMenuItem.test.js +0 -109
- package/EditableField/__tests__/EditableField.test.d.ts +0 -1
- package/EditableField/__tests__/EditableField.test.js +0 -19
- package/EmailTemplatePreview/__tests__/clickMap.test.d.ts +0 -1
- package/EmailTemplatePreview/__tests__/clickMap.test.js +0 -168
- package/ExternalImagePreview/__tests__/ExternalImagePreview.test.d.ts +0 -1
- package/ExternalImagePreview/__tests__/ExternalImagePreview.test.js +0 -18
- package/InboxPreview/__tests__/helpers.test.d.ts +0 -1
- package/InboxPreview/__tests__/helpers.test.js +0 -201
- package/NativeRichMediaPreview/__tests__/NativeRichMediaPreview.test.d.ts +0 -1
- package/NativeRichMediaPreview/__tests__/NativeRichMediaPreview.test.js +0 -81
- package/PageHeader/__tests__/PageHeader.test.d.ts +0 -1
- package/PageHeader/__tests__/PageHeader.test.js +0 -37
- package/PushPreview/__tests__/PushPreview.test.d.ts +0 -1
- package/PushPreview/__tests__/PushPreview.test.js +0 -26
- package/PushStoriesPreview/__tests__/PushStoriesPreview.test.d.ts +0 -1
- package/PushStoriesPreview/__tests__/PushStoriesPreview.test.js +0 -234
- package/RadioCard/__tests__/RadioCard.test.d.ts +0 -1
- package/RadioCard/__tests__/RadioCard.test.js +0 -23
- package/RichmediaPreview/__tests__/RichmediaPreview.test.d.ts +0 -1
- package/RichmediaPreview/__tests__/RichmediaPreview.test.js +0 -21
- package/SandboxedHtmlFrame/__tests__/SandboxedHtmlFrame.test.d.ts +0 -1
- package/SandboxedHtmlFrame/__tests__/SandboxedHtmlFrame.test.js +0 -57
- package/Skeleton/__tests__/Skeleton.test.d.ts +0 -1
- package/Skeleton/__tests__/Skeleton.test.js +0 -101
- package/Spinner/__tests__/Spinner.test.d.ts +0 -1
- package/Spinner/__tests__/Spinner.test.js +0 -15
- package/Switch/__tests__/Switch.test.d.ts +0 -1
- package/Switch/__tests__/Switch.test.js +0 -44
- package/Tabs/__tests__/TabBar.test.d.ts +0 -1
- package/Tabs/__tests__/TabBar.test.js +0 -36
- package/Toast/__tests__/Toast.test.d.ts +0 -1
- package/Toast/__tests__/Toast.test.js +0 -20
- package/WhatsAppPreview/__tests__/WhatsAppAttachment.test.d.ts +0 -1
- package/WhatsAppPreview/__tests__/WhatsAppAttachment.test.js +0 -53
- package/WhatsAppPreview/__tests__/WhatsAppPreview.test.d.ts +0 -1
- package/WhatsAppPreview/__tests__/WhatsAppPreview.test.js +0 -55
- package/WhatsAppPreview/__tests__/attachment.test.d.ts +0 -1
- package/WhatsAppPreview/__tests__/attachment.test.js +0 -103
- package/WhatsAppPreview/__tests__/parseWhatsAppMarkup.test.d.ts +0 -1
- package/WhatsAppPreview/__tests__/parseWhatsAppMarkup.test.js +0 -59
- package/helpers/__tests__/barcodeUrl.test.d.ts +0 -1
- package/helpers/__tests__/barcodeUrl.test.js +0 -43
- package/helpers/__tests__/timezones.test.d.ts +0 -1
- package/helpers/__tests__/timezones.test.js +0 -188
- package/hooks/__tests__/useLayer.test.d.ts +0 -1
- package/hooks/__tests__/useLayer.test.js +0 -71
- package/polyglot/__tests__/filters.test.d.ts +0 -1
- package/polyglot/__tests__/filters.test.js +0 -152
- package/polyglot/__tests__/helpers.test.d.ts +0 -1
- package/polyglot/__tests__/helpers.test.js +0 -176
- package/polyglot/__tests__/parser.test.d.ts +0 -1
- package/polyglot/__tests__/parser.test.js +0 -108
- package/polyglot/__tests__/render.test.d.ts +0 -1
- package/polyglot/__tests__/render.test.js +0 -285
- package/shared/dropdownField/__tests__/useDropdownPosition.test.d.ts +0 -1
- package/shared/dropdownField/__tests__/useDropdownPosition.test.js +0 -60
- package/shared/dynamicContent/__tests__/token.test.d.ts +0 -1
- package/shared/dynamicContent/__tests__/token.test.js +0 -32
|
@@ -1,285 +0,0 @@
|
|
|
1
|
-
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import '@testing-library/jest-dom';
|
|
3
|
-
import { render, screen } from '@testing-library/react';
|
|
4
|
-
import { stringToAst } from '../liquid/parser';
|
|
5
|
-
import { renderToString, renderToReact } from '../liquid/render';
|
|
6
|
-
const renderString = (template, values = {}, language = 'en') => {
|
|
7
|
-
const ast = stringToAst(template);
|
|
8
|
-
const context = {
|
|
9
|
-
values,
|
|
10
|
-
language,
|
|
11
|
-
timezone: 'UTC'
|
|
12
|
-
};
|
|
13
|
-
return renderToString(ast, context);
|
|
14
|
-
};
|
|
15
|
-
const renderReactNodes = (template, values = {}, language = 'en') => {
|
|
16
|
-
const ast = stringToAst(template);
|
|
17
|
-
const context = {
|
|
18
|
-
values,
|
|
19
|
-
language,
|
|
20
|
-
timezone: 'UTC'
|
|
21
|
-
};
|
|
22
|
-
return renderToReact(ast, context);
|
|
23
|
-
};
|
|
24
|
-
describe('renderToString', () => {
|
|
25
|
-
describe('text rendering', () => {
|
|
26
|
-
test('renders plain text', () => {
|
|
27
|
-
expect(renderString('Hello World')).toBe('Hello World');
|
|
28
|
-
});
|
|
29
|
-
test('renders empty string', () => {
|
|
30
|
-
expect(renderString('')).toBe('');
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
describe('variable rendering', () => {
|
|
34
|
-
test('renders simple variable', () => {
|
|
35
|
-
expect(renderString('Hello {{ name }}', {
|
|
36
|
-
name: 'John'
|
|
37
|
-
})).toBe('Hello John');
|
|
38
|
-
});
|
|
39
|
-
test('renders multiple variables', () => {
|
|
40
|
-
expect(renderString('{{ greeting }} {{ name }}', {
|
|
41
|
-
greeting: 'Hi',
|
|
42
|
-
name: 'Jane'
|
|
43
|
-
})).toBe('Hi Jane');
|
|
44
|
-
});
|
|
45
|
-
test('renders variable with filter', () => {
|
|
46
|
-
expect(renderString('{{ name | upperCase }}', {
|
|
47
|
-
name: 'john'
|
|
48
|
-
})).toBe('JOHN');
|
|
49
|
-
});
|
|
50
|
-
test('renders variable with multiple filters', () => {
|
|
51
|
-
expect(renderString('{{ name | capitalize }}', {
|
|
52
|
-
name: 'john'
|
|
53
|
-
})).toBe('John');
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
describe('if control rendering', () => {
|
|
57
|
-
test('renders if block when true', () => {
|
|
58
|
-
expect(renderString('{% if active == true %}yes{% endif %}', {
|
|
59
|
-
active: true
|
|
60
|
-
})).toBe('yes');
|
|
61
|
-
});
|
|
62
|
-
test('renders nothing when false', () => {
|
|
63
|
-
expect(renderString('{% if active == true %}yes{% endif %}', {
|
|
64
|
-
active: false
|
|
65
|
-
})).toBe('');
|
|
66
|
-
});
|
|
67
|
-
test('renders else block when false', () => {
|
|
68
|
-
expect(renderString('{% if active == true %}yes{% else %}no{% endif %}', {
|
|
69
|
-
active: false
|
|
70
|
-
})).toBe('no');
|
|
71
|
-
});
|
|
72
|
-
test('handles numeric comparison', () => {
|
|
73
|
-
expect(renderString('{% if count > 0 %}positive{% endif %}', {
|
|
74
|
-
count: 5
|
|
75
|
-
})).toBe('positive');
|
|
76
|
-
});
|
|
77
|
-
test('handles != operator', () => {
|
|
78
|
-
expect(renderString('{% if status != "done" %}pending{% endif %}', {
|
|
79
|
-
status: 'active'
|
|
80
|
-
})).toBe('pending');
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
describe('for control rendering', () => {
|
|
84
|
-
test('renders for loop', () => {
|
|
85
|
-
expect(renderString('{% for item in items %}{{ item }},{% endfor %}', {
|
|
86
|
-
items: ['a', 'b', 'c']
|
|
87
|
-
})).toBe('a,b,c,');
|
|
88
|
-
});
|
|
89
|
-
test('renders empty for empty array', () => {
|
|
90
|
-
expect(renderString('{% for item in items %}{{ item }}{% endfor %}', {
|
|
91
|
-
items: []
|
|
92
|
-
})).toBe('');
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
describe('HTML tag rendering', () => {
|
|
96
|
-
test('renders self-closing tags', () => {
|
|
97
|
-
expect(renderString('line1<br/>line2')).toBe('line1<br/>line2');
|
|
98
|
-
});
|
|
99
|
-
test('renders void tags', () => {
|
|
100
|
-
expect(renderString('before<hr>after')).toBe('before<hr/>after');
|
|
101
|
-
});
|
|
102
|
-
test('renders tags with attributes', () => {
|
|
103
|
-
expect(renderString('<img src="test.png">')).toBe('<img src="test.png"/>');
|
|
104
|
-
});
|
|
105
|
-
test('renders nested tags', () => {
|
|
106
|
-
expect(renderString('<strong>bold</strong>')).toBe('<strong>bold</strong>');
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
describe('complex templates', () => {
|
|
110
|
-
test('renders template with variable in tag', () => {
|
|
111
|
-
const template = '{% if count > 0 %}<strong>{{ count }}</strong>{% endif %}';
|
|
112
|
-
expect(renderString(template, {
|
|
113
|
-
count: 5
|
|
114
|
-
})).toBe('<strong>5</strong>');
|
|
115
|
-
});
|
|
116
|
-
test('renders pluralized message', () => {
|
|
117
|
-
const template = '{{ count }} {{ count | pluralize: "item", "items" }}';
|
|
118
|
-
expect(renderString(template, {
|
|
119
|
-
count: 1
|
|
120
|
-
})).toBe('1 item');
|
|
121
|
-
expect(renderString(template, {
|
|
122
|
-
count: 5
|
|
123
|
-
})).toBe('5 items');
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
describe('HTML entities', () => {
|
|
127
|
-
test('decodes to non-breaking space', () => {
|
|
128
|
-
expect(renderString('Hello World')).toBe('Hello\u00A0World');
|
|
129
|
-
});
|
|
130
|
-
test('decodes numeric entities', () => {
|
|
131
|
-
expect(renderString('Hello World')).toBe('Hello\u00A0World');
|
|
132
|
-
});
|
|
133
|
-
test('decodes hex entities', () => {
|
|
134
|
-
expect(renderString('Hello World')).toBe('Hello\u00A0World');
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
describe('renderToReact', () => {
|
|
139
|
-
describe('text rendering', () => {
|
|
140
|
-
test('renders plain text', () => {
|
|
141
|
-
const result = renderReactNodes('Hello World');
|
|
142
|
-
render(_jsx(_Fragment, {
|
|
143
|
-
children: result
|
|
144
|
-
}));
|
|
145
|
-
expect(screen.getByText('Hello World')).toBeInTheDocument();
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
describe('variable rendering', () => {
|
|
149
|
-
test('renders simple variable', () => {
|
|
150
|
-
const result = renderReactNodes('Hello {{ name }}', {
|
|
151
|
-
name: 'John'
|
|
152
|
-
});
|
|
153
|
-
render(_jsx(_Fragment, {
|
|
154
|
-
children: result
|
|
155
|
-
}));
|
|
156
|
-
expect(screen.getByText(/Hello/)).toBeInTheDocument();
|
|
157
|
-
expect(screen.getByText(/John/)).toBeInTheDocument();
|
|
158
|
-
});
|
|
159
|
-
test('renders variable with filter', () => {
|
|
160
|
-
const result = renderReactNodes('{{ name | upperCase }}', {
|
|
161
|
-
name: 'john'
|
|
162
|
-
});
|
|
163
|
-
render(_jsx(_Fragment, {
|
|
164
|
-
children: result
|
|
165
|
-
}));
|
|
166
|
-
expect(screen.getByText('JOHN')).toBeInTheDocument();
|
|
167
|
-
});
|
|
168
|
-
});
|
|
169
|
-
describe('HTML tag rendering', () => {
|
|
170
|
-
test('renders strong tag', () => {
|
|
171
|
-
const result = renderReactNodes('<strong>bold text</strong>');
|
|
172
|
-
render(_jsx(_Fragment, {
|
|
173
|
-
children: result
|
|
174
|
-
}));
|
|
175
|
-
const element = screen.getByText('bold text');
|
|
176
|
-
expect(element.tagName).toBe('STRONG');
|
|
177
|
-
});
|
|
178
|
-
test('renders br tag', () => {
|
|
179
|
-
const result = renderReactNodes('line1<br/>line2');
|
|
180
|
-
const {
|
|
181
|
-
container
|
|
182
|
-
} = render(_jsx(_Fragment, {
|
|
183
|
-
children: result
|
|
184
|
-
}));
|
|
185
|
-
expect(container.querySelector('br')).toBeInTheDocument();
|
|
186
|
-
});
|
|
187
|
-
test('renders img tag with attributes', () => {
|
|
188
|
-
const result = renderReactNodes('<img src="test.png" alt="test image">');
|
|
189
|
-
render(_jsx(_Fragment, {
|
|
190
|
-
children: result
|
|
191
|
-
}));
|
|
192
|
-
const img = screen.getByAltText('test image');
|
|
193
|
-
expect(img).toHaveAttribute('src', 'test.png');
|
|
194
|
-
});
|
|
195
|
-
test('renders anchor tag with href', () => {
|
|
196
|
-
const result = renderReactNodes('<a href="https://example.com">Link</a>');
|
|
197
|
-
render(_jsx(_Fragment, {
|
|
198
|
-
children: result
|
|
199
|
-
}));
|
|
200
|
-
const link = screen.getByText('Link');
|
|
201
|
-
expect(link.tagName).toBe('A');
|
|
202
|
-
expect(link).toHaveAttribute('href', 'https://example.com');
|
|
203
|
-
});
|
|
204
|
-
test('renders anchor tag with multiple attributes', () => {
|
|
205
|
-
const result = renderReactNodes('<a href="https://example.com" target="_blank" rel="noreferrer">External Link</a>');
|
|
206
|
-
render(_jsx(_Fragment, {
|
|
207
|
-
children: result
|
|
208
|
-
}));
|
|
209
|
-
const link = screen.getByText('External Link');
|
|
210
|
-
expect(link).toHaveAttribute('href', 'https://example.com');
|
|
211
|
-
expect(link).toHaveAttribute('target', '_blank');
|
|
212
|
-
expect(link).toHaveAttribute('rel', 'noreferrer');
|
|
213
|
-
});
|
|
214
|
-
test('renders anchor tag with variable in href', () => {
|
|
215
|
-
const result = renderReactNodes('<a href=linkUrl>Custom Link</a>', {
|
|
216
|
-
linkUrl: 'https://custom.com'
|
|
217
|
-
});
|
|
218
|
-
render(_jsx(_Fragment, {
|
|
219
|
-
children: result
|
|
220
|
-
}));
|
|
221
|
-
const link = screen.getByText('Custom Link');
|
|
222
|
-
expect(link).toHaveAttribute('href', 'https://custom.com');
|
|
223
|
-
});
|
|
224
|
-
});
|
|
225
|
-
describe('control structures', () => {
|
|
226
|
-
test('renders if block when true', () => {
|
|
227
|
-
const result = renderReactNodes('{% if active == true %}visible{% endif %}', {
|
|
228
|
-
active: true
|
|
229
|
-
});
|
|
230
|
-
render(_jsx(_Fragment, {
|
|
231
|
-
children: result
|
|
232
|
-
}));
|
|
233
|
-
expect(screen.getByText('visible')).toBeInTheDocument();
|
|
234
|
-
});
|
|
235
|
-
test('renders else block when false', () => {
|
|
236
|
-
const result = renderReactNodes('{% if active == true %}yes{% else %}no{% endif %}', {
|
|
237
|
-
active: false
|
|
238
|
-
});
|
|
239
|
-
render(_jsx(_Fragment, {
|
|
240
|
-
children: result
|
|
241
|
-
}));
|
|
242
|
-
expect(screen.getByText('no')).toBeInTheDocument();
|
|
243
|
-
});
|
|
244
|
-
test('renders for loop', () => {
|
|
245
|
-
const result = renderReactNodes('{% for item in items %}<span>{{ item }}</span>{% endfor %}', {
|
|
246
|
-
items: ['a', 'b', 'c']
|
|
247
|
-
});
|
|
248
|
-
render(_jsx(_Fragment, {
|
|
249
|
-
children: result
|
|
250
|
-
}));
|
|
251
|
-
expect(screen.getByText('a')).toBeInTheDocument();
|
|
252
|
-
expect(screen.getByText('b')).toBeInTheDocument();
|
|
253
|
-
expect(screen.getByText('c')).toBeInTheDocument();
|
|
254
|
-
});
|
|
255
|
-
});
|
|
256
|
-
describe('text tag with styles', () => {
|
|
257
|
-
test('renders text tag', () => {
|
|
258
|
-
const result = renderReactNodes('<text>styled text</text>');
|
|
259
|
-
render(_jsx(_Fragment, {
|
|
260
|
-
children: result
|
|
261
|
-
}));
|
|
262
|
-
expect(screen.getByText('styled text')).toBeInTheDocument();
|
|
263
|
-
});
|
|
264
|
-
});
|
|
265
|
-
describe('HTML entities', () => {
|
|
266
|
-
test('decodes in React rendering', () => {
|
|
267
|
-
const result = renderReactNodes('Hello World');
|
|
268
|
-
const {
|
|
269
|
-
container
|
|
270
|
-
} = render(_jsx(_Fragment, {
|
|
271
|
-
children: result
|
|
272
|
-
}));
|
|
273
|
-
expect(container.textContent).toBe('Hello\u00A0World');
|
|
274
|
-
});
|
|
275
|
-
test('decodes numeric entities in React rendering', () => {
|
|
276
|
-
const result = renderReactNodes('Hello World');
|
|
277
|
-
const {
|
|
278
|
-
container
|
|
279
|
-
} = render(_jsx(_Fragment, {
|
|
280
|
-
children: result
|
|
281
|
-
}));
|
|
282
|
-
expect(container.textContent).toBe('Hello\u00A0World');
|
|
283
|
-
});
|
|
284
|
-
});
|
|
285
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { renderHook } from '@testing-library/react';
|
|
2
|
-
import { useDropdownPosition } from '../useDropdownPosition';
|
|
3
|
-
const floating = {
|
|
4
|
-
middleware: []
|
|
5
|
-
};
|
|
6
|
-
jest.mock('@floating-ui/react-dom', () => ({
|
|
7
|
-
...jest.requireActual('@floating-ui/react-dom'),
|
|
8
|
-
size: options => ({
|
|
9
|
-
name: 'size',
|
|
10
|
-
options
|
|
11
|
-
}),
|
|
12
|
-
useFloating: config => {
|
|
13
|
-
floating.middleware = config.middleware;
|
|
14
|
-
return {
|
|
15
|
-
refs: {
|
|
16
|
-
reference: {
|
|
17
|
-
current: null
|
|
18
|
-
},
|
|
19
|
-
floating: {
|
|
20
|
-
current: null
|
|
21
|
-
},
|
|
22
|
-
setReference: jest.fn(),
|
|
23
|
-
setFloating: jest.fn()
|
|
24
|
-
},
|
|
25
|
-
floatingStyles: {}
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
}));
|
|
29
|
-
const maxHeightFor = availableHeight => {
|
|
30
|
-
renderHook(() => useDropdownPosition({
|
|
31
|
-
isOpen: true
|
|
32
|
-
}));
|
|
33
|
-
const style = {};
|
|
34
|
-
floating.middleware.find(m => m.name === 'size').options.apply({
|
|
35
|
-
rects: {
|
|
36
|
-
reference: {
|
|
37
|
-
width: 200
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
elements: {
|
|
41
|
-
floating: {
|
|
42
|
-
style
|
|
43
|
-
}
|
|
44
|
-
},
|
|
45
|
-
availableWidth: 1000,
|
|
46
|
-
availableHeight
|
|
47
|
-
});
|
|
48
|
-
return style.maxHeight;
|
|
49
|
-
};
|
|
50
|
-
describe('useDropdownPosition max height', () => {
|
|
51
|
-
it('caps the dropdown at 300px when there is more room', () => {
|
|
52
|
-
expect(maxHeightFor(1200)).toBe('300px');
|
|
53
|
-
});
|
|
54
|
-
it('shrinks to the room below the field when it is less than the cap', () => {
|
|
55
|
-
expect(maxHeightFor(200)).toBe('192px');
|
|
56
|
-
});
|
|
57
|
-
it('never goes negative', () => {
|
|
58
|
-
expect(maxHeightFor(4)).toBe('0px');
|
|
59
|
-
});
|
|
60
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { validateContentSting } from '../../../RichMessageEditor/slate/helpers';
|
|
2
|
-
import { isResolvableDc, parseDc } from '../token';
|
|
3
|
-
// The lists below mirror channels/publisher
|
|
4
|
-
// internal/services/dynamiccontentreplacer/constants.go — keep them in sync.
|
|
5
|
-
const caseInsensitiveModifiers = ['capitalizefirst', 'capitalizeallfirst', 'uppercase', 'lowercase', 'regular', 'base64', 'cent', 'dollar', 'comma', 'euro', 'jpy', 'lira'];
|
|
6
|
-
const dateModifiers = ['M-d-y', 'm-d-y', 'M d y', 'M d Y', 'l', 'M d', 'H:i', 'm-d-y H:i'];
|
|
7
|
-
describe('isResolvableDc', () => {
|
|
8
|
-
test.each(caseInsensitiveModifiers)('accepts %s', modifier => {
|
|
9
|
-
expect(isResolvableDc(parseDc(`{Name|${modifier}}`))).toBe(true);
|
|
10
|
-
});
|
|
11
|
-
test.each(caseInsensitiveModifiers)('accepts %s whatever the case', modifier => {
|
|
12
|
-
expect(isResolvableDc(parseDc(`{Name|${modifier.toUpperCase()}}`))).toBe(true);
|
|
13
|
-
});
|
|
14
|
-
test.each(dateModifiers)('accepts the date modifier %s', modifier => {
|
|
15
|
-
expect(isResolvableDc(parseDc(`{Name|${modifier}}`))).toBe(true);
|
|
16
|
-
});
|
|
17
|
-
test('rejects a date modifier in the wrong case, as the sender does', () => {
|
|
18
|
-
expect(isResolvableDc(parseDc('{Name|m d y}'))).toBe(false);
|
|
19
|
-
});
|
|
20
|
-
test.each([['{Name|}', 'no modifier at all'], ['{Name|nope}', 'a modifier outside the list'], ['{|regular}', 'no tag name']])('rejects %s (%s)', token => {
|
|
21
|
-
expect(isResolvableDc(parseDc(token))).toBe(false);
|
|
22
|
-
});
|
|
23
|
-
test('keeps a default value out of the verdict', () => {
|
|
24
|
-
expect(isResolvableDc(parseDc('{WalletPassLink|regular|no pass}'))).toBe(true);
|
|
25
|
-
expect(isResolvableDc(parseDc('{WalletPassLink||no pass}'))).toBe(false);
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
describe('validateContentSting', () => {
|
|
29
|
-
test.each([['Tap here!\n{WalletSerialNo|regular}', true], ['Tap here!\n{WalletSerialNo|}', false], ['{WalletSerialNo|regular}{WalletPassLink|}', false], ['Hi {{ user.name | upcase }}, plain liquid is not a token', true], ['no tokens at all', true], ['', true]])('%s -> %s', (content, expected) => {
|
|
30
|
-
expect(validateContentSting(content)).toBe(expected);
|
|
31
|
-
});
|
|
32
|
-
});
|