auth0-lock 15.0.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.
Files changed (46) hide show
  1. package/.github/workflows/codeql.yml +1 -1
  2. package/.github/workflows/npm-release.yml +1 -1
  3. package/.github/workflows/snyk.yml +1 -1
  4. package/.github/workflows/test.yml +2 -2
  5. package/.version +1 -1
  6. package/CHANGELOG.md +6 -0
  7. package/README.md +1 -1
  8. package/lib/__tests__/auth_button.js +21 -6
  9. package/lib/__tests__/connection/database/login_pane.js +12 -5
  10. package/lib/__tests__/connection/database/reset_password.js +15 -12
  11. package/lib/__tests__/connection/enterprise/hrd_pane.js +16 -6
  12. package/lib/__tests__/connection/enterprise/hrd_screen.js +27 -18
  13. package/lib/__tests__/connection/passwordless/ask_vcode.js +15 -7
  14. package/lib/__tests__/core/sso/last_login_screen.js +91 -40
  15. package/lib/__tests__/engine/classic/mfa_login_screen.js +9 -3
  16. package/lib/__tests__/engine/classic/sign_up_pane.js +16 -6
  17. package/lib/__tests__/engine/classic/sign_up_screen.js +0 -1
  18. package/lib/__tests__/field/captcha/arkose.js +7 -0
  19. package/lib/__tests__/field/captcha/auth0_v2.js +6 -0
  20. package/lib/__tests__/field/captcha/friendlyCaptcha.js +6 -0
  21. package/lib/__tests__/field/captcha/hcaptcha.js +6 -0
  22. package/lib/__tests__/field/captcha/recaptcha_enterprise.js +6 -0
  23. package/lib/__tests__/field/captcha/recaptchav2.js +6 -0
  24. package/lib/__tests__/field/captcha/third_party_captcha.js +97 -64
  25. package/lib/__tests__/field/captcha.js +76 -143
  26. package/lib/__tests__/field/custom_input.js +7 -5
  27. package/lib/__tests__/field/email_pane.js +27 -11
  28. package/lib/__tests__/field/login_pane.js +6 -3
  29. package/lib/__tests__/field/mfa_code_pane.js +13 -6
  30. package/lib/__tests__/field/option_selection_pane.js +17 -7
  31. package/lib/__tests__/field/password_pane.js +8 -10
  32. package/lib/__tests__/field/phone_number_pane.js +7 -5
  33. package/lib/__tests__/field/social_buttons_pane.js +12 -9
  34. package/lib/__tests__/field/username_pane.js +33 -14
  35. package/lib/__tests__/field/vcode_pane.js +9 -5
  36. package/lib/__tests__/setup-tests.js +1 -7
  37. package/lib/__tests__/testUtils.js +27 -42
  38. package/lib/__tests__/ui/box/global_message.js +75 -42
  39. package/lib/__tests__/ui/input/email_input.js +4 -4
  40. package/lib/__tests__/ui/input/password/password_strength.js +8 -7
  41. package/lib/__tests__/ui/input/password_input.js +18 -14
  42. package/lib/core/web_api/helper.js +1 -1
  43. package/lib/i18n.js +1 -1
  44. package/lib/lock.js +1 -1
  45. package/lib/passwordless.js +1 -1
  46. package/package.json +7 -7
@@ -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 _enzyme = require("enzyme");
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
- wrapper = (0, _enzyme.mount)(/*#__PURE__*/_react.default.createElement(_third_party_captcha.ThirdPartyCaptcha, {
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
- wrapper = (0, _enzyme.mount)(/*#__PURE__*/_react.default.createElement(_third_party_captcha.ThirdPartyCaptcha, {
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 wrapper;
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
- wrapper = (0, _enzyme.mount)(/*#__PURE__*/_react.default.createElement(_third_party_captcha.ThirdPartyCaptcha, {
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
- expect(renderCalls.length).toEqual(1);
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
- (0, _testUtils.act)(function () {
172
- wrapper.setState();
173
- var renderCalls = global.window.hcaptcha.render.mock.calls;
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 wrapper;
180
- beforeAll(function () {
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
- wrapper = (0, _enzyme.mount)(/*#__PURE__*/_react.default.createElement(_third_party_captcha.ThirdPartyCaptcha, {
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: jest.fn()
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 renderParams = global.window.turnstile.render.mock.calls[0][1];
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 renderParams = global.window.turnstile.render.mock.calls[i][1];
218
- (0, _testUtils.act)(function () {
219
- renderParams['error-callback']();
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
- var retryCount = wrapper.state.retryCount;
222
- var value = wrapper.props.value;
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
- (0, _testUtils.act)(function () {
230
- return renderParams['error-callback']();
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
- wrapper = (0, _enzyme.mount)(/*#__PURE__*/_react.default.createElement(_third_party_captcha.ThirdPartyCaptcha, {
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 _enzyme = require("enzyme");
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
- describe('CaptchaPane', function () {
38
- describe('CaptchaInput', function () {
39
- var wrapper;
40
- beforeAll(function () {
41
- var lockMock = createLockMock();
42
- var i8nMock = createI18nMock();
43
- var onReloadMock = jest.fn();
44
- wrapper = (0, _enzyme.mount)(/*#__PURE__*/_react.default.createElement(_captcha_pane.default, {
45
- lock: lockMock,
46
- onReload: onReloadMock,
47
- i18n: i8nMock
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
- var i8nMock = createI18nMock();
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
- describe('friendly captcha', function () {
77
- var wrapper;
78
- beforeAll(function () {
79
- var lockMock = createLockMock({
80
- provider: 'friendly_captcha',
81
- siteKey: 'mySiteKey'
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('hcaptcha', function () {
99
- var wrapper;
100
- beforeAll(function () {
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
- wrapper = (0, _enzyme.mount)(/*#__PURE__*/_react.default.createElement(_captcha_pane.default, {
108
- lock: lockMock,
109
- onReload: onReloadMock,
110
- i18n: i8nMock
111
- }));
112
- });
113
- it('should render ThirdPartyCaptcha if provider is hCaptcha', function () {
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
- describe('auth0_v2', function () {
121
- var wrapper;
122
- beforeAll(function () {
123
- var lockMock = createLockMock({
124
- provider: 'auth0_v2',
125
- siteKey: 'mySiteKey'
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
- var i8nMock = createI18nMock();
128
- var onReloadMock = jest.fn();
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
- var i8nMock = createI18nMock();
150
- var onReloadMock = jest.fn();
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
- var i8nMock = createI18nMock();
173
- var onReloadMock = jest.fn();
174
- wrapper = (0, _enzyme.mount)(/*#__PURE__*/_react.default.createElement(_captcha_pane.default, {
175
- lock: lockMock,
176
- onReload: onReloadMock,
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 _enzyme = require("enzyme");
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 wrapper = (0, _enzyme.mount)(/*#__PURE__*/_react.default.createElement(CustomInput, defaultProps));
80
- var props = (0, _testUtils.extractPropsFromWrapper)(wrapper);
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 wrapper = (0, _enzyme.mount)(/*#__PURE__*/_react.default.createElement(CustomInput, defaultProps));
105
- var props = (0, _testUtils.extractPropsFromWrapper)(wrapper);
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'