mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-10-01 05:40:50 -07:00
138 lines
3.9 KiB
TypeScript
138 lines
3.9 KiB
TypeScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
import { openOverlayHostedModal, retryOverlayModalOpen } from './overlay-hosted-modal-open';
|
|
|
|
test('retryOverlayModalOpen skips the first send when already aborted', async () => {
|
|
const controller = new AbortController();
|
|
controller.abort();
|
|
const unexpectedCall = () => assert.fail('aborted open must not send or wait');
|
|
assert.equal(
|
|
await retryOverlayModalOpen(
|
|
{ waitForModalOpen: unexpectedCall, logWarn: unexpectedCall },
|
|
{
|
|
modal: 'media-timing-review',
|
|
timeoutMs: 4_000,
|
|
retryWarning: 'retry',
|
|
sendOpen: unexpectedCall,
|
|
signal: controller.signal,
|
|
},
|
|
),
|
|
false,
|
|
);
|
|
});
|
|
|
|
for (const abortOnWait of [1, 2]) {
|
|
test(`retryOverlayModalOpen rejects an acknowledgement aborted during wait ${abortOnWait}`, async () => {
|
|
const controller = new AbortController();
|
|
let waitCalls = 0;
|
|
let sendCalls = 0;
|
|
const opened = await retryOverlayModalOpen(
|
|
{
|
|
waitForModalOpen: async () => {
|
|
waitCalls += 1;
|
|
if (waitCalls === abortOnWait) {
|
|
controller.abort();
|
|
return true;
|
|
}
|
|
return false;
|
|
},
|
|
logWarn: () => {},
|
|
},
|
|
{
|
|
modal: 'media-timing-review',
|
|
timeoutMs: 4_000,
|
|
retryWarning: 'retry',
|
|
sendOpen: () => {
|
|
sendCalls += 1;
|
|
return true;
|
|
},
|
|
signal: controller.signal,
|
|
},
|
|
);
|
|
assert.equal(opened, false);
|
|
assert.equal(sendCalls, abortOnWait);
|
|
assert.equal(waitCalls, abortOnWait);
|
|
});
|
|
}
|
|
|
|
test('retryOverlayModalOpen still retries other modals without a signal', async () => {
|
|
let sendCalls = 0;
|
|
const opened = await retryOverlayModalOpen(
|
|
{ waitForModalOpen: async () => sendCalls === 2, logWarn: () => {} },
|
|
{
|
|
modal: 'runtime-options',
|
|
timeoutMs: 1_500,
|
|
retryWarning: 'retry',
|
|
sendOpen: () => {
|
|
sendCalls += 1;
|
|
return true;
|
|
},
|
|
},
|
|
);
|
|
assert.equal(opened, true);
|
|
assert.equal(sendCalls, 2);
|
|
});
|
|
|
|
test('openOverlayHostedModal ensures overlay readiness before sending the open event', () => {
|
|
const calls: string[] = [];
|
|
|
|
const opened = openOverlayHostedModal(
|
|
{
|
|
ensureOverlayStartupPrereqs: () => {
|
|
calls.push('ensureOverlayStartupPrereqs');
|
|
},
|
|
ensureOverlayWindowsReadyForVisibilityActions: () => {
|
|
calls.push('ensureOverlayWindowsReadyForVisibilityActions');
|
|
},
|
|
sendToActiveOverlayWindow: (channel, payload, runtimeOptions) => {
|
|
calls.push(`send:${channel}`);
|
|
assert.equal(payload, undefined);
|
|
assert.deepEqual(runtimeOptions, {
|
|
restoreOnModalClose: 'runtime-options',
|
|
preferModalWindow: undefined,
|
|
});
|
|
return true;
|
|
},
|
|
},
|
|
{
|
|
channel: 'runtime-options:open',
|
|
modal: 'runtime-options',
|
|
},
|
|
);
|
|
|
|
assert.equal(opened, true);
|
|
assert.deepEqual(calls, [
|
|
'ensureOverlayStartupPrereqs',
|
|
'ensureOverlayWindowsReadyForVisibilityActions',
|
|
'send:runtime-options:open',
|
|
]);
|
|
});
|
|
|
|
test('openOverlayHostedModal forwards payload and modal-window preference', () => {
|
|
const payload = { sessionId: 'yt-1' };
|
|
|
|
const opened = openOverlayHostedModal(
|
|
{
|
|
ensureOverlayStartupPrereqs: () => {},
|
|
ensureOverlayWindowsReadyForVisibilityActions: () => {},
|
|
sendToActiveOverlayWindow: (channel, forwardedPayload, runtimeOptions) => {
|
|
assert.equal(channel, 'youtube:picker-open');
|
|
assert.deepEqual(forwardedPayload, payload);
|
|
assert.deepEqual(runtimeOptions, {
|
|
restoreOnModalClose: 'youtube-track-picker',
|
|
preferModalWindow: true,
|
|
});
|
|
return false;
|
|
},
|
|
},
|
|
{
|
|
channel: 'youtube:picker-open',
|
|
modal: 'youtube-track-picker',
|
|
payload,
|
|
preferModalWindow: true,
|
|
},
|
|
);
|
|
|
|
assert.equal(opened, false);
|
|
});
|