From 5302aa89474dcc35bde328c924f2ad2b8d0d3577 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 28 Mar 2026 13:23:39 +0000 Subject: [PATCH] test: use safe storage helpers in app mount hooks --- ui/src/local-storage.ts | 15 ++++++++++++--- ui/src/ui/test-helpers/app-mount.ts | 9 +++++---- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/ui/src/local-storage.ts b/ui/src/local-storage.ts index e0de8c8cee5..d5af666d1e2 100644 --- a/ui/src/local-storage.ts +++ b/ui/src/local-storage.ts @@ -6,8 +6,8 @@ function isStorage(value: unknown): value is Storage { ); } -export function getSafeLocalStorage(): Storage | null { - const descriptor = Object.getOwnPropertyDescriptor(globalThis, "localStorage"); +function getSafeStorage(name: "localStorage" | "sessionStorage"): Storage | null { + const descriptor = Object.getOwnPropertyDescriptor(globalThis, name); if (typeof process !== "undefined" && process.env?.VITEST) { return descriptor && !descriptor.get && isStorage(descriptor.value) ? descriptor.value : null; @@ -15,7 +15,8 @@ export function getSafeLocalStorage(): Storage | null { if (typeof window !== "undefined" && typeof document !== "undefined") { try { - return isStorage(window.localStorage) ? window.localStorage : null; + const storage = window[name]; + return isStorage(storage) ? storage : null; } catch { return null; } @@ -23,3 +24,11 @@ export function getSafeLocalStorage(): Storage | null { return descriptor && !descriptor.get && isStorage(descriptor.value) ? descriptor.value : null; } + +export function getSafeLocalStorage(): Storage | null { + return getSafeStorage("localStorage"); +} + +export function getSafeSessionStorage(): Storage | null { + return getSafeStorage("sessionStorage"); +} diff --git a/ui/src/ui/test-helpers/app-mount.ts b/ui/src/ui/test-helpers/app-mount.ts index e49c7d38ea1..68c57181bf4 100644 --- a/ui/src/ui/test-helpers/app-mount.ts +++ b/ui/src/ui/test-helpers/app-mount.ts @@ -1,5 +1,6 @@ import { afterEach, beforeEach, vi } from "vitest"; import { i18n } from "../../i18n/index.ts"; +import { getSafeLocalStorage, getSafeSessionStorage } from "../../local-storage.ts"; import "../app.ts"; import type { OpenClawApp } from "../app.ts"; @@ -32,8 +33,8 @@ export function mountApp(pathname: string) { export function registerAppMountHooks() { beforeEach(async () => { window.__OPENCLAW_CONTROL_UI_BASE_PATH__ = undefined; - localStorage.clear(); - sessionStorage.clear(); + getSafeLocalStorage()?.clear(); + getSafeSessionStorage()?.clear(); document.body.innerHTML = ""; await i18n.setLocale("en"); vi.stubGlobal("WebSocket", MockWebSocket as unknown as typeof WebSocket); @@ -45,8 +46,8 @@ export function registerAppMountHooks() { afterEach(async () => { window.__OPENCLAW_CONTROL_UI_BASE_PATH__ = undefined; - localStorage.clear(); - sessionStorage.clear(); + getSafeLocalStorage()?.clear(); + getSafeSessionStorage()?.clear(); document.body.innerHTML = ""; await i18n.setLocale("en"); vi.unstubAllGlobals();