import { createEmptyChatState, saveActiveChatState, } from "./chatStorage"; const apiFetch = jest.fn(); jest.mock("@/lib/apiFetch", () => ({ apiFetch: (...args: unknown[]) => apiFetch(...args), })); describe("chatStorage backend-only persistence", () => { beforeEach(() => { apiFetch.mockReset(); }); it("creates an empty initial conversation state without backend calls", () => { const loaded = createEmptyChatState(); expect(loaded).toMatchObject({ title: undefined, messages: [], sessionId: undefined, }); expect(apiFetch).not.toHaveBeenCalled(); }); it("creates a backend conversation when saving the first non-empty state", async () => { apiFetch.mockImplementation(async (url: string, init?: RequestInit) => { if (url.endsWith("/api/v1/agent/chat/session")) { expect(init?.method).toBe("POST"); return { ok: true, json: async () => ({ session_id: "chat-new-1" }), } as Response; } if (url.endsWith("/api/v1/agent/chat/session/chat-new-1")) { expect(init?.method).toBe("PUT"); expect(JSON.parse(String(init?.body))).toMatchObject({ title: "新对话", is_title_manually_edited: false, }); return { ok: true, json: async () => ({ id: "chat-new-1", session_id: "chat-new-1" }), } as Response; } throw new Error(`Unexpected request ${url}`); }); const savedSessionId = await saveActiveChatState( { title: "新对话", isTitleManuallyEdited: false, messages: [ { id: "message-2", role: "user", content: "第一条消息", }, ], sessionId: undefined, }, ); expect(savedSessionId).toBe("chat-new-1"); }); });