Files
fluxer/fluxer_desktop/src/main/ModuleOnDemand.test.mjs
T

140 lines
4.5 KiB
JavaScript

// SPDX-License-Identifier: AGPL-3.0-or-later
import assert from 'node:assert/strict';
import {describe, test} from 'node:test';
import './LocalAppTestSupport.test.mjs';
const {setOnDemandModuleInstaller} = await import('@electron/main/ModuleBootHandoff');
const {createOnDemandModuleInstaller, ensureDesktopModule, UnknownDesktopModuleRequestError} = await import(
'@electron/main/ModuleOnDemand'
);
function deferred() {
let resolve;
let reject;
const promise = new Promise((resolvePromise, rejectPromise) => {
resolve = resolvePromise;
reject = rejectPromise;
});
return {promise, resolve, reject};
}
describe('createOnDemandModuleInstaller', () => {
test('coalesces concurrent requests for the same module into one install', async () => {
const gate = deferred();
const requested = [];
const refreshed = [];
const install = createOnDemandModuleInstaller({
ensure: async (moduleName) => {
requested.push(moduleName);
await gate.promise;
return {module: moduleName, status: 'installed'};
},
refresh: async () => {
refreshed.push(Date.now());
},
});
const first = install('fluxer_grammars');
const second = install('fluxer_grammars');
const other = install('fluxer_fonts_sc');
assert.equal(first, second);
assert.notEqual(first, other);
gate.resolve();
assert.deepEqual(await first, {module: 'fluxer_grammars', status: 'installed'});
assert.deepEqual(await second, {module: 'fluxer_grammars', status: 'installed'});
await other;
assert.deepEqual(requested, ['fluxer_grammars', 'fluxer_fonts_sc']);
assert.equal(refreshed.length, 2);
});
test('a request that arrives after the install settles starts a new install', async () => {
let calls = 0;
const install = createOnDemandModuleInstaller({
ensure: async (moduleName) => {
calls += 1;
return {module: moduleName, status: 'installed'};
},
refresh: async () => {},
});
await install('fluxer_grammars');
await install('fluxer_grammars');
assert.equal(calls, 2);
});
test('an already committed module never touches the served file index', async () => {
let refreshes = 0;
const install = createOnDemandModuleInstaller({
ensure: async (moduleName) => ({module: moduleName, status: 'already-installed'}),
refresh: async () => {
refreshes += 1;
},
});
assert.deepEqual(await install('fluxer_grammars'), {module: 'fluxer_grammars', status: 'already-installed'});
assert.equal(refreshes, 0);
});
test('a failed install reports the module as unavailable instead of rejecting', async () => {
const failures = [];
const install = createOnDemandModuleInstaller({
ensure: async () => {
throw new Error('the manifest could not be reached');
},
refresh: async () => {},
onFailure: (moduleName, error) => {
failures.push([moduleName, error.message]);
},
});
assert.deepEqual(await install('fluxer_grammars'), {module: 'fluxer_grammars', status: 'unavailable'});
assert.deepEqual(failures, [['fluxer_grammars', 'the manifest could not be reached']]);
});
test('a module that installs but cannot be indexed is reported as unavailable', async () => {
const install = createOnDemandModuleInstaller({
ensure: async (moduleName) => ({module: moduleName, status: 'installed'}),
refresh: async () => {
throw new Error('the module manifest is missing');
},
});
assert.deepEqual(await install('fluxer_grammars'), {module: 'fluxer_grammars', status: 'unavailable'});
});
});
describe('ensureDesktopModule', () => {
test('reports the module system as disabled when no installer is registered', async () => {
setOnDemandModuleInstaller(null);
assert.deepEqual(await ensureDesktopModule('fluxer_grammars'), {
module: 'fluxer_grammars',
status: 'disabled',
});
});
test('rejects a module name the store could never hold', async () => {
setOnDemandModuleInstaller(null);
for (const candidate of ['', '../escape', 'Fluxer_Grammars', 'fluxer grammars', 42, null, 'a'.repeat(65)]) {
await assert.rejects(() => ensureDesktopModule(candidate), UnknownDesktopModuleRequestError);
}
});
test('hands a valid request to the registered installer', async () => {
const seen = [];
setOnDemandModuleInstaller(async (moduleName) => {
seen.push(moduleName);
return {module: moduleName, status: 'installed'};
});
assert.deepEqual(await ensureDesktopModule('fluxer_grammars'), {
module: 'fluxer_grammars',
status: 'installed',
});
assert.deepEqual(seen, ['fluxer_grammars']);
setOnDemandModuleInstaller(null);
});
});