77 lines · 2.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.message).toContain("Desktop secure storage is unavailable");      expect(setConnectionCatalog).toHaveBeenCalledWith("{}");    }),  );});