mirror of
https://github.com/multica-ai/multica.git
synced 2026-07-27 04:56:20 +02:00
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>
46 lines
1.3 KiB
TypeScript
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");
|
|
});
|
|
});
|