@prosopo/procaptcha-audio 0.0.0-stage → 0.2.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/.turbo/turbo-build$colon$cjs.log +52 -0
- package/.turbo/turbo-build$colon$tsc.log +53 -0
- package/.turbo/turbo-build.log +54 -0
- package/CHANGELOG.md +35 -0
- package/LICENSE +201 -0
- package/dist/_virtual/_rolldown/runtime.js +3 -0
- package/dist/cjs/components/audioPlayer.cjs +275 -0
- package/dist/cjs/components/procaptchaAudio.cjs +7 -0
- package/dist/cjs/components/procaptchaWidget.cjs +195 -0
- package/dist/cjs/index.cjs +8 -0
- package/dist/cjs/services/Manager.cjs +218 -0
- package/dist/components/audioPlayer.d.ts +18 -0
- package/dist/components/audioPlayer.d.ts.map +1 -0
- package/dist/components/audioPlayer.js +275 -0
- package/dist/components/audioPlayer.js.map +1 -0
- package/dist/components/procaptchaAudio.d.ts +7 -0
- package/dist/components/procaptchaAudio.d.ts.map +1 -0
- package/dist/components/procaptchaAudio.js +6 -0
- package/dist/components/procaptchaAudio.js.map +1 -0
- package/dist/components/procaptchaWidget.d.ts +7 -0
- package/dist/components/procaptchaWidget.d.ts.map +1 -0
- package/dist/components/procaptchaWidget.js +195 -0
- package/dist/components/procaptchaWidget.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/services/Manager.d.ts +10 -0
- package/dist/services/Manager.d.ts.map +1 -0
- package/dist/services/Manager.js +217 -0
- package/dist/services/Manager.js.map +1 -0
- package/dist/tests/audioPlayer.unit.test.d.ts +2 -0
- package/dist/tests/audioPlayer.unit.test.d.ts.map +1 -0
- package/dist/tests/audioPlayer.unit.test.js +341 -0
- package/dist/tests/audioPlayer.unit.test.js.map +1 -0
- package/dist/tests/domHarness.d.ts +20 -0
- package/dist/tests/domHarness.d.ts.map +1 -0
- package/dist/tests/domHarness.js +56 -0
- package/dist/tests/domHarness.js.map +1 -0
- package/dist/tests/manager.unit.test.d.ts +2 -0
- package/dist/tests/manager.unit.test.d.ts.map +1 -0
- package/dist/tests/manager.unit.test.js +627 -0
- package/dist/tests/manager.unit.test.js.map +1 -0
- package/dist/tests/managerHarness.d.ts +21 -0
- package/dist/tests/managerHarness.d.ts.map +1 -0
- package/dist/tests/managerHarness.js +67 -0
- package/dist/tests/managerHarness.js.map +1 -0
- package/dist/tests/procaptchaAudio.test-d.d.ts +2 -0
- package/dist/tests/procaptchaAudio.test-d.d.ts.map +1 -0
- package/dist/tests/procaptchaAudio.test-d.js +103 -0
- package/dist/tests/procaptchaAudio.test-d.js.map +1 -0
- package/dist/tests/procaptchaAudio.unit.test.d.ts +2 -0
- package/dist/tests/procaptchaAudio.unit.test.d.ts.map +1 -0
- package/dist/tests/procaptchaAudio.unit.test.js +93 -0
- package/dist/tests/procaptchaAudio.unit.test.js.map +1 -0
- package/dist/tests/procaptchaWidget.unit.test.d.ts +2 -0
- package/dist/tests/procaptchaWidget.unit.test.d.ts.map +1 -0
- package/dist/tests/procaptchaWidget.unit.test.js +597 -0
- package/dist/tests/procaptchaWidget.unit.test.js.map +1 -0
- package/dist/tests/setup.d.ts +2 -0
- package/dist/tests/setup.d.ts.map +1 -0
- package/dist/tests/setup.js +12 -0
- package/dist/tests/setup.js.map +1 -0
- package/package.json +70 -3
- package/vite.cjs.config.ts +22 -0
- package/vite.esm.config.ts +20 -0
- package/vite.test.config.ts +26 -0
- package/README.md +0 -3
|
@@ -0,0 +1,597 @@
|
|
|
1
|
+
import { ModeEnum, } from "@prosopo/types";
|
|
2
|
+
import { afterEach, beforeEach, describe, expect, test, vi, } from "vitest";
|
|
3
|
+
import { mountProcaptchaAudioWidget, } from "../components/procaptchaWidget.js";
|
|
4
|
+
import { fire, mount, settle } from "./domHarness.js";
|
|
5
|
+
import { audioEvents, challengeResponse, config, frictionless, } from "./managerHarness.js";
|
|
6
|
+
const mocks = vi.hoisted(() => {
|
|
7
|
+
const start = vi.fn();
|
|
8
|
+
const submitSolution = vi.fn();
|
|
9
|
+
const resetState = vi.fn();
|
|
10
|
+
const dispose = vi.fn();
|
|
11
|
+
const constructions = [];
|
|
12
|
+
const loadI18next = vi.fn();
|
|
13
|
+
const playerProps = {
|
|
14
|
+
current: undefined,
|
|
15
|
+
};
|
|
16
|
+
const translationsReady = { current: true };
|
|
17
|
+
const translatorI18n = { current: undefined };
|
|
18
|
+
return {
|
|
19
|
+
translationsReady,
|
|
20
|
+
translatorI18n,
|
|
21
|
+
start,
|
|
22
|
+
submitSolution,
|
|
23
|
+
resetState,
|
|
24
|
+
dispose,
|
|
25
|
+
constructions,
|
|
26
|
+
loadI18next,
|
|
27
|
+
playerProps,
|
|
28
|
+
};
|
|
29
|
+
});
|
|
30
|
+
vi.mock("../services/Manager.js", () => ({
|
|
31
|
+
Manager: (_config, _state, updateState, _callbacks, _frictionlessState, getHoneypotValue, onReloadRequest) => {
|
|
32
|
+
mocks.constructions.push({
|
|
33
|
+
updateState,
|
|
34
|
+
getHoneypotValue,
|
|
35
|
+
onReloadRequest,
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
start: mocks.start,
|
|
39
|
+
submitSolution: mocks.submitSolution,
|
|
40
|
+
resetState: mocks.resetState,
|
|
41
|
+
dispose: mocks.dispose,
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
}));
|
|
45
|
+
vi.mock("../components/audioPlayer.js", () => ({
|
|
46
|
+
mountAudioPlayer: (playerProps) => {
|
|
47
|
+
mocks.playerProps.current = playerProps;
|
|
48
|
+
const element = document.createElement("div");
|
|
49
|
+
element.setAttribute("data-cy", "player-stub");
|
|
50
|
+
document.body.appendChild(element);
|
|
51
|
+
return {
|
|
52
|
+
update: (next) => {
|
|
53
|
+
mocks.playerProps.current = next;
|
|
54
|
+
},
|
|
55
|
+
destroy: () => {
|
|
56
|
+
element.remove();
|
|
57
|
+
mocks.playerProps.current = undefined;
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
},
|
|
61
|
+
}));
|
|
62
|
+
vi.mock("@prosopo/locale", async (importOriginal) => {
|
|
63
|
+
const actual = await importOriginal();
|
|
64
|
+
return {
|
|
65
|
+
...actual,
|
|
66
|
+
loadI18next: mocks.loadI18next,
|
|
67
|
+
createTranslator: () => ({
|
|
68
|
+
t: (key) => key,
|
|
69
|
+
isReady: () => mocks.translationsReady.current,
|
|
70
|
+
subscribe: () => () => undefined,
|
|
71
|
+
i18n: mocks.translatorI18n.current,
|
|
72
|
+
}),
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
let mounted;
|
|
76
|
+
let widget;
|
|
77
|
+
const i18nStub = (language, changeLanguage) => ({ language, changeLanguage });
|
|
78
|
+
const germanI18n = () => {
|
|
79
|
+
const catalogue = {
|
|
80
|
+
"API.INVALID_SITE_KEY": "Ungültiger Site-Schlüssel",
|
|
81
|
+
};
|
|
82
|
+
return {
|
|
83
|
+
language: "de",
|
|
84
|
+
isInitialized: true,
|
|
85
|
+
t: (key, options) => catalogue[key] ?? options?.defaultValue ?? key,
|
|
86
|
+
changeLanguage: async () => undefined,
|
|
87
|
+
hasLoadedNamespace: () => true,
|
|
88
|
+
on: () => undefined,
|
|
89
|
+
off: () => undefined,
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
const props = (overrides = {}) => ({
|
|
93
|
+
config: config(),
|
|
94
|
+
callbacks: {},
|
|
95
|
+
i18n: undefined,
|
|
96
|
+
...overrides,
|
|
97
|
+
});
|
|
98
|
+
const render = (widgetProps) => {
|
|
99
|
+
widget = mountProcaptchaAudioWidget(mounted.container, widgetProps);
|
|
100
|
+
};
|
|
101
|
+
const destroy = () => {
|
|
102
|
+
widget?.destroy();
|
|
103
|
+
widget = undefined;
|
|
104
|
+
};
|
|
105
|
+
beforeEach(() => {
|
|
106
|
+
vi.clearAllMocks();
|
|
107
|
+
mocks.constructions.length = 0;
|
|
108
|
+
mocks.translationsReady.current = true;
|
|
109
|
+
mocks.translatorI18n.current = undefined;
|
|
110
|
+
mocks.playerProps.current = undefined;
|
|
111
|
+
mocks.start.mockResolvedValue(challengeResponse());
|
|
112
|
+
mocks.submitSolution.mockResolvedValue(true);
|
|
113
|
+
mocks.loadI18next.mockResolvedValue(undefined);
|
|
114
|
+
widget = undefined;
|
|
115
|
+
mounted = mount();
|
|
116
|
+
});
|
|
117
|
+
afterEach(() => {
|
|
118
|
+
destroy();
|
|
119
|
+
mounted.unmount();
|
|
120
|
+
vi.useRealTimers();
|
|
121
|
+
vi.restoreAllMocks();
|
|
122
|
+
});
|
|
123
|
+
const checkbox = () => {
|
|
124
|
+
const element = mounted.container.querySelector('input[type="checkbox"]');
|
|
125
|
+
if (!element)
|
|
126
|
+
throw new Error("expected a checkbox to be rendered");
|
|
127
|
+
return element;
|
|
128
|
+
};
|
|
129
|
+
const player = () => document.body.querySelector('[data-cy="player-stub"]');
|
|
130
|
+
const spinner = () => mounted.container.querySelector('[role="status"]');
|
|
131
|
+
const honeypotInput = () => {
|
|
132
|
+
const element = document.querySelector('input[name="email_confirm"]');
|
|
133
|
+
if (!element)
|
|
134
|
+
throw new Error("expected a honeypot to be rendered");
|
|
135
|
+
return element;
|
|
136
|
+
};
|
|
137
|
+
const click = async (options = {}) => {
|
|
138
|
+
fire(checkbox(), "click", options);
|
|
139
|
+
await settle();
|
|
140
|
+
};
|
|
141
|
+
const clickWithoutWaiting = () => {
|
|
142
|
+
fire(checkbox(), "click");
|
|
143
|
+
};
|
|
144
|
+
const deferred = () => {
|
|
145
|
+
let release;
|
|
146
|
+
const promise = new Promise((resolve) => {
|
|
147
|
+
release = resolve;
|
|
148
|
+
});
|
|
149
|
+
return { promise, release };
|
|
150
|
+
};
|
|
151
|
+
const complete = async (answer = "96475", replays = 1, events = audioEvents()) => {
|
|
152
|
+
mocks.playerProps.current?.onComplete(answer, replays, events);
|
|
153
|
+
await settle();
|
|
154
|
+
};
|
|
155
|
+
describe("what the widget renders", () => {
|
|
156
|
+
test("a visible widget shows a checkbox", () => {
|
|
157
|
+
render(props());
|
|
158
|
+
expect(checkbox()).toBeDefined();
|
|
159
|
+
});
|
|
160
|
+
test("an invisible widget shows no checkbox at all", () => {
|
|
161
|
+
render(props({ config: config({ mode: ModeEnum.invisible }) }));
|
|
162
|
+
expect(mounted.container.querySelector('input[type="checkbox"]')).toBeNull();
|
|
163
|
+
});
|
|
164
|
+
test("no player is shown until a challenge has been fetched", () => {
|
|
165
|
+
render(props());
|
|
166
|
+
expect(player()).toBeNull();
|
|
167
|
+
});
|
|
168
|
+
test("a session with a honeypot question renders the honeypot", () => {
|
|
169
|
+
render(props({ frictionlessState: frictionless({ hp: btoa("question") }) }));
|
|
170
|
+
expect(honeypotInput()).toBeDefined();
|
|
171
|
+
expect(document.body.textContent).toContain("question");
|
|
172
|
+
});
|
|
173
|
+
test("a session without one renders no bait at all", () => {
|
|
174
|
+
render(props({ frictionlessState: frictionless() }));
|
|
175
|
+
expect(document.querySelector('input[name="email_confirm"]')).toBeNull();
|
|
176
|
+
});
|
|
177
|
+
test("the manager can read the honeypot input the widget rendered", () => {
|
|
178
|
+
render(props({ frictionlessState: frictionless({ hp: btoa("question") }) }));
|
|
179
|
+
honeypotInput().value = "bot@example.com";
|
|
180
|
+
expect(mocks.constructions[0]?.getHoneypotValue?.()).toBe("bot@example.com");
|
|
181
|
+
});
|
|
182
|
+
test("a dark-themed widget still renders its checkbox", () => {
|
|
183
|
+
render(props({ config: config({ theme: "dark" }) }));
|
|
184
|
+
expect(checkbox()).toBeDefined();
|
|
185
|
+
});
|
|
186
|
+
test("the checkbox is labelled once the translations are ready", () => {
|
|
187
|
+
render(props());
|
|
188
|
+
expect(checkbox().getAttribute("aria-label")).toBe("WIDGET.I_AM_HUMAN");
|
|
189
|
+
});
|
|
190
|
+
test("the label is left empty while the translations load", () => {
|
|
191
|
+
mocks.translationsReady.current = false;
|
|
192
|
+
render(props());
|
|
193
|
+
expect(checkbox().getAttribute("aria-label")).toBe("");
|
|
194
|
+
});
|
|
195
|
+
test("the widget builds exactly one manager", async () => {
|
|
196
|
+
render(props());
|
|
197
|
+
await click();
|
|
198
|
+
expect(mocks.constructions).toHaveLength(1);
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
describe("language", () => {
|
|
202
|
+
test("nothing is loaded when no language is configured", () => {
|
|
203
|
+
render(props());
|
|
204
|
+
expect(mocks.loadI18next).not.toHaveBeenCalled();
|
|
205
|
+
});
|
|
206
|
+
test("a configured language boots i18next with it", () => {
|
|
207
|
+
render(props({ config: config({ language: "fr" }) }));
|
|
208
|
+
expect(mocks.loadI18next).toHaveBeenCalledWith(false, "fr");
|
|
209
|
+
});
|
|
210
|
+
test("an injected i18n on another language is switched over", () => {
|
|
211
|
+
const changeLanguage = vi.fn();
|
|
212
|
+
render(props({
|
|
213
|
+
config: config({ language: "fr" }),
|
|
214
|
+
i18n: i18nStub("en", changeLanguage),
|
|
215
|
+
}));
|
|
216
|
+
expect(changeLanguage).toHaveBeenCalledWith("fr");
|
|
217
|
+
expect(mocks.loadI18next).not.toHaveBeenCalled();
|
|
218
|
+
});
|
|
219
|
+
test("an injected i18n already on that language is left alone", () => {
|
|
220
|
+
const changeLanguage = vi.fn();
|
|
221
|
+
render(props({
|
|
222
|
+
config: config({ language: "fr" }),
|
|
223
|
+
i18n: i18nStub("fr", changeLanguage),
|
|
224
|
+
}));
|
|
225
|
+
expect(changeLanguage).not.toHaveBeenCalled();
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
describe("starting from the checkbox", () => {
|
|
229
|
+
test("a click starts the solve and opens the player", async () => {
|
|
230
|
+
render(props());
|
|
231
|
+
await click({ clientX: 12, clientY: 34 });
|
|
232
|
+
expect(mocks.start).toHaveBeenCalledWith(12, 34);
|
|
233
|
+
expect(player()).not.toBeNull();
|
|
234
|
+
expect(mocks.playerProps.current).toMatchObject({
|
|
235
|
+
clip: challengeResponse().clip,
|
|
236
|
+
characterCount: challengeResponse().characterCount,
|
|
237
|
+
submitting: false,
|
|
238
|
+
showRetry: false,
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
test("a synthetic click never reaches the manager", async () => {
|
|
242
|
+
render(props());
|
|
243
|
+
await click({ trusted: false, clientX: 12, clientY: 34 });
|
|
244
|
+
expect(mocks.start).not.toHaveBeenCalled();
|
|
245
|
+
});
|
|
246
|
+
test("a tap reports the coordinates of the first touch", async () => {
|
|
247
|
+
render(props());
|
|
248
|
+
await click({ touches: [{ clientX: 7, clientY: 9 }] });
|
|
249
|
+
expect(mocks.start).toHaveBeenCalledWith(7, 9);
|
|
250
|
+
});
|
|
251
|
+
test("a touch event with no touches falls back to the pointer", async () => {
|
|
252
|
+
render(props());
|
|
253
|
+
await click({ touches: [] });
|
|
254
|
+
expect(mocks.start).toHaveBeenCalledWith(0, 0);
|
|
255
|
+
});
|
|
256
|
+
test("a second click while the first is in flight is ignored", async () => {
|
|
257
|
+
const { promise, release } = deferred();
|
|
258
|
+
mocks.start.mockReturnValue(promise);
|
|
259
|
+
render(props());
|
|
260
|
+
clickWithoutWaiting();
|
|
261
|
+
clickWithoutWaiting();
|
|
262
|
+
expect(mocks.start).toHaveBeenCalledTimes(1);
|
|
263
|
+
release(challengeResponse());
|
|
264
|
+
await settle();
|
|
265
|
+
});
|
|
266
|
+
test("the checkbox shows a spinner while the solve is loading", async () => {
|
|
267
|
+
const { promise, release } = deferred();
|
|
268
|
+
mocks.start.mockReturnValue(promise);
|
|
269
|
+
render(props());
|
|
270
|
+
clickWithoutWaiting();
|
|
271
|
+
await settle();
|
|
272
|
+
expect(spinner()).not.toBeNull();
|
|
273
|
+
release(challengeResponse());
|
|
274
|
+
await settle();
|
|
275
|
+
expect(spinner()).toBeNull();
|
|
276
|
+
});
|
|
277
|
+
test("a start that yields no challenge leaves the checkbox in place", async () => {
|
|
278
|
+
mocks.start.mockResolvedValue(undefined);
|
|
279
|
+
render(props());
|
|
280
|
+
await click();
|
|
281
|
+
expect(player()).toBeNull();
|
|
282
|
+
expect(spinner()).toBeNull();
|
|
283
|
+
});
|
|
284
|
+
test("a start that throws returns the user to a usable checkbox", async () => {
|
|
285
|
+
const onError = vi.fn();
|
|
286
|
+
mocks.start.mockRejectedValue(new Error("provider down"));
|
|
287
|
+
render(props({ callbacks: { onError } }));
|
|
288
|
+
await click();
|
|
289
|
+
expect(spinner()).toBeNull();
|
|
290
|
+
expect(onError).toHaveBeenCalledWith(expect.any(Error));
|
|
291
|
+
});
|
|
292
|
+
test("a start that throws without an error callback is still recoverable", async () => {
|
|
293
|
+
mocks.start.mockRejectedValue(new Error("provider down"));
|
|
294
|
+
render(props());
|
|
295
|
+
await click();
|
|
296
|
+
expect(spinner()).toBeNull();
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
describe("autoStart", () => {
|
|
300
|
+
test("fetches a challenge and opens the player without a click", async () => {
|
|
301
|
+
render(props({ autoStart: true, startCoords: { x: 5, y: 6 } }));
|
|
302
|
+
await settle();
|
|
303
|
+
expect(mocks.start).toHaveBeenCalledWith(5, 6);
|
|
304
|
+
expect(player()).not.toBeNull();
|
|
305
|
+
});
|
|
306
|
+
test("starts at the origin when no coordinates were handed over", async () => {
|
|
307
|
+
render(props({ autoStart: true }));
|
|
308
|
+
await settle();
|
|
309
|
+
expect(mocks.start).toHaveBeenCalledWith(0, 0);
|
|
310
|
+
});
|
|
311
|
+
test("a failed autoStart leaves the checkbox usable", async () => {
|
|
312
|
+
mocks.start.mockRejectedValue(new Error("nope"));
|
|
313
|
+
render(props({ autoStart: true }));
|
|
314
|
+
await settle();
|
|
315
|
+
expect(player()).toBeNull();
|
|
316
|
+
expect(spinner()).toBeNull();
|
|
317
|
+
});
|
|
318
|
+
test("no autoStart means no solve until the user acts", () => {
|
|
319
|
+
render(props());
|
|
320
|
+
expect(mocks.start).not.toHaveBeenCalled();
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
describe("answering the challenge", () => {
|
|
324
|
+
const openPlayer = async (widgetProps = props()) => {
|
|
325
|
+
render(widgetProps);
|
|
326
|
+
await click();
|
|
327
|
+
};
|
|
328
|
+
test("submits the answer, replay count and trail the player gathered", async () => {
|
|
329
|
+
await openPlayer();
|
|
330
|
+
const events = audioEvents();
|
|
331
|
+
await complete("83744", 2, events);
|
|
332
|
+
expect(mocks.submitSolution).toHaveBeenCalledWith("83744", 2, events);
|
|
333
|
+
});
|
|
334
|
+
test("a verified answer closes the player", async () => {
|
|
335
|
+
await openPlayer();
|
|
336
|
+
await complete();
|
|
337
|
+
expect(player()).toBeNull();
|
|
338
|
+
expect(spinner()).toBeNull();
|
|
339
|
+
});
|
|
340
|
+
test("a wrong answer gets a fresh clip rather than the one just spent", async () => {
|
|
341
|
+
mocks.submitSolution.mockResolvedValue(false);
|
|
342
|
+
const retryChallenge = challengeResponse({
|
|
343
|
+
clip: "data:audio/wav;base64,cmV0cnk=",
|
|
344
|
+
characterCount: 6,
|
|
345
|
+
});
|
|
346
|
+
mocks.start
|
|
347
|
+
.mockResolvedValueOnce(challengeResponse())
|
|
348
|
+
.mockResolvedValue(retryChallenge);
|
|
349
|
+
await openPlayer();
|
|
350
|
+
await complete();
|
|
351
|
+
expect(player()).not.toBeNull();
|
|
352
|
+
expect(mocks.playerProps.current).toMatchObject({
|
|
353
|
+
showRetry: true,
|
|
354
|
+
clip: "data:audio/wav;base64,cmV0cnk=",
|
|
355
|
+
characterCount: 6,
|
|
356
|
+
submitting: false,
|
|
357
|
+
});
|
|
358
|
+
});
|
|
359
|
+
test("delegates the retry to the wrapper when it offered one", async () => {
|
|
360
|
+
const onReload = vi.fn();
|
|
361
|
+
mocks.submitSolution.mockResolvedValue(false);
|
|
362
|
+
await openPlayer(props({ onReload }));
|
|
363
|
+
await complete();
|
|
364
|
+
expect(mocks.start).toHaveBeenCalledTimes(1);
|
|
365
|
+
expect(mocks.constructions[0]?.onReloadRequest).toBeTypeOf("function");
|
|
366
|
+
});
|
|
367
|
+
test("keeps the spent clip frozen while the wrapper re-mints", async () => {
|
|
368
|
+
const onReload = vi.fn();
|
|
369
|
+
mocks.submitSolution.mockResolvedValue(false);
|
|
370
|
+
await openPlayer(props({ onReload }));
|
|
371
|
+
await complete();
|
|
372
|
+
expect(mocks.playerProps.current).toMatchObject({
|
|
373
|
+
showRetry: true,
|
|
374
|
+
submitting: true,
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
test("does not offer the manager a retry hook the wrapper never supplied", async () => {
|
|
378
|
+
await openPlayer();
|
|
379
|
+
expect(mocks.constructions[0]?.onReloadRequest).toBeUndefined();
|
|
380
|
+
});
|
|
381
|
+
test("the wrapper's retry handler is reached through the manager, asking to keep the retry prompt", async () => {
|
|
382
|
+
const onReload = vi.fn();
|
|
383
|
+
await openPlayer(props({ onReload }));
|
|
384
|
+
mocks.constructions[0]?.onReloadRequest?.(3, 4);
|
|
385
|
+
expect(onReload).toHaveBeenCalledWith(3, 4, { showRetry: true });
|
|
386
|
+
});
|
|
387
|
+
test("a re-minted widget keeps the retry prompt on the replacement clip", async () => {
|
|
388
|
+
render(props({ autoStart: true, startShowRetry: true }));
|
|
389
|
+
await settle();
|
|
390
|
+
expect(mocks.playerProps.current).toMatchObject({ showRetry: true });
|
|
391
|
+
});
|
|
392
|
+
test("a wrong answer with no replacement challenge closes the player", async () => {
|
|
393
|
+
mocks.submitSolution.mockResolvedValue(false);
|
|
394
|
+
mocks.start
|
|
395
|
+
.mockResolvedValueOnce(challengeResponse())
|
|
396
|
+
.mockResolvedValue(undefined);
|
|
397
|
+
await openPlayer();
|
|
398
|
+
await complete();
|
|
399
|
+
expect(player()).toBeNull();
|
|
400
|
+
});
|
|
401
|
+
test("a wrong answer whose retry throws closes the player", async () => {
|
|
402
|
+
mocks.submitSolution.mockResolvedValue(false);
|
|
403
|
+
mocks.start
|
|
404
|
+
.mockResolvedValueOnce(challengeResponse())
|
|
405
|
+
.mockRejectedValue(new Error("provider down"));
|
|
406
|
+
await openPlayer();
|
|
407
|
+
await complete();
|
|
408
|
+
expect(player()).toBeNull();
|
|
409
|
+
});
|
|
410
|
+
test("a submit that throws is reported and treated as a failure", async () => {
|
|
411
|
+
const onError = vi.fn();
|
|
412
|
+
mocks.submitSolution.mockRejectedValue(new Error("boom"));
|
|
413
|
+
await openPlayer(props({ callbacks: { onError } }));
|
|
414
|
+
await complete();
|
|
415
|
+
expect(onError).toHaveBeenCalledWith(expect.any(Error));
|
|
416
|
+
expect(mocks.start).toHaveBeenCalledTimes(2);
|
|
417
|
+
});
|
|
418
|
+
test("a submit that throws a non-error still reaches the callback", async () => {
|
|
419
|
+
const onError = vi.fn();
|
|
420
|
+
mocks.submitSolution.mockRejectedValue("just a string");
|
|
421
|
+
await openPlayer(props({ callbacks: { onError } }));
|
|
422
|
+
await complete();
|
|
423
|
+
expect(onError).toHaveBeenCalledWith(expect.any(Error));
|
|
424
|
+
});
|
|
425
|
+
test("the player is frozen while the answer is in flight", async () => {
|
|
426
|
+
const { promise, release } = deferred();
|
|
427
|
+
mocks.submitSolution.mockReturnValue(promise);
|
|
428
|
+
await openPlayer();
|
|
429
|
+
void mocks.playerProps.current?.onComplete("96475", 0, []);
|
|
430
|
+
await settle();
|
|
431
|
+
expect(mocks.playerProps.current?.submitting).toBe(true);
|
|
432
|
+
expect(spinner()).not.toBeNull();
|
|
433
|
+
release(true);
|
|
434
|
+
await settle();
|
|
435
|
+
});
|
|
436
|
+
test("dismissing the player returns to the checkbox without answering", async () => {
|
|
437
|
+
await openPlayer();
|
|
438
|
+
mocks.playerProps.current?.onDismiss?.();
|
|
439
|
+
await settle();
|
|
440
|
+
expect(player()).toBeNull();
|
|
441
|
+
expect(mocks.submitSolution).not.toHaveBeenCalled();
|
|
442
|
+
});
|
|
443
|
+
});
|
|
444
|
+
describe("invisible mode", () => {
|
|
445
|
+
const execute = async () => {
|
|
446
|
+
document.dispatchEvent(new Event("procaptcha:execute"));
|
|
447
|
+
await settle();
|
|
448
|
+
};
|
|
449
|
+
test("an execute event fetches a challenge and opens the player", async () => {
|
|
450
|
+
render(props({ config: config({ mode: ModeEnum.invisible }) }));
|
|
451
|
+
await execute();
|
|
452
|
+
expect(mocks.start).toHaveBeenCalledTimes(1);
|
|
453
|
+
expect(player()).not.toBeNull();
|
|
454
|
+
});
|
|
455
|
+
test("a visible widget ignores the execute event entirely", async () => {
|
|
456
|
+
render(props());
|
|
457
|
+
await execute();
|
|
458
|
+
expect(mocks.start).not.toHaveBeenCalled();
|
|
459
|
+
});
|
|
460
|
+
test("a targeted execute on the container runs a visible widget", async () => {
|
|
461
|
+
const target = document.createElement("div");
|
|
462
|
+
render(props({ container: target }));
|
|
463
|
+
target.dispatchEvent(new Event("procaptcha:execute"));
|
|
464
|
+
await settle();
|
|
465
|
+
expect(mocks.start).toHaveBeenCalledTimes(1);
|
|
466
|
+
expect(player()).not.toBeNull();
|
|
467
|
+
});
|
|
468
|
+
test("a targeted execute on the container runs an invisible widget", async () => {
|
|
469
|
+
const target = document.createElement("div");
|
|
470
|
+
render(props({
|
|
471
|
+
config: config({ mode: ModeEnum.invisible }),
|
|
472
|
+
container: target,
|
|
473
|
+
}));
|
|
474
|
+
target.dispatchEvent(new Event("procaptcha:execute"));
|
|
475
|
+
await settle();
|
|
476
|
+
expect(mocks.start).toHaveBeenCalledTimes(1);
|
|
477
|
+
});
|
|
478
|
+
test("an execute that yields no challenge shows no player", async () => {
|
|
479
|
+
mocks.start.mockResolvedValue(undefined);
|
|
480
|
+
render(props({ config: config({ mode: ModeEnum.invisible }) }));
|
|
481
|
+
await execute();
|
|
482
|
+
expect(player()).toBeNull();
|
|
483
|
+
});
|
|
484
|
+
test("an execute that throws is reported to the host page", async () => {
|
|
485
|
+
const onError = vi.fn();
|
|
486
|
+
mocks.start.mockRejectedValue(new Error("provider down"));
|
|
487
|
+
render(props({
|
|
488
|
+
config: config({ mode: ModeEnum.invisible }),
|
|
489
|
+
callbacks: { onError },
|
|
490
|
+
}));
|
|
491
|
+
await execute();
|
|
492
|
+
expect(onError).toHaveBeenCalledWith(expect.any(Error));
|
|
493
|
+
});
|
|
494
|
+
test("an execute that throws a non-error is still reported", async () => {
|
|
495
|
+
const onError = vi.fn();
|
|
496
|
+
mocks.start.mockRejectedValue("just a string");
|
|
497
|
+
render(props({
|
|
498
|
+
config: config({ mode: ModeEnum.invisible }),
|
|
499
|
+
callbacks: { onError },
|
|
500
|
+
}));
|
|
501
|
+
await execute();
|
|
502
|
+
expect(onError).toHaveBeenCalledWith(expect.any(Error));
|
|
503
|
+
});
|
|
504
|
+
test("the listener is dropped when the widget is destroyed", async () => {
|
|
505
|
+
render(props({ config: config({ mode: ModeEnum.invisible }) }));
|
|
506
|
+
destroy();
|
|
507
|
+
await execute();
|
|
508
|
+
expect(mocks.start).not.toHaveBeenCalled();
|
|
509
|
+
});
|
|
510
|
+
});
|
|
511
|
+
describe("an invalidated session", () => {
|
|
512
|
+
const invalidate = async (key = "CAPTCHA.NO_SESSION_FOUND", message = "session gone") => {
|
|
513
|
+
mocks.constructions[0]?.updateState({ error: { message, key } });
|
|
514
|
+
await settle();
|
|
515
|
+
};
|
|
516
|
+
test("the error is shown on the checkbox and the player is torn down", async () => {
|
|
517
|
+
render(props());
|
|
518
|
+
await click();
|
|
519
|
+
await invalidate("API.UNKNOWN_ERROR", "something broke");
|
|
520
|
+
expect(mounted.container.textContent).toContain("something broke");
|
|
521
|
+
expect(player()).toBeNull();
|
|
522
|
+
expect(spinner()).toBeNull();
|
|
523
|
+
});
|
|
524
|
+
test("the host is told to re-mint, with the coordinates of the original click", async () => {
|
|
525
|
+
const onSessionInvalidated = vi.fn();
|
|
526
|
+
render(props({ onSessionInvalidated }));
|
|
527
|
+
await click({ clientX: 12, clientY: 34 });
|
|
528
|
+
await invalidate();
|
|
529
|
+
expect(onSessionInvalidated).toHaveBeenCalledWith(12, 34);
|
|
530
|
+
});
|
|
531
|
+
test("the host is told only once, however many errors arrive", async () => {
|
|
532
|
+
const onSessionInvalidated = vi.fn();
|
|
533
|
+
render(props({ onSessionInvalidated }));
|
|
534
|
+
await click();
|
|
535
|
+
await invalidate("CAPTCHA.NO_SESSION_FOUND", "gone");
|
|
536
|
+
await invalidate("CAPTCHA.NO_SESSION_FOUND", "gone again");
|
|
537
|
+
expect(onSessionInvalidated).toHaveBeenCalledTimes(1);
|
|
538
|
+
});
|
|
539
|
+
test("with no host handler the frictionless session restarts instead", async () => {
|
|
540
|
+
const restart = vi.fn();
|
|
541
|
+
render(props({ frictionlessState: frictionless({ restart }) }));
|
|
542
|
+
await invalidate();
|
|
543
|
+
expect(restart).not.toHaveBeenCalled();
|
|
544
|
+
await new Promise((resolve) => setTimeout(resolve, 150));
|
|
545
|
+
expect(restart).toHaveBeenCalledTimes(1);
|
|
546
|
+
});
|
|
547
|
+
test("a restart pending at destroy is cancelled", async () => {
|
|
548
|
+
const restart = vi.fn();
|
|
549
|
+
render(props({ frictionlessState: frictionless({ restart }) }));
|
|
550
|
+
await invalidate();
|
|
551
|
+
destroy();
|
|
552
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
553
|
+
expect(restart).not.toHaveBeenCalled();
|
|
554
|
+
});
|
|
555
|
+
test("a lost session that will be re-minted shows no error", async () => {
|
|
556
|
+
render(props({ frictionlessState: frictionless({ restart: () => { } }) }));
|
|
557
|
+
await click();
|
|
558
|
+
await invalidate();
|
|
559
|
+
expect(mounted.container.textContent).not.toContain("session gone");
|
|
560
|
+
expect(spinner()).not.toBeNull();
|
|
561
|
+
});
|
|
562
|
+
test("a lost session handed to the wrapper shows no error either", async () => {
|
|
563
|
+
const onSessionInvalidated = vi.fn();
|
|
564
|
+
render(props({ onSessionInvalidated }));
|
|
565
|
+
await click();
|
|
566
|
+
await invalidate();
|
|
567
|
+
expect(onSessionInvalidated).toHaveBeenCalledTimes(1);
|
|
568
|
+
expect(mounted.container.textContent).not.toContain("session gone");
|
|
569
|
+
});
|
|
570
|
+
test("the error is shown in the widget's language, not the provider's", async () => {
|
|
571
|
+
mocks.translatorI18n.current = germanI18n();
|
|
572
|
+
render(props());
|
|
573
|
+
await invalidate("API.INVALID_SITE_KEY", "Invalid site key");
|
|
574
|
+
expect(mounted.container.textContent).toContain("Ungültiger Site-Schlüssel");
|
|
575
|
+
expect(mounted.container.textContent).not.toContain("Invalid site key");
|
|
576
|
+
});
|
|
577
|
+
test("a lost session with nothing to recover it is simply surfaced", async () => {
|
|
578
|
+
render(props());
|
|
579
|
+
await invalidate();
|
|
580
|
+
expect(mounted.container.textContent).toContain("session gone");
|
|
581
|
+
});
|
|
582
|
+
test("no coordinates are reported when the session was never clicked into", async () => {
|
|
583
|
+
const onSessionInvalidated = vi.fn();
|
|
584
|
+
render(props({ onSessionInvalidated }));
|
|
585
|
+
await invalidate();
|
|
586
|
+
expect(onSessionInvalidated).toHaveBeenCalledWith(undefined, undefined);
|
|
587
|
+
});
|
|
588
|
+
});
|
|
589
|
+
describe("destroy", () => {
|
|
590
|
+
test("disposes the manager so its expiry timers cannot outlive the widget", () => {
|
|
591
|
+
render(props());
|
|
592
|
+
expect(mocks.dispose).not.toHaveBeenCalled();
|
|
593
|
+
destroy();
|
|
594
|
+
expect(mocks.dispose).toHaveBeenCalledTimes(1);
|
|
595
|
+
});
|
|
596
|
+
});
|
|
597
|
+
//# sourceMappingURL=procaptchaWidget.unit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"procaptchaWidget.unit.test.js","sourceRoot":"","sources":["../../src/tests/procaptchaWidget.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/tests/setup.ts"],"names":[],"mappings":"AA4BA,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Object.defineProperty(HTMLMediaElement.prototype, "play", {
|
|
2
|
+
configurable: true,
|
|
3
|
+
writable: true,
|
|
4
|
+
value: () => Promise.resolve(),
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(HTMLMediaElement.prototype, "pause", {
|
|
7
|
+
configurable: true,
|
|
8
|
+
writable: true,
|
|
9
|
+
value: () => undefined,
|
|
10
|
+
});
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/tests/setup.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE;IACzD,YAAY,EAAE,IAAI;IAClB,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,GAAkB,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;CAC7C,CAAC,CAAC;AAEH,MAAM,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE;IAC1D,YAAY,EAAE,IAAI;IAClB,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,GAAS,EAAE,CAAC,SAAS;CAC5B,CAAC,CAAC"}
|