103 lines · 3.5 KB · TypeScript
RawDownload
import { ConnectionTransientError } from "@t3tools/client-runtime/connection";import { ConnectionCatalogDocument } from "@t3tools/client-runtime/platform";import { describe, expect, it } from "@effect/vitest";import * as Effect from "effect/Effect";import * as Schema from "effect/Schema";import { afterEach, vi } from "vite-plus/test"; import { makeCatalogBackend, makeCatalogStore } from "./storage"; const emptyCatalog = {  schemaVersion: 1,  targets: [],  profiles: [],  credentials: [],  remoteDpopTokens: [],} as const;const decodeCatalog = Schema.decodeUnknownSync(Schema.fromJsonString(ConnectionCatalogDocument)); afterEach(() => {  vi.unstubAllGlobals();  vi.restoreAllMocks();}); describe("makeCatalogStore", () => {  it.effect("quarantines malformed catalogs and starts from an empty document", () =>    Effect.gen(function* () {      const writes: string[] = [];      const quarantined: string[] = [];      const store = yield* makeCatalogStore({        read: Effect.succeed("{not-json"),        write: (raw) => Effect.sync(() => writes.push(raw)),        quarantine: (raw) => Effect.sync(() => quarantined.push(raw)),      });       expect(yield* store.read).toEqual(emptyCatalog);      expect(quarantined).toEqual(["{not-json"]);      expect(writes).toHaveLength(1);      expect(decodeCatalog(writes[0]!)).toEqual(emptyCatalog);    }),  );   it.effect("does not hide catalog read failures", () =>    Effect.gen(function* () {      const failure = new ConnectionTransientError({        reason: "remote-unavailable",        detail: "permission denied",      });      const store = yield* makeCatalogStore({        read: Effect.fail(failure),        write: () => Effect.void,      });       expect(yield* Effect.flip(store.read)).toBe(failure);    }),  );}); describe("makeCatalogBackend", () => {  it.effect("fails writes when desktop secure storage declines the catalog", () =>    Effect.gen(function* () {      const setConnectionCatalog = vi.fn().mockResolvedValue(false);      vi.stubGlobal("window", {        desktopBridge: {          getConnectionCatalog: vi.fn().mockResolvedValue(null),          setConnectionCatalog,        },      });      const backend = makeCatalogBackend({} as IDBDatabase);       const error = yield* backend.write("{}").pipe(Effect.flip);       expect(error).toBeInstanceOf(ConnectionTransientError);      expect(error.detail).toContain("Desktop secure storage is unavailable");      expect(error.message).toBe("Connection attempt failed (remote-unavailable).");      expect(error.cause).toMatchObject({ _tag: "DesktopSecureStorageUnavailableError" });      expect(setConnectionCatalog).toHaveBeenCalledWith("{}");    }),  );   it.effect("preserves secure-storage write failures without exposing them in the message", () =>    Effect.gen(function* () {      const cause = new Error("credential vault path leaked");      vi.stubGlobal("window", {        desktopBridge: {          getConnectionCatalog: vi.fn().mockResolvedValue(null),          setConnectionCatalog: vi.fn().mockRejectedValue(cause),        },      });      const backend = makeCatalogBackend({} as IDBDatabase);       const error = yield* backend.write("{}").pipe(Effect.flip);       expect(error.cause).toMatchObject({        _tag: "ConnectionStorageOperationError",        operation: "save",        backend: "desktop-secure-storage",        cause,      });      expect(error.detail).toBe("Could not save local connection data.");      expect(error.message).not.toContain(cause.message);    }),  );});