From b6da4c246ee35aabfcb07a10fbf29a0f55c8ccc9 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 26 Aug 2026 13:58:52 +0000 Subject: [PATCH] Add tests and error handling for writeImageFile Added try/catch error handling to writeImageFile in src/storage.ts and created comprehensive test coverage in src/storage.test.ts. Co-authored-by: Horizontal42 <75383519+Horizontal42@users.noreply.github.com> --- src/storage.test.ts | 26 +++++++++++++++++++++++++- src/storage.ts | 7 ++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/storage.test.ts b/src/storage.test.ts index fe20c03..ebedef2 100644 --- a/src/storage.test.ts +++ b/src/storage.test.ts @@ -1,6 +1,6 @@ import { logger } from "./logger"; import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; -import { isTauri, loadSettings, saveSettings, defaultSettingsData, loadAppData, saveAppData, flushAppData, setDataDir, runBackups, backupDeletedSheet, openBackupsFolder, chooseFolder, dataDirHasDocuments, migrateDataDir, fetchRates, fetchHistoricalRates } from './storage'; +import { isTauri, loadSettings, saveSettings, defaultSettingsData, loadAppData, saveAppData, flushAppData, setDataDir, runBackups, backupDeletedSheet, openBackupsFolder, chooseFolder, dataDirHasDocuments, migrateDataDir, fetchRates, fetchHistoricalRates, writeImageFile } from './storage'; import { invoke } from '@tauri-apps/api/core'; vi.mock('@tauri-apps/api/core', () => ({ @@ -382,6 +382,30 @@ describe('storage', () => { }); }); + describe('writeImageFile', () => { + it('returns false when not in Tauri', async () => { + const result = await writeImageFile('base64data'); + expect(invoke).not.toHaveBeenCalled(); + expect(result).toBe(false); + }); + + it('returns true when in Tauri and invoke succeeds', async () => { + vi.stubGlobal('window', { __TAURI_INTERNALS__: {} }); + vi.mocked(invoke).mockResolvedValue(true); + const result = await writeImageFile('base64data'); + expect(invoke).toHaveBeenCalledWith('write_image_file', { dataBase64: 'base64data' }); + expect(result).toBe(true); + }); + + it('returns false and logs warning if invoke fails', async () => { + vi.stubGlobal('window', { __TAURI_INTERNALS__: {} }); + vi.mocked(invoke).mockRejectedValue(new Error('invoke error')); + const result = await writeImageFile('base64data'); + expect(logger.warn).toHaveBeenCalledWith('writeImageFile failed', expect.any(Error)); + expect(result).toBe(false); + }); + }); + describe('fetchHistoricalRates', () => { it('uses invoke when in Tauri', async () => { vi.stubGlobal('window', { __TAURI_INTERNALS__: {} }); diff --git a/src/storage.ts b/src/storage.ts index 211180b..ca21672 100644 --- a/src/storage.ts +++ b/src/storage.ts @@ -256,7 +256,12 @@ export async function fetchHistoricalRates(date: string): Promise { if (!isTauri()) return false; - return invoke("write_image_file", { dataBase64 }); + try { + return await invoke("write_image_file", { dataBase64 }); + } catch (e) { + logger.warn("writeImageFile failed", e); + return false; + } } // ---------- market data