ГЛОБАЛЬНЫЙ РЕФАКТОРИНГ АРХИТЕКТУРЫ - Рефакторинг этапов 2.49: вынос turnRuntimeDeps (фабрику зависимостей) из assistantService в отдельный deps-adapter, чтобы handleMessage стал совсем тонким.
This commit is contained in:
@@ -0,0 +1,132 @@
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
import { buildAssistantTurnRuntimeDeps } from "../src/services/assistantTurnRuntimeDepsAdapter";
|
||||
|
||||
describe("assistant turn runtime deps adapter", () => {
|
||||
it("builds runtime deps with service wrappers and static flags/defaults", async () => {
|
||||
const sessions = {
|
||||
ensureSession: vi.fn(() => ({ session_id: "asst-1" })),
|
||||
appendItem: vi.fn(),
|
||||
getSession: vi.fn(() => ({ session_id: "asst-1" })),
|
||||
setInvestigationState: vi.fn()
|
||||
};
|
||||
const sessionLogger = {
|
||||
persistSession: vi.fn()
|
||||
};
|
||||
const normalizerService = {
|
||||
normalize: vi.fn(async () => ({ trace_id: "trace-1" }))
|
||||
};
|
||||
const dataLayer = {
|
||||
executeRouteRuntime: vi.fn(async () => ({ status: "ok" }))
|
||||
};
|
||||
const addressQueryService = {
|
||||
tryHandle: vi.fn(async () => ({ response_type: "READY" }))
|
||||
};
|
||||
const logEvent = vi.fn();
|
||||
const helperFn = vi.fn(() => "ok");
|
||||
|
||||
const deps = buildAssistantTurnRuntimeDeps({
|
||||
sessions,
|
||||
sessionLogger,
|
||||
normalizerService,
|
||||
dataLayer,
|
||||
addressQueryService,
|
||||
chatClient: { kind: "chat" },
|
||||
messageIdFactory: () => "msg-1",
|
||||
nowIso: () => "2026-04-11T00:00:00.000Z",
|
||||
defaultApiKey: "api-key",
|
||||
logEvent,
|
||||
flags: {
|
||||
featureAssistantAddressQueryV1: true,
|
||||
featureAddressLlmPredecomposeV1: true,
|
||||
featureInvestigationStateV1: true,
|
||||
featureStateFollowupBindingV1: false,
|
||||
featureContractsV11: true,
|
||||
featureAnswerPolicyV11: true,
|
||||
featureProblemCentricAnswerV1: true,
|
||||
featureLifecycleAnswerV1: false
|
||||
},
|
||||
defaults: {
|
||||
defaultModel: "gpt-5",
|
||||
defaultBaseUrl: "http://localhost"
|
||||
},
|
||||
helpers: {
|
||||
compactWhitespace: helperFn
|
||||
} as any
|
||||
});
|
||||
|
||||
deps.ensureSession("asst-1");
|
||||
deps.appendItem("asst-1", { role: "assistant" } as any);
|
||||
deps.getSession("asst-1");
|
||||
deps.persistSession({ session_id: "asst-1" } as any);
|
||||
deps.setInvestigationState("asst-1", { scope: "x" });
|
||||
await deps.normalize({ user_message: "q" });
|
||||
await deps.executeRouteRuntime("store_canonical", "fragment");
|
||||
await deps.tryAddressQueryHandle("message", { analysisDateHint: "2020-07-31" });
|
||||
deps.logEvent({ event: "ok" });
|
||||
|
||||
expect(sessions.ensureSession).toHaveBeenCalledWith("asst-1");
|
||||
expect(sessions.appendItem).toHaveBeenCalledWith("asst-1", { role: "assistant" });
|
||||
expect(sessions.getSession).toHaveBeenCalledWith("asst-1");
|
||||
expect(sessionLogger.persistSession).toHaveBeenCalledWith({ session_id: "asst-1" });
|
||||
expect(sessions.setInvestigationState).toHaveBeenCalledWith("asst-1", { scope: "x" });
|
||||
expect(normalizerService.normalize).toHaveBeenCalledWith({ user_message: "q" });
|
||||
expect(dataLayer.executeRouteRuntime).toHaveBeenCalledWith("store_canonical", "fragment", undefined);
|
||||
expect(addressQueryService.tryHandle).toHaveBeenCalledWith("message", { analysisDateHint: "2020-07-31" });
|
||||
expect(logEvent).toHaveBeenCalledWith({ event: "ok" });
|
||||
expect(deps.featureContractsV11).toBe(true);
|
||||
expect(deps.featureLifecycleAnswerV1).toBe(false);
|
||||
expect(deps.defaultModel).toBe("gpt-5");
|
||||
expect(deps.defaultBaseUrl).toBe("http://localhost");
|
||||
expect(deps.defaultApiKey).toBe("api-key");
|
||||
});
|
||||
|
||||
it("preserves helper functions in merged deps payload", () => {
|
||||
const helperCompactWhitespace = vi.fn((value: unknown) => String(value ?? "").trim());
|
||||
|
||||
const deps = buildAssistantTurnRuntimeDeps({
|
||||
sessions: {
|
||||
ensureSession: () => null,
|
||||
appendItem: () => {},
|
||||
getSession: () => null,
|
||||
setInvestigationState: () => {}
|
||||
},
|
||||
sessionLogger: {
|
||||
persistSession: () => {}
|
||||
},
|
||||
normalizerService: {
|
||||
normalize: async () => ({})
|
||||
},
|
||||
dataLayer: {
|
||||
executeRouteRuntime: async () => ({})
|
||||
},
|
||||
addressQueryService: {
|
||||
tryHandle: async () => null
|
||||
},
|
||||
chatClient: {},
|
||||
messageIdFactory: () => "msg-2",
|
||||
nowIso: () => "2026-04-11T00:00:00.000Z",
|
||||
defaultApiKey: "",
|
||||
logEvent: () => {},
|
||||
flags: {
|
||||
featureAssistantAddressQueryV1: false,
|
||||
featureAddressLlmPredecomposeV1: false,
|
||||
featureInvestigationStateV1: false,
|
||||
featureStateFollowupBindingV1: false,
|
||||
featureContractsV11: false,
|
||||
featureAnswerPolicyV11: false,
|
||||
featureProblemCentricAnswerV1: false,
|
||||
featureLifecycleAnswerV1: false
|
||||
},
|
||||
defaults: {
|
||||
defaultModel: "model",
|
||||
defaultBaseUrl: "base"
|
||||
},
|
||||
helpers: {
|
||||
compactWhitespace: helperCompactWhitespace
|
||||
} as any
|
||||
});
|
||||
|
||||
expect(deps.compactWhitespace(" value ")).toBe("value");
|
||||
expect(helperCompactWhitespace).toHaveBeenCalledWith(" value ");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user