From 0878905da04e097571f83271f3ac44fa8762f279 Mon Sep 17 00:00:00 2001 From: 4gray Date: Fri, 15 May 2026 17:33:06 +0200 Subject: [PATCH] fix(pwa): guard electron app state calls --- .../src/lib/database-electron.service.spec.ts | 48 +++++++++++++++++++ .../src/lib/database-electron.service.ts | 8 ++++ 2 files changed, 56 insertions(+) create mode 100644 libs/services/src/lib/database-electron.service.spec.ts diff --git a/libs/services/src/lib/database-electron.service.spec.ts b/libs/services/src/lib/database-electron.service.spec.ts new file mode 100644 index 000000000..082f1e79b --- /dev/null +++ b/libs/services/src/lib/database-electron.service.spec.ts @@ -0,0 +1,48 @@ +import { DatabaseService } from './database-electron.service'; + +describe('DatabaseService', () => { + let service: DatabaseService; + let originalElectron: typeof window.electron; + + const setElectron = (electron: typeof window.electron | undefined) => { + (window as unknown as { electron?: typeof window.electron }).electron = + electron; + }; + + beforeEach(() => { + service = new DatabaseService(); + originalElectron = window.electron; + }); + + afterEach(() => { + setElectron(originalElectron); + jest.restoreAllMocks(); + }); + + it('skips Electron app-state reads when the preload API is unavailable', async () => { + setElectron(undefined); + + await expect(service.getAppState('key')).resolves.toBeNull(); + }); + + it('skips Electron app-state writes when the preload API is unavailable', async () => { + setElectron(undefined); + + await expect(service.setAppState('key', 'value')).resolves.toBe(false); + }); + + it('delegates Electron app-state calls when the preload API is available', async () => { + setElectron({ + dbGetAppState: jest.fn().mockResolvedValue('stored'), + dbSetAppState: jest.fn().mockResolvedValue(undefined), + } as unknown as typeof window.electron); + + await expect(service.getAppState('key')).resolves.toBe('stored'); + await expect(service.setAppState('key', 'value')).resolves.toBe(true); + expect(window.electron.dbGetAppState).toHaveBeenCalledWith('key'); + expect(window.electron.dbSetAppState).toHaveBeenCalledWith( + 'key', + 'value' + ); + }); +}); diff --git a/libs/services/src/lib/database-electron.service.ts b/libs/services/src/lib/database-electron.service.ts index 49d3cf002..e1fbebbb5 100644 --- a/libs/services/src/lib/database-electron.service.ts +++ b/libs/services/src/lib/database-electron.service.ts @@ -506,6 +506,10 @@ export class DatabaseService { } async getAppState(key: string): Promise { + if (typeof window.electron?.dbGetAppState !== 'function') { + return null; + } + try { return await window.electron.dbGetAppState(key); } catch (error) { @@ -515,6 +519,10 @@ export class DatabaseService { } async setAppState(key: string, value: string): Promise { + if (typeof window.electron?.dbSetAppState !== 'function') { + return false; + } + try { await window.electron.dbSetAppState(key, value); return true;