feat(core): add Electron runtime, services, and app composition

This commit is contained in:
2026-02-22 21:43:43 -08:00
parent 448ce03fd4
commit d3fd47f0ec
562 changed files with 69719 additions and 0 deletions

View File

@@ -0,0 +1,88 @@
import assert from 'node:assert/strict';
import test from 'node:test';
import {
createBuildHandleJellyfinAuthCommandsMainDepsHandler,
createBuildHandleJellyfinListCommandsMainDepsHandler,
createBuildHandleJellyfinPlayCommandMainDepsHandler,
createBuildHandleJellyfinRemoteAnnounceCommandMainDepsHandler,
} from './jellyfin-cli-main-deps';
test('jellyfin auth commands main deps builder maps callbacks', async () => {
const calls: string[] = [];
const deps = createBuildHandleJellyfinAuthCommandsMainDepsHandler({
patchRawConfig: () => calls.push('patch'),
authenticateWithPassword: async () => ({}) as never,
saveStoredSession: () => calls.push('save'),
clearStoredSession: () => calls.push('clear'),
logInfo: (message) => calls.push(`info:${message}`),
})();
deps.patchRawConfig({ jellyfin: {} });
await deps.authenticateWithPassword('', '', '', {
deviceId: '',
clientName: '',
clientVersion: '',
});
deps.saveStoredSession({ accessToken: 'token', userId: 'uid' });
deps.clearStoredSession();
deps.logInfo('ok');
assert.deepEqual(calls, ['patch', 'save', 'clear', 'info:ok']);
});
test('jellyfin list commands main deps builder maps callbacks', async () => {
const calls: string[] = [];
const deps = createBuildHandleJellyfinListCommandsMainDepsHandler({
listJellyfinLibraries: async () => {
calls.push('libraries');
return [];
},
listJellyfinItems: async () => {
calls.push('items');
return [];
},
listJellyfinSubtitleTracks: async () => {
calls.push('subtitles');
return [];
},
logInfo: (message) => calls.push(`info:${message}`),
})();
await deps.listJellyfinLibraries({} as never, {} as never);
await deps.listJellyfinItems({} as never, {} as never, { libraryId: '', limit: 1 });
await deps.listJellyfinSubtitleTracks({} as never, {} as never, 'id');
deps.logInfo('done');
assert.deepEqual(calls, ['libraries', 'items', 'subtitles', 'info:done']);
});
test('jellyfin play command main deps builder maps callbacks', async () => {
const calls: string[] = [];
const deps = createBuildHandleJellyfinPlayCommandMainDepsHandler({
playJellyfinItemInMpv: async () => {
calls.push('play');
},
logWarn: (message) => calls.push(`warn:${message}`),
})();
await deps.playJellyfinItemInMpv({} as never);
deps.logWarn('missing');
assert.deepEqual(calls, ['play', 'warn:missing']);
});
test('jellyfin remote announce main deps builder maps callbacks', async () => {
const calls: string[] = [];
const session = { advertiseNow: async () => true };
const deps = createBuildHandleJellyfinRemoteAnnounceCommandMainDepsHandler({
startJellyfinRemoteSession: async () => {
calls.push('start');
},
getRemoteSession: () => session,
logInfo: (message) => calls.push(`info:${message}`),
logWarn: (message) => calls.push(`warn:${message}`),
})();
await deps.startJellyfinRemoteSession();
assert.equal(deps.getRemoteSession(), session);
deps.logInfo('visible');
deps.logWarn('not-visible');
assert.deepEqual(calls, ['start', 'info:visible', 'warn:not-visible']);
});