ГЛОБАЛЬНЫЙ РЕФАКТОРИНГ АРХИТЕКТУРЫ - Рефакторинг этапов 2.39: вынос bootstrap пользовательского хода (нормализация текста + append/persist user-item) из handleMessage в отдельный runtime-адаптер. Это безопасно и дополнительно разгружает assistantService.
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
import { runAssistantUserTurnBootstrapRuntime } from "../src/services/assistantUserTurnBootstrapRuntimeAdapter";
|
||||
|
||||
describe("assistant user turn bootstrap runtime adapter", () => {
|
||||
it("normalizes user message, appends user turn and persists session", () => {
|
||||
const session = {
|
||||
session_id: "asst-1",
|
||||
items: []
|
||||
} as any;
|
||||
const appendItem = vi.fn();
|
||||
const getSession = vi.fn(() => session);
|
||||
const persistSession = vi.fn();
|
||||
|
||||
const output = runAssistantUserTurnBootstrapRuntime({
|
||||
payload: {
|
||||
session_id: "asst-1",
|
||||
user_message: " source "
|
||||
},
|
||||
ensureSession: () => session,
|
||||
appendItem,
|
||||
getSession,
|
||||
persistSession,
|
||||
compactWhitespace: (value: unknown) => String(value ?? "").replace(/\s+/g, " ").trim(),
|
||||
repairAddressMojibake: () => " fixed user text ",
|
||||
resolveRuntimeAnalysisContext: () => ({ as_of_date: "2020-07-31" }),
|
||||
messageIdFactory: () => "msg-fixed",
|
||||
nowIso: () => "2026-04-10T00:00:00.000Z"
|
||||
});
|
||||
|
||||
expect(output.session).toBe(session);
|
||||
expect(output.sessionId).toBe("asst-1");
|
||||
expect(output.userMessageRaw).toBe("source");
|
||||
expect(output.userMessage).toBe("fixed user text");
|
||||
expect(output.runtimeAnalysisContext).toEqual({ as_of_date: "2020-07-31" });
|
||||
expect(appendItem).toHaveBeenCalledWith(
|
||||
"asst-1",
|
||||
expect.objectContaining({
|
||||
message_id: "msg-fixed",
|
||||
role: "user",
|
||||
text: "fixed user text",
|
||||
created_at: "2026-04-10T00:00:00.000Z"
|
||||
})
|
||||
);
|
||||
expect(getSession).toHaveBeenCalledWith("asst-1");
|
||||
expect(persistSession).toHaveBeenCalledWith(session);
|
||||
});
|
||||
|
||||
it("falls back to raw message when repaired text is empty", () => {
|
||||
const session = {
|
||||
session_id: "asst-2",
|
||||
items: []
|
||||
} as any;
|
||||
|
||||
const output = runAssistantUserTurnBootstrapRuntime({
|
||||
payload: {
|
||||
session_id: "asst-2",
|
||||
message: " raw fallback "
|
||||
},
|
||||
ensureSession: () => session,
|
||||
appendItem: () => undefined,
|
||||
getSession: () => null,
|
||||
persistSession: () => undefined,
|
||||
compactWhitespace: () => "",
|
||||
repairAddressMojibake: () => "",
|
||||
resolveRuntimeAnalysisContext: () => ({ as_of_date: null })
|
||||
});
|
||||
|
||||
expect(output.userMessageRaw).toBe("raw fallback");
|
||||
expect(output.userMessage).toBe("raw fallback");
|
||||
expect(output.runtimeAnalysisContext).toEqual({ as_of_date: null });
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user