71 lines
1.8 KiB
TypeScript
71 lines
1.8 KiB
TypeScript
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");
|
|
});
|
|
});
|