@shopgate/pwa-common 7.32.0-beta.2 → 7.32.0-beta.21

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 (68) hide show
  1. package/actions/app/handleLink.js +6 -2
  2. package/components/Button/index.js +6 -0
  3. package/components/Image/Image.d.ts +78 -0
  4. package/components/Image/Image.d.ts.map +1 -0
  5. package/components/Image/Image.js +123 -91
  6. package/components/Image/ImageInner.d.ts +45 -0
  7. package/components/Image/ImageInner.d.ts.map +1 -0
  8. package/components/Image/ImageInner.js +23 -29
  9. package/components/Image/index.d.ts +3 -0
  10. package/components/Image/index.d.ts.map +1 -0
  11. package/components/Swiper/index.js +17 -2
  12. package/constants/Configuration.js +7 -0
  13. package/helpers/html/decodeHTML.js +5 -3
  14. package/helpers/html/htmlToText.js +15 -0
  15. package/helpers/mocks/mockRenderOptions.js +21 -0
  16. package/helpers/router/index.js +85 -0
  17. package/package.json +3 -3
  18. package/providers/toast/index.js +54 -40
  19. package/subscriptions/error.js +50 -27
  20. package/subscriptions/helpers/pipeline.js +68 -0
  21. package/subscriptions/router.js +22 -8
  22. package/action-creators/app/spec.js +0 -96
  23. package/action-creators/client/spec.js +0 -44
  24. package/action-creators/menu/spec.js +0 -37
  25. package/action-creators/modal/spec.js +0 -26
  26. package/action-creators/page/spec.js +0 -38
  27. package/action-creators/url/spec.js +0 -45
  28. package/action-creators/user/spec.js +0 -186
  29. package/components/Backdrop/spec.js +0 -24
  30. package/components/Button/spec.js +0 -42
  31. package/components/Checkbox/spec.js +0 -111
  32. package/components/CountdownTimer/spec.js +0 -141
  33. package/components/Drawer/spec.js +0 -79
  34. package/components/Ellipsis/spec.js +0 -15
  35. package/components/EmbeddedMedia/spec.js +0 -61
  36. package/components/Grid/components/Item/spec.js +0 -24
  37. package/components/Grid/spec.js +0 -24
  38. package/components/HtmlSanitizer/spec.js +0 -229
  39. package/components/I18n/components/FormatDate/spec.js +0 -54
  40. package/components/I18n/components/FormatNumber/spec.js +0 -51
  41. package/components/I18n/components/FormatPrice/spec.js +0 -54
  42. package/components/I18n/components/FormatTime/spec.js +0 -51
  43. package/components/I18n/components/I18nProvider/spec.js +0 -40
  44. package/components/I18n/components/Placeholder/spec.js +0 -37
  45. package/components/I18n/components/Translate/spec.js +0 -33
  46. package/components/InfiniteContainer/spec.js +0 -204
  47. package/components/Input/spec.js +0 -123
  48. package/components/Link/spec.js +0 -60
  49. package/components/List/spec.js +0 -26
  50. package/components/ModalContainer/spec.js +0 -115
  51. package/components/Select/spec.js +0 -122
  52. package/components/SelectBox/spec.js +0 -68
  53. package/components/Swiper/components/SwiperItem/spec.js +0 -26
  54. package/components/Widgets/components/Widget/spec.js +0 -75
  55. package/components/Widgets/components/WidgetGrid/spec.js +0 -53
  56. package/components/Widgets/spec.js +0 -234
  57. package/helpers/data/spec.js +0 -194
  58. package/helpers/date/spec.js +0 -92
  59. package/helpers/style/spec.js +0 -108
  60. package/helpers/validation/spec.js +0 -10
  61. package/styles/reset/form.js +0 -58
  62. package/styles/reset/index.js +0 -8
  63. package/styles/reset/media.js +0 -26
  64. package/styles/reset/root.js +0 -37
  65. package/styles/reset/table.js +0 -14
  66. package/styles/reset/typography.js +0 -30
  67. package/tsconfig.build.json +0 -16
  68. package/tsconfig.json +0 -3
@@ -1,141 +0,0 @@
1
- import React from 'react';
2
- import { shallow } from 'enzyme';
3
- import { act } from 'react-dom/test-utils';
4
- import CountdownTimer, { getFormattedTimeString } from "./index";
5
- import { jsx as _jsx } from "react/jsx-runtime";
6
- describe('<CountdownTimer>', () => {
7
- jest.useFakeTimers();
8
-
9
- /**
10
- * Creates a new countdown timer element.
11
- * @param {number} remainingDays The remaining days.
12
- * @param {number} remainingHours The remaining hours.
13
- * @param {number} remainingMinutes The remaining minutes.
14
- * @param {number} remainingSeconds The remaining seconds.
15
- * @param {Function} callback The expiration callback.
16
- * @return {JSX}
17
- */
18
- const createTimerElement = (remainingDays, remainingHours, remainingMinutes, remainingSeconds, callback) => {
19
- const timeout = Math.floor(Date.now() / 1000) + remainingDays * 86400 + remainingHours * 3600 + remainingMinutes * 60 + remainingSeconds;
20
- const wrapper = shallow(/*#__PURE__*/_jsx(CountdownTimer, {
21
- timeout: timeout,
22
- onExpire: callback
23
- }));
24
- let currentTimeOffset = timeout - Math.floor(Date.now() / 1000);
25
- wrapper.instance().getRemainingTime = () => {
26
- currentTimeOffset -= 1;
27
- return currentTimeOffset;
28
- };
29
- return wrapper;
30
- };
31
-
32
- /**
33
- * Performs a time format check for a specific remaining time.
34
- * @param {number} remainingDays The remaining days.
35
- * @param {number} remainingHours The remaining hours.
36
- * @param {number} remainingMinutes The remaining minutes.
37
- * @param {number} remainingSeconds The remaining seconds.
38
- */
39
- const performFormatCheck = (remainingDays, remainingHours, remainingMinutes, remainingSeconds) => {
40
- jest.clearAllTimers();
41
- const intervalSpy = jest.spyOn(global, 'setInterval');
42
- const wrapper = createTimerElement(remainingDays, remainingHours, remainingMinutes, remainingSeconds, null);
43
- const expectedTimeFormat = getFormattedTimeString(remainingDays, remainingHours, remainingMinutes, remainingSeconds - 1);
44
- expect(intervalSpy).toHaveBeenCalledTimes(1);
45
- act(() => {
46
- jest.advanceTimersByTime(1000);
47
- });
48
- wrapper.update();
49
- const {
50
- params,
51
- string
52
- } = wrapper.props();
53
- expect({
54
- params,
55
- string
56
- }).toEqual(expectedTimeFormat);
57
- intervalSpy.mockRestore();
58
- };
59
- it('should render the correct time for < 24h', () => performFormatCheck(0, 0, 0, 5));
60
- it('should render the correct time for 24h - 48h', () => performFormatCheck(1, 12, 6, 5));
61
- it('should render the correct time for > 2d', () => performFormatCheck(30, 1, 2, 3));
62
- it('should not render negative durations', () => {
63
- jest.clearAllTimers();
64
- const wrapper = createTimerElement(-1, -2, -3, -5, null);
65
- const expectedTimeFormat = getFormattedTimeString(0, 0, 0, 0);
66
- act(() => {
67
- jest.advanceTimersByTime(1000);
68
- });
69
- const {
70
- params,
71
- string
72
- } = wrapper.props();
73
- expect({
74
- params,
75
- string
76
- }).toEqual(expectedTimeFormat);
77
- });
78
- it('should stop at 00:00:00 when the timer expires', () => {
79
- const wrapper = createTimerElement(0, 0, 0, 1, null);
80
- const expectedTimeFormat = getFormattedTimeString(0, 0, 0, 0);
81
- act(() => {
82
- jest.advanceTimersByTime(1000);
83
- });
84
- wrapper.update();
85
- let {
86
- params,
87
- string
88
- } = wrapper.props();
89
- expect({
90
- params,
91
- string
92
- }).toEqual(expectedTimeFormat);
93
- act(() => {
94
- jest.advanceTimersByTime(1000);
95
- });
96
- ({
97
- params,
98
- string
99
- } = wrapper.props());
100
- expect({
101
- params,
102
- string
103
- }).toEqual(expectedTimeFormat);
104
- });
105
- it('should invoke the callback when the timer expires', () => {
106
- let timesCallbackInvoked = 0;
107
- /**
108
- * The callback method will just increment a counter when invoked.
109
- */
110
- const callback = () => {
111
- timesCallbackInvoked += 1;
112
- };
113
- createTimerElement(0, 0, 0, 2, callback);
114
- act(() => {
115
- jest.advanceTimersByTime(1000);
116
- });
117
- expect(timesCallbackInvoked).toBe(0);
118
- act(() => {
119
- jest.advanceTimersByTime(1000);
120
- });
121
- expect(timesCallbackInvoked).toBe(1);
122
- act(() => {
123
- jest.advanceTimersByTime(1000);
124
- });
125
- expect(timesCallbackInvoked).toBe(1);
126
- });
127
- it('should not invoke the callback when the timeout is already expired.', () => {
128
- let timesCallbackInvoked = 0;
129
- /**
130
- * The callback method will just increment a counter when invoked.
131
- */
132
- const callback = () => {
133
- timesCallbackInvoked += 1;
134
- };
135
- createTimerElement(0, 0, 0, 0, callback);
136
- act(() => {
137
- jest.advanceTimersByTime(1000);
138
- });
139
- expect(timesCallbackInvoked).toBe(0);
140
- });
141
- });
@@ -1,79 +0,0 @@
1
- import React from 'react';
2
- import { mount, shallow } from 'enzyme';
3
- import Drawer from "./index";
4
- import { jsx as _jsx } from "react/jsx-runtime";
5
- jest.mock('@shopgate/engage/a11y/components');
6
- describe('<Drawer />', () => {
7
- const onOpen = jest.fn();
8
- const onClose = jest.fn();
9
- const onDidOpen = jest.fn();
10
- const onDidClose = jest.fn();
11
- beforeEach(() => {
12
- jest.clearAllMocks();
13
- });
14
- it('should render', () => {
15
- const wrapper = shallow(/*#__PURE__*/_jsx(Drawer, {}));
16
- expect(wrapper).toMatchSnapshot();
17
- });
18
- it('should execute callback when drawer is opened', () => {
19
- const wrapper = mount(/*#__PURE__*/_jsx(Drawer, {
20
- onOpen: onOpen
21
- }));
22
- wrapper.setProps({
23
- isOpen: true
24
- });
25
- expect(onOpen).toBeCalled();
26
- });
27
- it('should execute callback when drawer is closed', () => {
28
- const wrapper = mount(/*#__PURE__*/_jsx(Drawer, {
29
- isOpen: true,
30
- onClose: onClose
31
- }));
32
- wrapper.setProps({
33
- isOpen: false
34
- });
35
- expect(onClose).toBeCalled();
36
- });
37
- it('should add custom classes', () => {
38
- const wrapper = mount(/*#__PURE__*/_jsx(Drawer, {
39
- className: "custom-class-name",
40
- isOpen: true
41
- }));
42
- expect(wrapper).toMatchSnapshot();
43
- expect(wrapper.hasClass('custom-class-name')).toEqual(true);
44
- });
45
- it('should execute callback when drawer open animation did end', () => {
46
- const wrapper = mount(/*#__PURE__*/_jsx(Drawer, {
47
- className: "custom-class-name",
48
- isOpen: false,
49
- onOpen: onOpen,
50
- onDidOpen: onDidOpen
51
- }));
52
- expect(wrapper).toMatchSnapshot();
53
- wrapper.setProps({
54
- isOpen: true
55
- });
56
- wrapper.update();
57
- expect(onOpen).toBeCalled();
58
- expect(onDidOpen).not.toBeCalled();
59
- wrapper.find('[role="dialog"]').simulate('animationEnd');
60
- expect(onDidOpen).toBeCalled();
61
- });
62
- it('should execute callback when drawer close animation did end', () => {
63
- const wrapper = mount(/*#__PURE__*/_jsx(Drawer, {
64
- className: "custom-class-name",
65
- isOpen: true,
66
- onClose: onClose,
67
- onDidClose: onDidClose
68
- }));
69
- expect(wrapper).toMatchSnapshot();
70
- wrapper.setProps({
71
- isOpen: false
72
- });
73
- wrapper.update();
74
- expect(onClose).toBeCalled();
75
- expect(onDidClose).not.toBeCalled();
76
- wrapper.find('[role="dialog"]').simulate('animationEnd');
77
- expect(onDidClose).toBeCalled();
78
- });
79
- });
@@ -1,15 +0,0 @@
1
- import React from 'react';
2
- import { shallow } from 'enzyme';
3
- import Ellipsis from "./index";
4
- import { jsx as _jsx } from "react/jsx-runtime";
5
- const clamp = 3;
6
- const text = 'Some very long text that should be cut off by this ellipsis component.';
7
- describe('<Ellipsis />', () => {
8
- it('should render', () => {
9
- const wrapper = shallow(/*#__PURE__*/_jsx(Ellipsis, {
10
- rows: clamp,
11
- children: text
12
- }));
13
- expect(wrapper).toMatchSnapshot();
14
- });
15
- });
@@ -1,61 +0,0 @@
1
- import React from 'react';
2
- import { shallow } from 'enzyme';
3
- import { embeddedMedia } from '@shopgate/pwa-common/collections';
4
- import EmbeddedMedia from "./index";
5
- import { jsx as _jsx } from "react/jsx-runtime";
6
- jest.mock('@shopgate/pwa-common/collections', () => ({
7
- embeddedMedia: {
8
- getHasPendingProviders: jest.fn(),
9
- providers: new Set([{
10
- isPending: false,
11
- remoteScriptUrl: 'http://foo.bar'
12
- }, {
13
- isPending: true,
14
- remoteScriptUrl: 'http://bar.foo',
15
- onScriptLoaded: jest.fn()
16
- }])
17
- }
18
- }));
19
- describe('<EmbeddedMedia />', () => {
20
- beforeEach(() => {
21
- jest.clearAllMocks();
22
- });
23
- it('should return children', () => {
24
- embeddedMedia.getHasPendingProviders.mockReturnValueOnce(false);
25
- const wrapper = shallow(/*#__PURE__*/_jsx(EmbeddedMedia, {
26
- children: /*#__PURE__*/_jsx("div", {
27
- children: "Children"
28
- })
29
- }));
30
- expect(wrapper.html()).toEqual('<div>Children</div>');
31
- });
32
- it.skip('should render Helmet with a script', () => {
33
- embeddedMedia.getHasPendingProviders.mockReturnValueOnce(true);
34
- const wrapper = shallow(/*#__PURE__*/_jsx(EmbeddedMedia, {
35
- children: /*#__PURE__*/_jsx("div", {
36
- children: "Content with embedded media (youtube, vimeo, etc)"
37
- })
38
- }));
39
- const helmetProps = wrapper.find('HelmetWrapper').props();
40
- expect(helmetProps).toEqual({
41
- defer: true,
42
- encodeSpecialCharacters: true,
43
- onChangeClientState() {},
44
- script: []
45
- });
46
- const scriptTags = [{
47
- onload: jest.fn(),
48
- getAttribute: jest.fn().mockReturnValue('http://bar.foo')
49
- }];
50
-
51
- // Invoke helmet cb
52
- helmetProps.onChangeClientState(null, {
53
- scriptTags
54
- });
55
-
56
- // Invoke onload on script
57
- scriptTags[0].onload();
58
- const [, secondProvider] = embeddedMedia.providers;
59
- expect(secondProvider.onScriptLoaded).toHaveBeenCalledTimes(1);
60
- });
61
- });
@@ -1,24 +0,0 @@
1
- import React from 'react';
2
- import { shallow } from 'enzyme';
3
- import GridItem from "./index";
4
- import { jsx as _jsx } from "react/jsx-runtime";
5
- describe('<GridItem />', () => {
6
- it('should render without any further props', () => {
7
- const wrapper = shallow(/*#__PURE__*/_jsx(GridItem, {}));
8
- expect(wrapper).toMatchSnapshot();
9
- });
10
- it('should be able to render a custom tag', () => {
11
- const wrapper = shallow(/*#__PURE__*/_jsx(GridItem, {
12
- component: "section"
13
- }));
14
- expect(wrapper).toMatchSnapshot();
15
- expect(wrapper.type()).toEqual('section');
16
- });
17
- it('should add custom classes on demand', () => {
18
- const wrapper = shallow(/*#__PURE__*/_jsx(GridItem, {
19
- className: "custom-class-name"
20
- }));
21
- expect(wrapper).toMatchSnapshot();
22
- expect(wrapper.hasClass('custom-class-name')).toEqual(true);
23
- });
24
- });
@@ -1,24 +0,0 @@
1
- import React from 'react';
2
- import { shallow } from 'enzyme';
3
- import Grid from "./index";
4
- import { jsx as _jsx } from "react/jsx-runtime";
5
- describe('<Grid />', () => {
6
- it('should render without any further props', () => {
7
- const wrapper = shallow(/*#__PURE__*/_jsx(Grid, {}));
8
- expect(wrapper).toMatchSnapshot();
9
- });
10
- it('should be able to render a custom tag', () => {
11
- const wrapper = shallow(/*#__PURE__*/_jsx(Grid, {
12
- component: "article"
13
- }));
14
- expect(wrapper).toMatchSnapshot();
15
- expect(wrapper.type()).toEqual('article');
16
- });
17
- it('should add custom classes on demand', () => {
18
- const wrapper = shallow(/*#__PURE__*/_jsx(Grid, {
19
- className: "custom-class-name"
20
- }));
21
- expect(wrapper).toMatchSnapshot();
22
- expect(wrapper.hasClass('custom-class-name')).toEqual(true);
23
- });
24
- });
@@ -1,229 +0,0 @@
1
- /** @jest-environment jsdom */
2
-
3
- import React from 'react';
4
- import { mount } from 'enzyme';
5
- import { embeddedMedia } from '@shopgate/pwa-common/collections';
6
- import HtmlSanitizer from "./index";
7
- import { jsx as _jsx } from "react/jsx-runtime";
8
- jest.mock("../EmbeddedMedia", () => ({
9
- children
10
- }) => children);
11
- jest.mock("./connector", () => Cmp => Cmp);
12
-
13
- /**
14
- * @param {string} html HTML markup.
15
- * @param {Object} props Component props.
16
- * @returns {JSX.Element}
17
- */
18
- const createWrapper = (html, props = {}) => mount(/*#__PURE__*/_jsx(HtmlSanitizer, {
19
- navigate: () => {},
20
- ...props,
21
- children: html
22
- }));
23
- describe('<HtmlSanitizer />', () => {
24
- let embeddedMediaAddSpy;
25
- let embeddedMediaRemoveSpy;
26
- let embeddedMediaHandleCookieConsentSpy;
27
- beforeEach(() => {
28
- jest.clearAllMocks();
29
- embeddedMediaAddSpy = jest.spyOn(embeddedMedia, 'add');
30
- embeddedMediaRemoveSpy = jest.spyOn(embeddedMedia, 'remove');
31
- embeddedMediaHandleCookieConsentSpy = jest.spyOn(embeddedMedia, 'handleCookieConsent');
32
- });
33
- it('should render the HtmlSanitizer', () => {
34
- /**
35
- * The value for html is the HTML-escaped equivalent of the following:
36
- * <h1>Hello World!</h1>
37
- * @type {string}
38
- */
39
- const html = '&lt;h1&gt;Hello World!&lt;/h1&gt;';
40
- const wrapper = createWrapper(html, {
41
- decode: true
42
- });
43
-
44
- // Test result of dangerouslySetInnerHTML.
45
- expect(wrapper.html()).toEqual('<div class="common__html-sanitizer"><h1>Hello World!</h1></div>');
46
- expect(wrapper.render()).toMatchSnapshot();
47
- });
48
- it('should add and remove handlers for embedded media', () => {
49
- const wrapper = createWrapper('<div></div>', {
50
- decode: true
51
- });
52
- const ref = wrapper.instance().htmlContainer.current;
53
- expect(embeddedMediaAddSpy).toHaveBeenCalledTimes(1);
54
- expect(embeddedMediaAddSpy).toHaveBeenCalledWith(ref);
55
- expect(embeddedMediaRemoveSpy).toHaveBeenCalledTimes(0);
56
- wrapper.setProps({
57
- children: '<span></span>'
58
- });
59
- expect(embeddedMediaAddSpy).toHaveBeenCalledTimes(2);
60
- expect(embeddedMediaAddSpy).toHaveBeenCalledWith(ref);
61
- expect(embeddedMediaRemoveSpy).toHaveBeenCalledTimes(0);
62
- wrapper.unmount();
63
- expect(embeddedMediaAddSpy).toHaveBeenCalledTimes(2);
64
- expect(embeddedMediaRemoveSpy).toHaveBeenCalledTimes(1);
65
- expect(embeddedMediaRemoveSpy).toHaveBeenCalledWith(ref);
66
- });
67
- it('strips out images with relative paths', () => {
68
- const html = `
69
- <div>
70
- <style>a { color: red }</style>
71
- <a href="foo">
72
- <img src="bar.jpg" />
73
- </a>
74
- </div>
75
- `;
76
- const wrapper = createWrapper(html);
77
- expect(wrapper.html()).not.toContain('<img');
78
- expect(wrapper.html()).toContain('<style>');
79
- expect(wrapper.render()).toMatchSnapshot();
80
- });
81
- it('should move style blocks out of the content', () => {
82
- const html = `
83
- <div>
84
- <style>a { color: red }</style>
85
- <a href="foo">
86
- <img src="bar.jpg" />
87
- </a>
88
- </div>
89
- `;
90
- const wrapper = createWrapper(html, {
91
- processStyles: true
92
- });
93
- expect(wrapper.html()).not.toContain('<style>');
94
- });
95
- it('does not strip out images with absolute paths', () => {
96
- const html = `
97
- <div>
98
- <a href="foo">
99
- <img src="http://google.de/bar.jpg" />
100
- </a>
101
- </div>
102
- `;
103
- const wrapper = createWrapper(html);
104
- expect(wrapper.html()).toContain('<img');
105
- expect(wrapper.render()).toMatchSnapshot();
106
- });
107
- it('strips out the script tags', () => {
108
- /**
109
- * The value for html is the HTML-escaped equivalent of the following:
110
- * <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.js"></script>
111
- * <script type="text/javascript">var x = 42;</script>
112
- * <p>Foo Bar</p>
113
- * <script>var y = 23;</script>
114
- * @type {string}
115
- */
116
- const html = '&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.js&quot;&gt;&lt;/script&gt; &lt;script type=&quot;text/javascript&quot;&gt;var x = 42;&lt;/script&gt; &lt;p&gt;Foo Bar&lt;/p&gt; &lt;script&gt;var y = 23;&lt;/script&gt;';
117
- const wrapper = createWrapper(html, {
118
- decode: true
119
- });
120
-
121
- // Test result of dangerouslySetInnerHTML.
122
- expect(wrapper.html()).toEqual('<div class="common__html-sanitizer"> <p>Foo Bar</p> </div>');
123
- expect(wrapper).toMatchSnapshot();
124
- });
125
- describe('Link handling', () => {
126
- const mockedHandleClick = jest.fn();
127
- beforeEach(() => {
128
- mockedHandleClick.mockClear();
129
- });
130
- it('follows a link from a plain <a>', () => {
131
- // Create a real container element in the current document
132
- const attachNode = document.createElement('div');
133
- document.body.appendChild(attachNode);
134
- const html = '&lt;a id=&quot;link&quot; href=&quot;#follow-me-and-everything-is-alright&quot;&gt;Plain Link&lt;/a&gt;';
135
- const wrapper = mount(/*#__PURE__*/_jsx(HtmlSanitizer, {
136
- decode: true,
137
- settings: {
138
- handleClick: mockedHandleClick
139
- },
140
- navigate: () => {},
141
- children: html
142
- }), {
143
- attachTo: attachNode
144
- });
145
- const aTag = attachNode.getElementsByTagName('a')[0];
146
- aTag.closest = () => aTag;
147
- const event = {
148
- target: aTag,
149
- preventDefault: () => {}
150
- };
151
- wrapper.instance().handleClick(event);
152
- expect(mockedHandleClick).toHaveBeenCalledTimes(1);
153
- expect(mockedHandleClick).toHaveBeenCalledWith('#follow-me-and-everything-is-alright', '');
154
- wrapper.unmount();
155
- attachNode.remove();
156
- });
157
- it('follows a link from a <a> with other HTML inside', () => {
158
- const attachNode = document.createElement('div');
159
- document.body.appendChild(attachNode);
160
- const html = '&lt;a id=&quot;link&quot; target=&quot;_blank&quot; href=&quot;#I-ll-be-the-one-to-tuck-you-in-at-night&quot;&gt;&lt;span&gt;Span Link&lt;/span&gt;&lt;/a&gt;';
161
- const wrapper = mount(/*#__PURE__*/_jsx(HtmlSanitizer, {
162
- decode: true,
163
- settings: {
164
- handleClick: mockedHandleClick
165
- },
166
- navigate: () => {},
167
- children: html
168
- }), {
169
- attachTo: attachNode
170
- });
171
- const aTag = attachNode.getElementsByTagName('a')[0];
172
- const spanTag = attachNode.getElementsByTagName('span')[0];
173
- spanTag.closest = () => aTag;
174
- const event = {
175
- target: spanTag,
176
- preventDefault: () => {}
177
- };
178
- wrapper.instance().handleClick(event);
179
- expect(mockedHandleClick).toHaveBeenCalledTimes(1);
180
- expect(mockedHandleClick).toHaveBeenCalledWith('#I-ll-be-the-one-to-tuck-you-in-at-night', '_blank');
181
- });
182
- });
183
- describe('Cookie consent handling', () => {
184
- it('should invoke handleCookieConsent method of embedded media with default cookie consent settings', () => {
185
- createWrapper('<div></div>', {
186
- decode: true
187
- });
188
- expect(embeddedMediaHandleCookieConsentSpy).toHaveBeenCalledTimes(1);
189
- expect(embeddedMediaHandleCookieConsentSpy).toHaveBeenCalledWith(expect.any(Document), {
190
- comfortCookiesAccepted: false,
191
- statisticsCookiesAccepted: false
192
- });
193
- });
194
- it('should invoke handleCookieConsent method of embedded media with accepted comfort cookies', () => {
195
- createWrapper('<div></div>', {
196
- decode: true,
197
- comfortCookiesAccepted: true
198
- });
199
- expect(embeddedMediaHandleCookieConsentSpy).toHaveBeenCalledTimes(1);
200
- expect(embeddedMediaHandleCookieConsentSpy).toHaveBeenCalledWith(expect.any(Document), {
201
- comfortCookiesAccepted: true,
202
- statisticsCookiesAccepted: false
203
- });
204
- });
205
- it('should invoke handleCookieConsent method of embedded media with accepted statistics cookies', () => {
206
- createWrapper('<div></div>', {
207
- decode: true,
208
- statisticsCookiesAccepted: true
209
- });
210
- expect(embeddedMediaHandleCookieConsentSpy).toHaveBeenCalledTimes(1);
211
- expect(embeddedMediaHandleCookieConsentSpy).toHaveBeenCalledWith(expect.any(Document), {
212
- comfortCookiesAccepted: false,
213
- statisticsCookiesAccepted: true
214
- });
215
- });
216
- it('should invoke handleCookieConsent method of embedded media with all cookies accepted', () => {
217
- createWrapper('<div></div>', {
218
- decode: true,
219
- comfortCookiesAccepted: true,
220
- statisticsCookiesAccepted: true
221
- });
222
- expect(embeddedMediaHandleCookieConsentSpy).toHaveBeenCalledTimes(1);
223
- expect(embeddedMediaHandleCookieConsentSpy).toHaveBeenCalledWith(expect.any(Document), {
224
- comfortCookiesAccepted: true,
225
- statisticsCookiesAccepted: true
226
- });
227
- });
228
- });
229
- });
@@ -1,54 +0,0 @@
1
- import React from 'react';
2
- import { mount } from 'enzyme';
3
- import { i18n } from '@shopgate/engage/core';
4
- import I18n from "../../index";
5
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
- jest.unmock('@shopgate/engage/core/helpers/i18n');
7
- describe('<FormatDate />', () => {
8
- const locales = {
9
- greeting: 'Hello {date}'
10
- };
11
- const lang = 'en-US';
12
- const timestamp = 123456789000;
13
- const formattedDate = 'Nov 29, 1973';
14
- const format = 'medium';
15
- i18n.init({
16
- locales,
17
- lang
18
- });
19
- describe('Given the component was mounted to the DOM', () => {
20
- let renderedElement;
21
- it('should match snapshot', () => {
22
- renderedElement = mount(/*#__PURE__*/_jsx(I18n.Provider, {
23
- children: /*#__PURE__*/_jsxs("div", {
24
- children: [/*#__PURE__*/_jsx("span", {
25
- className: "only-date",
26
- children: /*#__PURE__*/_jsx(I18n.Date, {
27
- timestamp: timestamp,
28
- format: format
29
- })
30
- }), /*#__PURE__*/_jsx("span", {
31
- className: "text-with-date",
32
- children: /*#__PURE__*/_jsx(I18n.Text, {
33
- string: "greeting",
34
- children: /*#__PURE__*/_jsx(I18n.Date, {
35
- forKey: "date",
36
- timestamp: timestamp,
37
- format: format
38
- })
39
- })
40
- })]
41
- })
42
- }));
43
- expect(renderedElement).toMatchSnapshot();
44
- });
45
- it('should render formatted date', () => {
46
- const text = renderedElement.find('.only-date').text();
47
- expect(text).toBe(formattedDate);
48
- });
49
- it('should render within translated text', () => {
50
- const text = renderedElement.find('.text-with-date').text();
51
- expect(text).toBe(`Hello ${formattedDate}`);
52
- });
53
- });
54
- });
@@ -1,51 +0,0 @@
1
- import "core-js/modules/es.array.includes.js";
2
- import React from 'react';
3
- import { mount } from 'enzyme';
4
- import { i18n } from '@shopgate/engage/core';
5
- import I18n from "../../index";
6
- import FormatNumber from "./index";
7
- import { jsx as _jsx } from "react/jsx-runtime";
8
- jest.unmock('@shopgate/engage/core/helpers/i18n');
9
- describe('<FormatNumber>', () => {
10
- describe('i18n not ready', () => {
11
- it('should return same number and className when i18n is not ready', () => {
12
- const component = mount(/*#__PURE__*/_jsx(FormatNumber, {
13
- number: 1,
14
- fractions: 2,
15
- className: "some-class"
16
- }));
17
- expect(component.html().includes('some-class')).toBe(true);
18
- expect(component.text().includes('1')).toBe(true);
19
- expect(component).toMatchSnapshot();
20
- });
21
- });
22
- describe('i18n ready', () => {
23
- i18n.init({
24
- locales: {},
25
- lang: 'en-US'
26
- });
27
- const pairs = [[1, '1.00', 2], [0.1, '0.10', 2], [1, '1.000', 3], [1, '1', 0]];
28
-
29
- /**
30
- * Makes a component.
31
- * @param {number} number Number
32
- * @param {number} fractions Decimal points.
33
- * @returns {Object}
34
- */
35
- const makeComponent = (number, fractions) => mount(/*#__PURE__*/_jsx(I18n.Provider, {
36
- children: /*#__PURE__*/_jsx("div", {
37
- children: /*#__PURE__*/_jsx(FormatNumber, {
38
- number: number,
39
- fractions: fractions
40
- })
41
- })
42
- }));
43
- pairs.forEach(([input, expexted, fractions]) => {
44
- it(`should format ${input} into ${expexted}`, () => {
45
- const component = makeComponent(input, fractions);
46
- expect(component.text().includes(`${expexted}`)).toBe(true);
47
- expect(component).toMatchSnapshot();
48
- });
49
- });
50
- });
51
- });