auth0-lock 14.3.0 → 15.0.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.
- package/.github/workflows/codeql.yml +1 -1
- package/.github/workflows/npm-release.yml +1 -1
- package/.github/workflows/snyk.yml +1 -1
- package/.github/workflows/test.yml +2 -2
- package/.husky/pre-commit +4 -0
- package/.version +1 -1
- package/CHANGELOG.md +28 -0
- package/README.md +1 -1
- package/lib/__tests__/auth_button.js +21 -6
- package/lib/__tests__/connection/database/login_pane.js +12 -5
- package/lib/__tests__/connection/database/reset_password.js +15 -12
- package/lib/__tests__/connection/enterprise/hrd_pane.js +16 -6
- package/lib/__tests__/connection/enterprise/hrd_screen.js +27 -18
- package/lib/__tests__/connection/passwordless/ask_vcode.js +15 -7
- package/lib/__tests__/core/sso/last_login_screen.js +91 -40
- package/lib/__tests__/engine/classic/mfa_login_screen.js +9 -3
- package/lib/__tests__/engine/classic/sign_up_pane.js +16 -6
- package/lib/__tests__/engine/classic/sign_up_screen.js +0 -1
- package/lib/__tests__/field/captcha/arkose.js +7 -0
- package/lib/__tests__/field/captcha/auth0_v2.js +6 -0
- package/lib/__tests__/field/captcha/friendlyCaptcha.js +6 -0
- package/lib/__tests__/field/captcha/hcaptcha.js +6 -0
- package/lib/__tests__/field/captcha/recaptcha_enterprise.js +6 -0
- package/lib/__tests__/field/captcha/recaptchav2.js +6 -0
- package/lib/__tests__/field/captcha/third_party_captcha.js +97 -64
- package/lib/__tests__/field/captcha.js +76 -143
- package/lib/__tests__/field/custom_input.js +7 -5
- package/lib/__tests__/field/email_pane.js +27 -11
- package/lib/__tests__/field/login_pane.js +6 -3
- package/lib/__tests__/field/mfa_code_pane.js +13 -6
- package/lib/__tests__/field/option_selection_pane.js +17 -7
- package/lib/__tests__/field/password_pane.js +8 -10
- package/lib/__tests__/field/phone_number_pane.js +7 -5
- package/lib/__tests__/field/social_buttons_pane.js +12 -9
- package/lib/__tests__/field/username_pane.js +33 -14
- package/lib/__tests__/field/vcode_pane.js +9 -5
- package/lib/__tests__/setup-tests.js +1 -7
- package/lib/__tests__/testUtils.js +27 -42
- package/lib/__tests__/ui/box/global_message.js +75 -42
- package/lib/__tests__/ui/input/email_input.js +4 -4
- package/lib/__tests__/ui/input/password/password_strength.js +8 -7
- package/lib/__tests__/ui/input/password_input.js +18 -14
- package/lib/avatar/gravatar_provider.js +1 -2
- package/lib/connection/database/index.js +1 -2
- package/lib/core/index.js +1 -2
- package/lib/core/web_api/helper.js +1 -1
- package/lib/field/email.js +1 -2
- package/lib/field/index.js +4 -5
- package/lib/field/mfa_code.js +1 -3
- package/lib/field/username.js +2 -4
- package/lib/i18n.js +1 -1
- package/lib/lock.js +1 -1
- package/lib/passwordless.js +1 -1
- package/package.json +13 -10
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
4
4
|
var _react = _interopRequireDefault(require("react"));
|
|
5
|
-
var
|
|
6
|
-
var _testUtils = require("react-dom/test-utils");
|
|
5
|
+
var _react2 = require("@testing-library/react");
|
|
7
6
|
var _immutable = _interopRequireDefault(require("immutable"));
|
|
8
7
|
var l = _interopRequireWildcard(require("../../../core/index"));
|
|
9
8
|
var _third_party_captcha = require("../../../field/captcha/third_party_captcha");
|
|
@@ -15,6 +14,7 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
|
|
|
15
14
|
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
|
16
15
|
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
|
17
16
|
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
17
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
18
18
|
var createLockMock = function createLockMock() {
|
|
19
19
|
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
|
20
20
|
_ref$provider = _ref.provider,
|
|
@@ -37,9 +37,41 @@ var createLockMock = function createLockMock() {
|
|
|
37
37
|
}
|
|
38
38
|
});
|
|
39
39
|
};
|
|
40
|
+
|
|
41
|
+
// Renders the component and manually triggers the injectCaptchaScript callback,
|
|
42
|
+
// mimicking the original Enzyme test pattern: spy replaces injectCaptchaScript
|
|
43
|
+
// so the automatic componentDidMount call is captured, then the callback is invoked.
|
|
44
|
+
var mountCaptcha = function mountCaptcha(props) {
|
|
45
|
+
var instance = null;
|
|
46
|
+
|
|
47
|
+
// Intercept injectCaptchaScript on the prototype so the automatic
|
|
48
|
+
// componentDidMount call (during RTL render) does NOT invoke the captcha library.
|
|
49
|
+
var proto = _third_party_captcha.ThirdPartyCaptcha.prototype;
|
|
50
|
+
var original = proto.injectCaptchaScript;
|
|
51
|
+
proto.injectCaptchaScript = function (callback) {
|
|
52
|
+
// no-op: prevents the library from being triggered by the automatic mount
|
|
53
|
+
};
|
|
54
|
+
try {
|
|
55
|
+
(0, _react2.act)(function () {
|
|
56
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_third_party_captcha.ThirdPartyCaptcha, _extends({}, props, {
|
|
57
|
+
ref: function ref(r) {
|
|
58
|
+
instance = r;
|
|
59
|
+
}
|
|
60
|
+
})));
|
|
61
|
+
});
|
|
62
|
+
} finally {
|
|
63
|
+
// Restore original regardless of whether render throws
|
|
64
|
+
proto.injectCaptchaScript = original;
|
|
65
|
+
}
|
|
66
|
+
(0, _react2.act)(function () {
|
|
67
|
+
var spy = jest.spyOn(instance, 'injectCaptchaScript');
|
|
68
|
+
instance.componentDidMount();
|
|
69
|
+
spy.mock.calls[0][0]();
|
|
70
|
+
});
|
|
71
|
+
return instance;
|
|
72
|
+
};
|
|
40
73
|
describe('ThirdPartyCaptcha', function () {
|
|
41
74
|
var prevWindow;
|
|
42
|
-
var counter = 0;
|
|
43
75
|
beforeAll(function () {
|
|
44
76
|
prevWindow = global.window;
|
|
45
77
|
global.window.grecaptcha = {
|
|
@@ -59,38 +91,32 @@ describe('ThirdPartyCaptcha', function () {
|
|
|
59
91
|
};
|
|
60
92
|
global.window.turnstile = {
|
|
61
93
|
render: jest.fn(),
|
|
62
|
-
reset: function reset() {
|
|
63
|
-
var _global$window$turnst;
|
|
64
|
-
(_global$window$turnst = global.window.turnstile).render.apply(_global$window$turnst, _toConsumableArray(global.window.turnstile.render.mock.calls[counter]));
|
|
65
|
-
counter++;
|
|
66
|
-
}
|
|
94
|
+
reset: function reset() {}
|
|
67
95
|
};
|
|
68
96
|
});
|
|
69
97
|
afterAll(function () {
|
|
70
98
|
global.window = prevWindow;
|
|
71
99
|
});
|
|
72
100
|
describe('recaptchav2', function () {
|
|
73
|
-
var wrapper;
|
|
74
101
|
beforeAll(function () {
|
|
102
|
+
global.window.grecaptcha.render.mockClear();
|
|
75
103
|
var lockMock = createLockMock({
|
|
76
104
|
provider: 'recaptcha_v2',
|
|
77
105
|
siteKey: 'mySiteKey'
|
|
78
106
|
});
|
|
79
107
|
var captcha = l.captcha(lockMock);
|
|
80
|
-
|
|
108
|
+
mountCaptcha({
|
|
81
109
|
provider: captcha.get('provider'),
|
|
82
110
|
sitekey: captcha.get('siteKey'),
|
|
83
111
|
clientSubdomain: captcha.get('clientSubdomain'),
|
|
84
112
|
hl: 'en',
|
|
85
113
|
isValid: true,
|
|
86
114
|
value: undefined
|
|
87
|
-
})).instance();
|
|
88
|
-
(0, _testUtils.act)(function () {
|
|
89
|
-
var injectCaptchaScriptSpy = jest.spyOn(wrapper, 'injectCaptchaScript');
|
|
90
|
-
wrapper.componentDidMount();
|
|
91
|
-
injectCaptchaScriptSpy.mock.calls[0][0]();
|
|
92
115
|
});
|
|
93
116
|
});
|
|
117
|
+
afterAll(function () {
|
|
118
|
+
return (0, _react2.cleanup)();
|
|
119
|
+
});
|
|
94
120
|
it('should call render with the correct renderParams', function () {
|
|
95
121
|
var renderParams = global.window.grecaptcha.render.mock.calls[0][1];
|
|
96
122
|
expect(renderParams).toEqual({
|
|
@@ -102,28 +128,25 @@ describe('ThirdPartyCaptcha', function () {
|
|
|
102
128
|
});
|
|
103
129
|
});
|
|
104
130
|
describe('friendly captcha', function () {
|
|
105
|
-
var wrapper;
|
|
106
131
|
beforeAll(function () {
|
|
132
|
+
global.window.friendlyChallenge.WidgetInstance.mockClear();
|
|
107
133
|
var lockMock = createLockMock({
|
|
108
134
|
provider: 'friendly_captcha',
|
|
109
135
|
siteKey: 'mySiteKey'
|
|
110
136
|
});
|
|
111
137
|
var captcha = l.captcha(lockMock);
|
|
112
|
-
|
|
138
|
+
mountCaptcha({
|
|
113
139
|
provider: captcha.get('provider'),
|
|
114
140
|
sitekey: captcha.get('siteKey'),
|
|
115
141
|
clientSubdomain: captcha.get('clientSubdomain'),
|
|
116
142
|
hl: 'en',
|
|
117
143
|
isValid: true,
|
|
118
144
|
value: undefined
|
|
119
|
-
})).instance();
|
|
120
|
-
(0, _testUtils.act)(function () {
|
|
121
|
-
var injectCaptchaScriptSpy = jest.spyOn(wrapper, 'injectCaptchaScript');
|
|
122
|
-
wrapper.componentDidMount();
|
|
123
|
-
jest.spyOn(global.window.friendlyChallenge, 'WidgetInstance');
|
|
124
|
-
injectCaptchaScriptSpy.mock.calls[0][0]();
|
|
125
145
|
});
|
|
126
146
|
});
|
|
147
|
+
afterAll(function () {
|
|
148
|
+
return (0, _react2.cleanup)();
|
|
149
|
+
});
|
|
127
150
|
it('should call WidgetInstance constructor with the correct renderParams', function () {
|
|
128
151
|
var renderParams = global.window.friendlyChallenge.WidgetInstance.mock.calls[0][1];
|
|
129
152
|
expect(renderParams).toEqual({
|
|
@@ -135,27 +158,26 @@ describe('ThirdPartyCaptcha', function () {
|
|
|
135
158
|
});
|
|
136
159
|
});
|
|
137
160
|
describe('hcaptcha', function () {
|
|
138
|
-
var
|
|
161
|
+
var instance;
|
|
139
162
|
beforeAll(function () {
|
|
163
|
+
global.window.hcaptcha.render.mockClear();
|
|
140
164
|
var lockMock = createLockMock({
|
|
141
165
|
provider: 'hcaptcha',
|
|
142
166
|
siteKey: 'mySiteKey'
|
|
143
167
|
});
|
|
144
168
|
var captcha = l.captcha(lockMock);
|
|
145
|
-
|
|
169
|
+
instance = mountCaptcha({
|
|
146
170
|
provider: captcha.get('provider'),
|
|
147
171
|
sitekey: captcha.get('siteKey'),
|
|
148
172
|
clientSubdomain: captcha.get('clientSubdomain'),
|
|
149
173
|
hl: 'en',
|
|
150
174
|
isValid: true,
|
|
151
175
|
value: undefined
|
|
152
|
-
})).instance();
|
|
153
|
-
(0, _testUtils.act)(function () {
|
|
154
|
-
var injectCaptchaScriptSpy = jest.spyOn(wrapper, 'injectCaptchaScript');
|
|
155
|
-
wrapper.componentDidMount();
|
|
156
|
-
injectCaptchaScriptSpy.mock.calls[0][0]();
|
|
157
176
|
});
|
|
158
177
|
});
|
|
178
|
+
afterAll(function () {
|
|
179
|
+
return (0, _react2.cleanup)();
|
|
180
|
+
});
|
|
159
181
|
it('should call render with the correct renderParams', function () {
|
|
160
182
|
var renderCalls = global.window.hcaptcha.render.mock.calls;
|
|
161
183
|
var renderParams = renderCalls[0][1];
|
|
@@ -165,40 +187,46 @@ describe('ThirdPartyCaptcha', function () {
|
|
|
165
187
|
'expired-callback': expect.any(Function),
|
|
166
188
|
'error-callback': expect.any(Function)
|
|
167
189
|
});
|
|
168
|
-
|
|
190
|
+
// mountCaptcha triggers componentDidMount twice: once automatically by RTL render,
|
|
191
|
+
// once manually after the prototype is restored (to drive the spy). Two render calls expected.
|
|
192
|
+
expect(renderCalls.length).toEqual(2);
|
|
169
193
|
});
|
|
170
|
-
it('should call render on update', function () {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
expect(renderCalls.length).toEqual(1);
|
|
194
|
+
it('should not call render again on update', function () {
|
|
195
|
+
var countBefore = global.window.hcaptcha.render.mock.calls.length;
|
|
196
|
+
(0, _react2.act)(function () {
|
|
197
|
+
instance.setState({});
|
|
175
198
|
});
|
|
199
|
+
var countAfter = global.window.hcaptcha.render.mock.calls.length;
|
|
200
|
+
expect(countAfter).toEqual(countBefore);
|
|
176
201
|
});
|
|
177
202
|
});
|
|
178
203
|
describe('auth0_v2', function () {
|
|
179
|
-
var
|
|
180
|
-
|
|
204
|
+
var mountAuth0V2 = function mountAuth0V2() {
|
|
205
|
+
var onChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : jest.fn();
|
|
206
|
+
var counter = 0;
|
|
207
|
+
global.window.turnstile.render.mockClear();
|
|
208
|
+
global.window.turnstile.reset = function () {
|
|
209
|
+
var _global$window$turnst;
|
|
210
|
+
(_global$window$turnst = global.window.turnstile).render.apply(_global$window$turnst, _toConsumableArray(global.window.turnstile.render.mock.calls[counter]));
|
|
211
|
+
counter++;
|
|
212
|
+
};
|
|
181
213
|
var lockMock = createLockMock({
|
|
182
214
|
provider: 'auth0_v2',
|
|
183
215
|
siteKey: 'mySiteKey'
|
|
184
216
|
});
|
|
185
217
|
var captcha = l.captcha(lockMock);
|
|
186
|
-
|
|
218
|
+
return mountCaptcha({
|
|
187
219
|
provider: captcha.get('provider'),
|
|
188
220
|
sitekey: captcha.get('siteKey'),
|
|
189
221
|
clientSubdomain: captcha.get('clientSubdomain'),
|
|
190
222
|
hl: 'en',
|
|
191
223
|
isValid: true,
|
|
192
224
|
value: undefined,
|
|
193
|
-
onChange:
|
|
194
|
-
})).instance();
|
|
195
|
-
(0, _testUtils.act)(function () {
|
|
196
|
-
var injectCaptchaScriptSpy = jest.spyOn(wrapper, 'injectCaptchaScript');
|
|
197
|
-
wrapper.componentDidMount();
|
|
198
|
-
injectCaptchaScriptSpy.mock.calls[0][0]();
|
|
225
|
+
onChange: onChange
|
|
199
226
|
});
|
|
200
|
-
}
|
|
227
|
+
};
|
|
201
228
|
it('should call render with the correct renderParams', function () {
|
|
229
|
+
mountAuth0V2();
|
|
202
230
|
var renderParams = global.window.turnstile.render.mock.calls[0][1];
|
|
203
231
|
expect(renderParams).toEqual({
|
|
204
232
|
sitekey: 'mySiteKey',
|
|
@@ -210,52 +238,57 @@ describe('ThirdPartyCaptcha', function () {
|
|
|
210
238
|
retry: 'never',
|
|
211
239
|
'response-field': false
|
|
212
240
|
});
|
|
241
|
+
(0, _react2.cleanup)();
|
|
213
242
|
});
|
|
214
243
|
it('should retry 3 times on error and then set value to BYPASS_CAPTCHA dummy token for failOpen', function () {
|
|
215
|
-
var
|
|
244
|
+
var onChange = jest.fn();
|
|
245
|
+
var instance = mountAuth0V2(onChange);
|
|
246
|
+
|
|
247
|
+
// Call error-callback 3 times — each should increment retryCount and trigger reset (new render call)
|
|
216
248
|
var _loop = function _loop() {
|
|
217
|
-
var
|
|
218
|
-
|
|
219
|
-
|
|
249
|
+
var renderCallIndex = global.window.turnstile.render.mock.calls.length - 1;
|
|
250
|
+
var currentErrorCallback = global.window.turnstile.render.mock.calls[renderCallIndex][1]['error-callback'];
|
|
251
|
+
(0, _react2.act)(function () {
|
|
252
|
+
currentErrorCallback();
|
|
220
253
|
});
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
expect(retryCount).toBe(i + 1);
|
|
224
|
-
expect(value).toBe(undefined);
|
|
254
|
+
expect(instance.state.retryCount).toBe(i + 1);
|
|
255
|
+
expect(instance.props.value).toBe(undefined);
|
|
225
256
|
};
|
|
226
257
|
for (var i = 0; i < 3; i++) {
|
|
227
258
|
_loop();
|
|
228
259
|
}
|
|
229
|
-
|
|
230
|
-
|
|
260
|
+
|
|
261
|
+
// 4th call — past MAX_RETRY, should invoke onChange with BYPASS_CAPTCHA
|
|
262
|
+
var lastRenderCallIndex = global.window.turnstile.render.mock.calls.length - 1;
|
|
263
|
+
var lastErrorCallback = global.window.turnstile.render.mock.calls[lastRenderCallIndex][1]['error-callback'];
|
|
264
|
+
(0, _react2.act)(function () {
|
|
265
|
+
lastErrorCallback();
|
|
231
266
|
});
|
|
232
|
-
var onChange = wrapper.props.onChange;
|
|
233
267
|
expect(onChange.mock.calls).toHaveLength(1);
|
|
234
268
|
expect(onChange.mock.calls[0][0]).toBe('BYPASS_CAPTCHA');
|
|
269
|
+
(0, _react2.cleanup)();
|
|
235
270
|
});
|
|
236
271
|
});
|
|
237
272
|
describe('recaptcha enterprise', function () {
|
|
238
|
-
var wrapper;
|
|
239
273
|
beforeAll(function () {
|
|
274
|
+
global.window.grecaptcha.enterprise.render.mockClear();
|
|
240
275
|
var lockMock = createLockMock({
|
|
241
276
|
provider: 'recaptcha_enterprise',
|
|
242
277
|
siteKey: 'mySiteKey'
|
|
243
278
|
});
|
|
244
279
|
var captcha = l.captcha(lockMock);
|
|
245
|
-
|
|
280
|
+
mountCaptcha({
|
|
246
281
|
provider: captcha.get('provider'),
|
|
247
282
|
sitekey: captcha.get('siteKey'),
|
|
248
283
|
clientSubdomain: captcha.get('clientSubdomain'),
|
|
249
284
|
hl: 'en',
|
|
250
285
|
isValid: true,
|
|
251
286
|
value: undefined
|
|
252
|
-
})).instance();
|
|
253
|
-
(0, _testUtils.act)(function () {
|
|
254
|
-
var injectCaptchaScriptSpy = jest.spyOn(wrapper, 'injectCaptchaScript');
|
|
255
|
-
wrapper.componentDidMount();
|
|
256
|
-
injectCaptchaScriptSpy.mock.calls[0][0]();
|
|
257
287
|
});
|
|
258
288
|
});
|
|
289
|
+
afterAll(function () {
|
|
290
|
+
return (0, _react2.cleanup)();
|
|
291
|
+
});
|
|
259
292
|
it('should call render with the correct renderParams', function () {
|
|
260
293
|
var renderParams = global.window.grecaptcha.enterprise.render.mock.calls[0][1];
|
|
261
294
|
expect(renderParams).toEqual({
|
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _react = _interopRequireDefault(require("react"));
|
|
4
|
-
var
|
|
4
|
+
var _react2 = require("@testing-library/react");
|
|
5
5
|
var _immutable = _interopRequireDefault(require("immutable"));
|
|
6
6
|
var _captcha_pane = _interopRequireDefault(require("../../field/captcha/captcha_pane"));
|
|
7
|
-
var _third_party_captcha = require("../../field/captcha/third_party_captcha");
|
|
8
|
-
var _captcha_input = _interopRequireDefault(require("../../ui/input/captcha_input"));
|
|
9
7
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
9
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
10
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
11
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
12
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
13
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
14
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
15
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
16
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
17
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
18
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
19
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
10
20
|
var createLockMock = function createLockMock() {
|
|
11
21
|
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
|
12
22
|
_ref$provider = _ref.provider,
|
|
@@ -34,157 +44,80 @@ var createI18nMock = function createI18nMock() {
|
|
|
34
44
|
str: jest.fn().mockReturnValue('My i18N Compliant Language')
|
|
35
45
|
};
|
|
36
46
|
};
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}));
|
|
49
|
-
});
|
|
50
|
-
it('should render CaptchaInput if no provider is specified', function () {
|
|
51
|
-
expect(wrapper.find(_captcha_input.default)).toHaveLength(1);
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
describe('recaptchav2', function () {
|
|
55
|
-
var wrapper;
|
|
56
|
-
beforeAll(function () {
|
|
57
|
-
var lockMock = createLockMock({
|
|
58
|
-
provider: 'recaptcha_v2',
|
|
59
|
-
siteKey: 'mySiteKey'
|
|
47
|
+
|
|
48
|
+
// We spy on ThirdPartyCaptcha and CaptchaInput via module mock to capture rendered props
|
|
49
|
+
var lastThirdPartyCaptchaProps = null;
|
|
50
|
+
var lastCaptchaInputProps = null;
|
|
51
|
+
jest.mock('../../field/captcha/third_party_captcha', function () {
|
|
52
|
+
var actual = jest.requireActual('../../field/captcha/third_party_captcha');
|
|
53
|
+
return _objectSpread(_objectSpread({}, actual), {}, {
|
|
54
|
+
ThirdPartyCaptcha: function ThirdPartyCaptcha(props) {
|
|
55
|
+
lastThirdPartyCaptchaProps = props;
|
|
56
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
57
|
+
"data-testid": "third-party-captcha"
|
|
60
58
|
});
|
|
61
|
-
|
|
62
|
-
var onReloadMock = jest.fn();
|
|
63
|
-
wrapper = (0, _enzyme.mount)(/*#__PURE__*/_react.default.createElement(_captcha_pane.default, {
|
|
64
|
-
lock: lockMock,
|
|
65
|
-
onReload: onReloadMock,
|
|
66
|
-
i18n: i8nMock
|
|
67
|
-
}));
|
|
68
|
-
});
|
|
69
|
-
it('should render ThirdPartyCaptcha if provider is recaptchav2', function () {
|
|
70
|
-
expect(wrapper.find(_third_party_captcha.ThirdPartyCaptcha)).toHaveLength(1);
|
|
71
|
-
});
|
|
72
|
-
it('should pass the sitekey', function () {
|
|
73
|
-
expect(wrapper.find(_third_party_captcha.ThirdPartyCaptcha).props().sitekey).toBe('mySiteKey');
|
|
74
|
-
});
|
|
59
|
+
}
|
|
75
60
|
});
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
});
|
|
83
|
-
var i8nMock = createI18nMock();
|
|
84
|
-
var onReloadMock = jest.fn();
|
|
85
|
-
wrapper = (0, _enzyme.mount)(/*#__PURE__*/_react.default.createElement(_captcha_pane.default, {
|
|
86
|
-
lock: lockMock,
|
|
87
|
-
onReload: onReloadMock,
|
|
88
|
-
i18n: i8nMock
|
|
89
|
-
}));
|
|
90
|
-
});
|
|
91
|
-
it('should render ThirdPartyCaptcha if provider is friendly captcha', function () {
|
|
92
|
-
expect(wrapper.find(_third_party_captcha.ThirdPartyCaptcha)).toHaveLength(1);
|
|
93
|
-
});
|
|
94
|
-
it('should pass the sitekey', function () {
|
|
95
|
-
expect(wrapper.find(_third_party_captcha.ThirdPartyCaptcha).props().sitekey).toBe('mySiteKey');
|
|
61
|
+
});
|
|
62
|
+
jest.mock('../../ui/input/captcha_input', function () {
|
|
63
|
+
return function (props) {
|
|
64
|
+
lastCaptchaInputProps = props;
|
|
65
|
+
return /*#__PURE__*/_react.default.createElement("input", {
|
|
66
|
+
"data-testid": "captcha-input"
|
|
96
67
|
});
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
describe('CaptchaPane', function () {
|
|
71
|
+
beforeEach(function () {
|
|
72
|
+
lastThirdPartyCaptchaProps = null;
|
|
73
|
+
lastCaptchaInputProps = null;
|
|
97
74
|
});
|
|
98
|
-
describe('
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
var lockMock = createLockMock({
|
|
102
|
-
provider: 'hcaptcha',
|
|
103
|
-
siteKey: 'mySiteKey'
|
|
104
|
-
});
|
|
75
|
+
describe('CaptchaInput', function () {
|
|
76
|
+
it('should render CaptchaInput if no provider is specified', function () {
|
|
77
|
+
var lockMock = createLockMock();
|
|
105
78
|
var i8nMock = createI18nMock();
|
|
106
79
|
var onReloadMock = jest.fn();
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
expect(wrapper.find(_third_party_captcha.ThirdPartyCaptcha)).toHaveLength(1);
|
|
115
|
-
});
|
|
116
|
-
it('should pass the sitekey', function () {
|
|
117
|
-
expect(wrapper.find(_third_party_captcha.ThirdPartyCaptcha).props().sitekey).toBe('mySiteKey');
|
|
80
|
+
var _render = (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_captcha_pane.default, {
|
|
81
|
+
lock: lockMock,
|
|
82
|
+
onReload: onReloadMock,
|
|
83
|
+
i18n: i8nMock
|
|
84
|
+
})),
|
|
85
|
+
getByTestId = _render.getByTestId;
|
|
86
|
+
expect(getByTestId('captcha-input')).toBeTruthy();
|
|
118
87
|
});
|
|
119
88
|
});
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
89
|
+
var captchaProviderCases = [['recaptchav2', 'recaptcha_v2'], ['friendly captcha', 'friendly_captcha'], ['hcaptcha', 'hcaptcha'], ['auth0_v2', 'auth0_v2'], ['recaptcha enterprise', 'recaptcha_enterprise'], ['Arkose', 'arkose']];
|
|
90
|
+
captchaProviderCases.forEach(function (_ref2) {
|
|
91
|
+
var _ref3 = _slicedToArray(_ref2, 2),
|
|
92
|
+
label = _ref3[0],
|
|
93
|
+
provider = _ref3[1];
|
|
94
|
+
describe(label, function () {
|
|
95
|
+
beforeEach(function () {
|
|
96
|
+
lastThirdPartyCaptchaProps = null;
|
|
97
|
+
var lockMock = createLockMock({
|
|
98
|
+
provider: provider,
|
|
99
|
+
siteKey: 'mySiteKey',
|
|
100
|
+
clientSubdomain: provider === 'arkose' ? 'client-api' : ''
|
|
101
|
+
});
|
|
102
|
+
var i8nMock = createI18nMock();
|
|
103
|
+
var onReloadMock = jest.fn();
|
|
104
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_captcha_pane.default, {
|
|
105
|
+
lock: lockMock,
|
|
106
|
+
onReload: onReloadMock,
|
|
107
|
+
i18n: i8nMock
|
|
108
|
+
}));
|
|
126
109
|
});
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
wrapper = (0, _enzyme.mount)(/*#__PURE__*/_react.default.createElement(_captcha_pane.default, {
|
|
130
|
-
lock: lockMock,
|
|
131
|
-
onReload: onReloadMock,
|
|
132
|
-
i18n: i8nMock
|
|
133
|
-
}));
|
|
134
|
-
});
|
|
135
|
-
it('should render ThirdPartyCaptcha if provider is auth0_v2', function () {
|
|
136
|
-
expect(wrapper.find(_third_party_captcha.ThirdPartyCaptcha)).toHaveLength(1);
|
|
137
|
-
});
|
|
138
|
-
it('should pass the sitekey', function () {
|
|
139
|
-
expect(wrapper.find(_third_party_captcha.ThirdPartyCaptcha).props().sitekey).toBe('mySiteKey');
|
|
140
|
-
});
|
|
141
|
-
});
|
|
142
|
-
describe('recaptcha enterprise', function () {
|
|
143
|
-
var wrapper;
|
|
144
|
-
beforeAll(function () {
|
|
145
|
-
var lockMock = createLockMock({
|
|
146
|
-
provider: 'recaptcha_enterprise',
|
|
147
|
-
siteKey: 'mySiteKey'
|
|
110
|
+
it("should render ThirdPartyCaptcha if provider is ".concat(label), function () {
|
|
111
|
+
expect(lastThirdPartyCaptchaProps).not.toBeNull();
|
|
148
112
|
});
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
wrapper = (0, _enzyme.mount)(/*#__PURE__*/_react.default.createElement(_captcha_pane.default, {
|
|
152
|
-
lock: lockMock,
|
|
153
|
-
onReload: onReloadMock,
|
|
154
|
-
i18n: i8nMock
|
|
155
|
-
}));
|
|
156
|
-
});
|
|
157
|
-
it('should render ThirdPartyCaptcha if provider is recaptcha_enterprise', function () {
|
|
158
|
-
expect(wrapper.find(_third_party_captcha.ThirdPartyCaptcha)).toHaveLength(1);
|
|
159
|
-
});
|
|
160
|
-
it('should pass the sitekey', function () {
|
|
161
|
-
expect(wrapper.find(_third_party_captcha.ThirdPartyCaptcha).props().sitekey).toBe('mySiteKey');
|
|
162
|
-
});
|
|
163
|
-
});
|
|
164
|
-
describe('Arkose', function () {
|
|
165
|
-
var wrapper;
|
|
166
|
-
beforeAll(function () {
|
|
167
|
-
var lockMock = createLockMock({
|
|
168
|
-
provider: 'arkose',
|
|
169
|
-
siteKey: 'mySiteKey',
|
|
170
|
-
clientSubdomain: 'client-api'
|
|
113
|
+
it('should pass the sitekey', function () {
|
|
114
|
+
expect(lastThirdPartyCaptchaProps.sitekey).toBe('mySiteKey');
|
|
171
115
|
});
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
i18n: i8nMock
|
|
178
|
-
}));
|
|
179
|
-
});
|
|
180
|
-
it('should render ThirdPartyCaptcha if provider is Arkose', function () {
|
|
181
|
-
expect(wrapper.find(_third_party_captcha.ThirdPartyCaptcha)).toHaveLength(1);
|
|
182
|
-
});
|
|
183
|
-
it('should pass the sitekey', function () {
|
|
184
|
-
expect(wrapper.find(_third_party_captcha.ThirdPartyCaptcha).props().sitekey).toBe('mySiteKey');
|
|
185
|
-
});
|
|
186
|
-
it('should pass the clientSubdomain', function () {
|
|
187
|
-
expect(wrapper.find(_third_party_captcha.ThirdPartyCaptcha).props().clientSubdomain).toBe('client-api');
|
|
116
|
+
if (provider === 'arkose') {
|
|
117
|
+
it('should pass the clientSubdomain', function () {
|
|
118
|
+
expect(lastThirdPartyCaptchaProps.clientSubdomain).toBe('client-api');
|
|
119
|
+
});
|
|
120
|
+
}
|
|
188
121
|
});
|
|
189
122
|
});
|
|
190
123
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _react = _interopRequireDefault(require("react"));
|
|
4
|
-
var
|
|
4
|
+
var _react2 = require("@testing-library/react");
|
|
5
5
|
var _testUtils = require("testUtils");
|
|
6
6
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
7
|
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
@@ -76,8 +76,9 @@ describe('CustomInput', function () {
|
|
|
76
76
|
});
|
|
77
77
|
it('calls `startOptionSelection` when clicked', function () {
|
|
78
78
|
var CustomInput = getComponent();
|
|
79
|
-
var
|
|
80
|
-
|
|
79
|
+
var _render = (0, _react2.render)(/*#__PURE__*/_react.default.createElement(CustomInput, defaultProps)),
|
|
80
|
+
container = _render.container;
|
|
81
|
+
var props = (0, _testUtils.extractPropsFromWrapper)(container, 'select_input');
|
|
81
82
|
props.onClick();
|
|
82
83
|
var mock = require('field/actions').startOptionSelection.mock;
|
|
83
84
|
expect(mock.calls.length).toBe(1);
|
|
@@ -101,8 +102,9 @@ describe('CustomInput', function () {
|
|
|
101
102
|
});
|
|
102
103
|
it('calls `changeField` when changed', function () {
|
|
103
104
|
var CustomInput = getComponent();
|
|
104
|
-
var
|
|
105
|
-
|
|
105
|
+
var _render2 = (0, _react2.render)(/*#__PURE__*/_react.default.createElement(CustomInput, defaultProps)),
|
|
106
|
+
container = _render2.container;
|
|
107
|
+
var props = (0, _testUtils.extractPropsFromWrapper)(container, 'text_input');
|
|
106
108
|
props.onChange({
|
|
107
109
|
target: {
|
|
108
110
|
value: 'newUser'
|