Files
multica/packages/core/platform/persist-storage.test.ts
Naiyuan Qing 85cff15427 feat(core): standardize storage + workspace isolation for persist stores
Unify all client-side persistence through StorageAdapter and add
workspace-scoped key namespacing (${key}:${wsId}).

- createPersistStorage: bridge for Zustand persist → StorageAdapter DI
- createWorkspaceAwareStorage: dynamic namespace by current workspace
- Migrate 6 persist stores (navigation, draft, view, scope, my-issues-view, chat)
- Rehydration registry: stores auto-rehydrate on workspace switch
- clearWorkspaceStorage: cleanup on workspace delete / member removal
- Chat store: namespace keys + rehydrate on workspace switch
- Factory view stores (createIssueViewStore): auto-register for rehydration

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 15:59:53 +08:00

46 lines
1.3 KiB
TypeScript

import { describe, it, expect, vi } from "vitest";
import { createPersistStorage } from "./persist-storage";
import type { StorageAdapter } from "../types/storage";
function mockAdapter(): StorageAdapter {
const store = new Map<string, string>();
return {
getItem: vi.fn((k) => store.get(k) ?? null),
setItem: vi.fn((k, v) => store.set(k, v)),
removeItem: vi.fn((k) => store.delete(k)),
};
}
describe("createPersistStorage", () => {
it("delegates to StorageAdapter", () => {
const adapter = mockAdapter();
const storage = createPersistStorage(adapter);
storage.setItem("key", JSON.stringify("value"));
expect(adapter.setItem).toHaveBeenCalledWith(
"key",
JSON.stringify("value"),
);
const result = storage.getItem("key");
expect(adapter.getItem).toHaveBeenCalledWith("key");
expect(result).toEqual(JSON.stringify("value"));
});
it("returns null for missing keys", () => {
const adapter = mockAdapter();
const storage = createPersistStorage(adapter);
const result = storage.getItem("nonexistent");
expect(result).toBeNull();
});
it("removeItem delegates correctly", () => {
const adapter = mockAdapter();
const storage = createPersistStorage(adapter);
storage.removeItem("key");
expect(adapter.removeItem).toHaveBeenCalledWith("key");
});
});