@shopgate/pwa-common 7.32.0-beta.2 → 7.32.0-beta.20
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/components/Button/index.js +6 -0
- package/components/Image/Image.d.ts +78 -0
- package/components/Image/Image.d.ts.map +1 -0
- package/components/Image/Image.js +123 -91
- package/components/Image/ImageInner.d.ts +45 -0
- package/components/Image/ImageInner.d.ts.map +1 -0
- package/components/Image/ImageInner.js +23 -29
- package/components/Image/index.d.ts +3 -0
- package/components/Image/index.d.ts.map +1 -0
- package/components/Swiper/index.js +17 -2
- package/constants/Configuration.js +7 -0
- package/helpers/mocks/mockRenderOptions.js +21 -0
- package/package.json +3 -3
- package/providers/toast/index.js +54 -40
- package/subscriptions/error.js +50 -27
- package/subscriptions/helpers/pipeline.js +68 -0
- package/subscriptions/router.js +2 -2
- package/action-creators/app/spec.js +0 -96
- package/action-creators/client/spec.js +0 -44
- package/action-creators/menu/spec.js +0 -37
- package/action-creators/modal/spec.js +0 -26
- package/action-creators/page/spec.js +0 -38
- package/action-creators/url/spec.js +0 -45
- package/action-creators/user/spec.js +0 -186
- package/components/Backdrop/spec.js +0 -24
- package/components/Button/spec.js +0 -42
- package/components/Checkbox/spec.js +0 -111
- package/components/CountdownTimer/spec.js +0 -141
- package/components/Drawer/spec.js +0 -79
- package/components/Ellipsis/spec.js +0 -15
- package/components/EmbeddedMedia/spec.js +0 -61
- package/components/Grid/components/Item/spec.js +0 -24
- package/components/Grid/spec.js +0 -24
- package/components/HtmlSanitizer/spec.js +0 -229
- package/components/I18n/components/FormatDate/spec.js +0 -54
- package/components/I18n/components/FormatNumber/spec.js +0 -51
- package/components/I18n/components/FormatPrice/spec.js +0 -54
- package/components/I18n/components/FormatTime/spec.js +0 -51
- package/components/I18n/components/I18nProvider/spec.js +0 -40
- package/components/I18n/components/Placeholder/spec.js +0 -37
- package/components/I18n/components/Translate/spec.js +0 -33
- package/components/InfiniteContainer/spec.js +0 -204
- package/components/Input/spec.js +0 -123
- package/components/Link/spec.js +0 -60
- package/components/List/spec.js +0 -26
- package/components/ModalContainer/spec.js +0 -115
- package/components/Select/spec.js +0 -122
- package/components/SelectBox/spec.js +0 -68
- package/components/Swiper/components/SwiperItem/spec.js +0 -26
- package/components/Widgets/components/Widget/spec.js +0 -75
- package/components/Widgets/components/WidgetGrid/spec.js +0 -53
- package/components/Widgets/spec.js +0 -234
- package/helpers/data/spec.js +0 -194
- package/helpers/date/spec.js +0 -92
- package/helpers/style/spec.js +0 -108
- package/helpers/validation/spec.js +0 -10
- package/styles/reset/form.js +0 -58
- package/styles/reset/index.js +0 -8
- package/styles/reset/media.js +0 -26
- package/styles/reset/root.js +0 -37
- package/styles/reset/table.js +0 -14
- package/styles/reset/typography.js +0 -30
- package/tsconfig.build.json +0 -16
- package/tsconfig.json +0 -3
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
import { requestLogin, successLogin, errorLogin, requestLogout, successLogout, errorLogout, requestUser, receiveUser, errorUser, toggleLoggedIn } from "./index";
|
|
2
|
-
import { REQUEST_LOGIN, SUCCESS_LOGIN, ERROR_LOGIN, REQUEST_LOGOUT, SUCCESS_LOGOUT, ERROR_LOGOUT, REQUEST_USER, RECEIVE_USER, ERROR_USER, TOGGLE_LOGGED_IN } from "../../constants/ActionTypes";
|
|
3
|
-
import { DEFAULT_LOGIN_STRATEGY } from "../../constants/user";
|
|
4
|
-
const messages = [{
|
|
5
|
-
type: 'EUNKNOWN',
|
|
6
|
-
message: 'Something went wrong',
|
|
7
|
-
code: 1337
|
|
8
|
-
}];
|
|
9
|
-
describe('Action Creators: user', () => {
|
|
10
|
-
describe('requestLogin()', () => {
|
|
11
|
-
it('should work as expected', () => {
|
|
12
|
-
const user = 'super@user.com';
|
|
13
|
-
const password = 'super#password';
|
|
14
|
-
const expected = {
|
|
15
|
-
type: REQUEST_LOGIN,
|
|
16
|
-
user,
|
|
17
|
-
password,
|
|
18
|
-
strategy: DEFAULT_LOGIN_STRATEGY
|
|
19
|
-
};
|
|
20
|
-
expect(requestLogin(user, password)).toEqual(expected);
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
describe('successLogin()', () => {
|
|
24
|
-
it('should work as expected with no parameters', () => {
|
|
25
|
-
const expected = {
|
|
26
|
-
type: SUCCESS_LOGIN,
|
|
27
|
-
redirect: undefined,
|
|
28
|
-
strategy: DEFAULT_LOGIN_STRATEGY
|
|
29
|
-
};
|
|
30
|
-
expect(successLogin()).toEqual(expected);
|
|
31
|
-
});
|
|
32
|
-
it('should work as expected with parameters', () => {
|
|
33
|
-
const redirect = '/some/url';
|
|
34
|
-
const strategy = 'custom';
|
|
35
|
-
const expected = {
|
|
36
|
-
type: SUCCESS_LOGIN,
|
|
37
|
-
redirect,
|
|
38
|
-
strategy
|
|
39
|
-
};
|
|
40
|
-
expect(successLogin(redirect, strategy)).toEqual(expected);
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
describe('errorLogin()', () => {
|
|
44
|
-
it('should work as expected', () => {
|
|
45
|
-
const expected = {
|
|
46
|
-
type: ERROR_LOGIN,
|
|
47
|
-
code: 'EUNKNOWN',
|
|
48
|
-
messages
|
|
49
|
-
};
|
|
50
|
-
expect(errorLogin(messages, 'EUNKNOWN')).toEqual(expected);
|
|
51
|
-
});
|
|
52
|
-
it('should work as expected when the messages parameter is empty', () => {
|
|
53
|
-
const expected = {
|
|
54
|
-
type: ERROR_LOGIN,
|
|
55
|
-
code: 'EUNKNOWN',
|
|
56
|
-
messages: []
|
|
57
|
-
};
|
|
58
|
-
expect(errorLogin(undefined, 'EUNKNOWN')).toEqual(expected);
|
|
59
|
-
});
|
|
60
|
-
it('should work as expected when the code paramter is empty', () => {
|
|
61
|
-
const expected = {
|
|
62
|
-
type: ERROR_LOGIN,
|
|
63
|
-
code: '',
|
|
64
|
-
messages
|
|
65
|
-
};
|
|
66
|
-
expect(errorLogin(messages)).toEqual(expected);
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
describe('requestLogout()', () => {
|
|
70
|
-
it('should work as expected', () => {
|
|
71
|
-
const expected = {
|
|
72
|
-
type: REQUEST_LOGOUT
|
|
73
|
-
};
|
|
74
|
-
expect(requestLogout()).toEqual(expected);
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
describe('successLogout()', () => {
|
|
78
|
-
it('should work as expected when called without parameter', () => {
|
|
79
|
-
const expected = {
|
|
80
|
-
type: SUCCESS_LOGOUT,
|
|
81
|
-
notify: true,
|
|
82
|
-
autoLogout: false
|
|
83
|
-
};
|
|
84
|
-
expect(successLogout()).toEqual(expected);
|
|
85
|
-
});
|
|
86
|
-
it('should work as expected when called with true', () => {
|
|
87
|
-
const expected = {
|
|
88
|
-
type: SUCCESS_LOGOUT,
|
|
89
|
-
notify: true,
|
|
90
|
-
autoLogout: false
|
|
91
|
-
};
|
|
92
|
-
expect(successLogout(true)).toEqual(expected);
|
|
93
|
-
});
|
|
94
|
-
it('should work as expected when called with false', () => {
|
|
95
|
-
const expected = {
|
|
96
|
-
type: SUCCESS_LOGOUT,
|
|
97
|
-
notify: false,
|
|
98
|
-
autoLogout: false
|
|
99
|
-
};
|
|
100
|
-
expect(successLogout(false)).toEqual(expected);
|
|
101
|
-
});
|
|
102
|
-
it('should work as expected when called with autoLogout parameter', () => {
|
|
103
|
-
const expected = {
|
|
104
|
-
type: SUCCESS_LOGOUT,
|
|
105
|
-
notify: true,
|
|
106
|
-
autoLogout: true
|
|
107
|
-
};
|
|
108
|
-
expect(successLogout(undefined, true)).toEqual(expected);
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
describe('errorLogout()', () => {
|
|
112
|
-
it('should work as expected', () => {
|
|
113
|
-
const expected = {
|
|
114
|
-
type: ERROR_LOGOUT,
|
|
115
|
-
messages,
|
|
116
|
-
autoLogout: false
|
|
117
|
-
};
|
|
118
|
-
expect(errorLogout(messages)).toEqual(expected);
|
|
119
|
-
});
|
|
120
|
-
it('should work as expected when the messages parameter is empty', () => {
|
|
121
|
-
const expected = {
|
|
122
|
-
type: ERROR_LOGOUT,
|
|
123
|
-
messages: [],
|
|
124
|
-
autoLogout: false
|
|
125
|
-
};
|
|
126
|
-
expect(errorLogout()).toEqual(expected);
|
|
127
|
-
});
|
|
128
|
-
it('should work as expected when called with autoLogout parameter', () => {
|
|
129
|
-
const expected = {
|
|
130
|
-
type: ERROR_LOGOUT,
|
|
131
|
-
messages,
|
|
132
|
-
autoLogout: true
|
|
133
|
-
};
|
|
134
|
-
expect(errorLogout(messages, true)).toEqual(expected);
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
describe('requestUser()', () => {
|
|
138
|
-
it('should work as expected', () => {
|
|
139
|
-
const expected = {
|
|
140
|
-
type: REQUEST_USER
|
|
141
|
-
};
|
|
142
|
-
expect(requestUser()).toEqual(expected);
|
|
143
|
-
});
|
|
144
|
-
});
|
|
145
|
-
describe('receiveUser()', () => {
|
|
146
|
-
it('should work as expected', () => {
|
|
147
|
-
const user = {
|
|
148
|
-
firstName: 'John',
|
|
149
|
-
lastName: 'Doe',
|
|
150
|
-
mail: 'john@doe.com'
|
|
151
|
-
};
|
|
152
|
-
const expected = {
|
|
153
|
-
type: RECEIVE_USER,
|
|
154
|
-
user
|
|
155
|
-
};
|
|
156
|
-
expect(receiveUser(user)).toEqual(expected);
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
describe('errorUser()', () => {
|
|
160
|
-
it('should work as expected', () => {
|
|
161
|
-
const err = new Error();
|
|
162
|
-
// eslint-disable-next-line extra-rules/no-single-line-objects
|
|
163
|
-
const expected = {
|
|
164
|
-
type: ERROR_USER,
|
|
165
|
-
error: err
|
|
166
|
-
};
|
|
167
|
-
expect(errorUser(err)).toEqual(expected);
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
describe('toggleLoggedIn()', () => {
|
|
171
|
-
it('should toggle to true', () => {
|
|
172
|
-
const expected = {
|
|
173
|
-
type: TOGGLE_LOGGED_IN,
|
|
174
|
-
value: true
|
|
175
|
-
};
|
|
176
|
-
expect(toggleLoggedIn(true)).toEqual(expected);
|
|
177
|
-
});
|
|
178
|
-
it('should toggle to false', () => {
|
|
179
|
-
const expected = {
|
|
180
|
-
type: TOGGLE_LOGGED_IN,
|
|
181
|
-
value: false
|
|
182
|
-
};
|
|
183
|
-
expect(toggleLoggedIn(false)).toEqual(expected);
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
});
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { shallow, mount } from 'enzyme';
|
|
3
|
-
import Backdrop from "./index";
|
|
4
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
5
|
-
describe('<Backdrop />', () => {
|
|
6
|
-
let mockOpen;
|
|
7
|
-
beforeEach(() => {
|
|
8
|
-
mockOpen = jest.fn();
|
|
9
|
-
});
|
|
10
|
-
it('should render', () => {
|
|
11
|
-
const wrapper = shallow(/*#__PURE__*/_jsx(Backdrop, {
|
|
12
|
-
isVisible: true
|
|
13
|
-
}));
|
|
14
|
-
expect(wrapper).toMatchSnapshot();
|
|
15
|
-
});
|
|
16
|
-
it('should execute callback when Backdrop is clicked', () => {
|
|
17
|
-
const wrapper = mount(/*#__PURE__*/_jsx(Backdrop, {
|
|
18
|
-
isVisible: true,
|
|
19
|
-
onClick: mockOpen
|
|
20
|
-
}));
|
|
21
|
-
wrapper.find('div').simulate('click');
|
|
22
|
-
expect(mockOpen).toBeCalled();
|
|
23
|
-
});
|
|
24
|
-
});
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { shallow } from 'enzyme';
|
|
3
|
-
import Button from "./index";
|
|
4
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
5
|
-
describe('<Button />', () => {
|
|
6
|
-
it('should render the button', () => {
|
|
7
|
-
const wrapper = shallow(/*#__PURE__*/_jsx(Button, {
|
|
8
|
-
children: "My content"
|
|
9
|
-
}));
|
|
10
|
-
expect(wrapper).toMatchSnapshot();
|
|
11
|
-
expect(wrapper.find('button').length).toBe(1);
|
|
12
|
-
});
|
|
13
|
-
it('should render the button in disabled state', () => {
|
|
14
|
-
const wrapper = shallow(/*#__PURE__*/_jsx(Button, {
|
|
15
|
-
disabled: true,
|
|
16
|
-
children: "My content"
|
|
17
|
-
}));
|
|
18
|
-
expect(wrapper).toMatchSnapshot();
|
|
19
|
-
expect(wrapper.find('button[disabled]').length).toBe(1);
|
|
20
|
-
});
|
|
21
|
-
it('should trigger the click event', () => {
|
|
22
|
-
const callback = jest.fn();
|
|
23
|
-
const wrapper = shallow(/*#__PURE__*/_jsx(Button, {
|
|
24
|
-
onClick: callback,
|
|
25
|
-
children: "My content"
|
|
26
|
-
}));
|
|
27
|
-
wrapper.simulate('click');
|
|
28
|
-
expect(wrapper).toMatchSnapshot();
|
|
29
|
-
expect(callback).toHaveBeenCalled();
|
|
30
|
-
});
|
|
31
|
-
it('should not trigger the click event when disabled', () => {
|
|
32
|
-
const callback = jest.fn();
|
|
33
|
-
const wrapper = shallow(/*#__PURE__*/_jsx(Button, {
|
|
34
|
-
disabled: true,
|
|
35
|
-
onClick: callback,
|
|
36
|
-
children: "My content"
|
|
37
|
-
}));
|
|
38
|
-
wrapper.simulate('click');
|
|
39
|
-
expect(wrapper).toMatchSnapshot();
|
|
40
|
-
expect(callback).not.toHaveBeenCalled();
|
|
41
|
-
});
|
|
42
|
-
});
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { shallow } from 'enzyme';
|
|
3
|
-
import Checkbox from "./index";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Checked Icon
|
|
7
|
-
* @returns {JSX}
|
|
8
|
-
*/
|
|
9
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
10
|
-
const Checked = () => /*#__PURE__*/_jsx("div", {});
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Unchecked Icon
|
|
14
|
-
* @returns {JSX}
|
|
15
|
-
*/
|
|
16
|
-
const Unchecked = () => /*#__PURE__*/_jsx("div", {});
|
|
17
|
-
describe('<Checkbox />', () => {
|
|
18
|
-
it('should render the checkbox with the label before the icon', () => {
|
|
19
|
-
const wrapper = shallow(/*#__PURE__*/_jsx(Checkbox, {
|
|
20
|
-
label: /*#__PURE__*/_jsx("span", {
|
|
21
|
-
children: "Test Label Deluxe"
|
|
22
|
-
}),
|
|
23
|
-
labelPosition: "left",
|
|
24
|
-
checkedIcon: /*#__PURE__*/_jsx(Checked, {}),
|
|
25
|
-
uncheckedIcon: /*#__PURE__*/_jsx(Unchecked, {}),
|
|
26
|
-
checked: false
|
|
27
|
-
}));
|
|
28
|
-
const expected = /*#__PURE__*/_jsxs("div", {
|
|
29
|
-
children: [/*#__PURE__*/_jsx("span", {
|
|
30
|
-
children: "Test Label Deluxe"
|
|
31
|
-
}), /*#__PURE__*/_jsx(Unchecked, {})]
|
|
32
|
-
});
|
|
33
|
-
expect(wrapper).toMatchSnapshot();
|
|
34
|
-
expect(wrapper.matchesElement(expected)).toBeTruthy();
|
|
35
|
-
});
|
|
36
|
-
it('should render the checkbox with the label after the icon', () => {
|
|
37
|
-
const wrapper = shallow(/*#__PURE__*/_jsx(Checkbox, {
|
|
38
|
-
label: /*#__PURE__*/_jsx("span", {
|
|
39
|
-
children: "Test Label Deluxe"
|
|
40
|
-
}),
|
|
41
|
-
labelPosition: "right",
|
|
42
|
-
checkedIcon: /*#__PURE__*/_jsx(Checked, {}),
|
|
43
|
-
uncheckedIcon: /*#__PURE__*/_jsx(Unchecked, {}),
|
|
44
|
-
checked: false
|
|
45
|
-
}));
|
|
46
|
-
const expected = /*#__PURE__*/_jsxs("div", {
|
|
47
|
-
children: [/*#__PURE__*/_jsx(Unchecked, {}), /*#__PURE__*/_jsx("span", {
|
|
48
|
-
children: "Test Label Deluxe"
|
|
49
|
-
})]
|
|
50
|
-
});
|
|
51
|
-
expect(wrapper).toMatchSnapshot();
|
|
52
|
-
expect(wrapper.matchesElement(expected)).toBeTruthy();
|
|
53
|
-
});
|
|
54
|
-
it('should render the unchecked icon if "checked" is false', () => {
|
|
55
|
-
const wrapper = shallow(/*#__PURE__*/_jsx(Checkbox, {
|
|
56
|
-
checked: false,
|
|
57
|
-
label: "Test Label Deluxe",
|
|
58
|
-
checkedIcon: /*#__PURE__*/_jsx(Checked, {}),
|
|
59
|
-
uncheckedIcon: /*#__PURE__*/_jsx(Unchecked, {})
|
|
60
|
-
}));
|
|
61
|
-
expect(wrapper).toMatchSnapshot();
|
|
62
|
-
expect(wrapper.find(Checked).length).toBe(0);
|
|
63
|
-
expect(wrapper.find(Unchecked).length).toBe(1);
|
|
64
|
-
});
|
|
65
|
-
it('should render the unchecked icon if "checked" is false', () => {
|
|
66
|
-
const wrapper = shallow(/*#__PURE__*/_jsx(Checkbox, {
|
|
67
|
-
checked: true,
|
|
68
|
-
label: "Test Label Deluxe",
|
|
69
|
-
checkedIcon: /*#__PURE__*/_jsx(Checked, {}),
|
|
70
|
-
uncheckedIcon: /*#__PURE__*/_jsx(Unchecked, {})
|
|
71
|
-
}));
|
|
72
|
-
expect(wrapper).toMatchSnapshot();
|
|
73
|
-
expect(wrapper.find(Checked).length).toBe(1);
|
|
74
|
-
expect(wrapper.find(Unchecked).length).toBe(0);
|
|
75
|
-
});
|
|
76
|
-
it('should call the callback with the inverted value', () => {
|
|
77
|
-
const spy = jest.fn();
|
|
78
|
-
const wrapper = shallow(/*#__PURE__*/_jsx(Checkbox, {
|
|
79
|
-
label: "Test Label Deluxe",
|
|
80
|
-
checkedIcon: /*#__PURE__*/_jsx(Checked, {}),
|
|
81
|
-
uncheckedIcon: /*#__PURE__*/_jsx(Unchecked, {}),
|
|
82
|
-
checked: false,
|
|
83
|
-
onCheck: spy
|
|
84
|
-
}));
|
|
85
|
-
wrapper.simulate('click');
|
|
86
|
-
expect(spy).toHaveBeenCalledWith(true);
|
|
87
|
-
});
|
|
88
|
-
it('should render an <input> element if a name prop is provided', () => {
|
|
89
|
-
const wrapper = shallow(/*#__PURE__*/_jsx(Checkbox, {
|
|
90
|
-
label: "Test Label Deluxe",
|
|
91
|
-
checkedIcon: /*#__PURE__*/_jsx(Checked, {}),
|
|
92
|
-
uncheckedIcon: /*#__PURE__*/_jsx(Unchecked, {}),
|
|
93
|
-
defaultChecked: false,
|
|
94
|
-
name: "myCheckbox"
|
|
95
|
-
}));
|
|
96
|
-
const input = wrapper.find('input');
|
|
97
|
-
expect(input.length).toBe(1);
|
|
98
|
-
expect(input.prop('name')).toEqual('myCheckbox');
|
|
99
|
-
expect(input.prop('value')).toEqual(0);
|
|
100
|
-
});
|
|
101
|
-
it('should work as an uncontrolled input', () => {
|
|
102
|
-
const wrapper = shallow(/*#__PURE__*/_jsx(Checkbox, {
|
|
103
|
-
label: "Test Label Deluxe",
|
|
104
|
-
checkedIcon: /*#__PURE__*/_jsx(Checked, {}),
|
|
105
|
-
uncheckedIcon: /*#__PURE__*/_jsx(Unchecked, {}),
|
|
106
|
-
defaultChecked: false
|
|
107
|
-
}));
|
|
108
|
-
wrapper.simulate('click');
|
|
109
|
-
expect(wrapper.state('checked')).toBe(true);
|
|
110
|
-
});
|
|
111
|
-
});
|
|
@@ -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
|
-
});
|