import { describe, expect, it, vi } from "vitest"; import { buildAssistantAddressRuntimeInput } from "../src/services/assistantAddressRuntimeInputBuilder"; function buildInput(overrides: Record = {}) { return { featureAssistantAddressQueryV1: true, sessionId: "asst-1", userMessage: "Show overdue docs", sessionItems: [], payload: { llmProvider: "openai", useMock: 1, context: { period_hint: "2020-07-31" } }, featureAddressLlmPredecomposeV1: true, runAddressLlmPreDecompose: vi.fn(async () => ({})), buildAddressLlmPredecomposeContractV1: vi.fn(() => ({})), sanitizeAddressMessageForFallback: vi.fn((value: string) => value), toNonEmptyString: vi.fn((value: unknown) => typeof value === "string" && value.trim().length > 0 ? value.trim() : null ), resolveAddressFollowupCarryoverContext: vi.fn(() => null), resolveAssistantOrchestrationDecision: vi.fn(() => ({ mode: "address_query", runAddressLane: true })), buildAddressDialogContinuationContractV2: vi.fn(() => ({})), runtimeAnalysisContextAsOfDate: "2020-07-31", compactWhitespace: vi.fn((value: string) => value.trim()), runAddressLaneAttempt: vi.fn(async () => null), isRetryableAddressLimitedResult: vi.fn(() => false), finalizeAddressLaneResponse: vi.fn(() => ({ kind: "address" })), tryHandleLivingChat: vi.fn(async () => null), logEvent: vi.fn(), nowIso: vi.fn(() => "2026-04-11T00:00:00.000Z"), runAddressOrchestrationRuntime: vi.fn(async () => ({})), runAddressToolGateRuntime: vi.fn(async () => ({ handled: false, response: null })), runAddressLaneRuntime: vi.fn(async () => ({ handled: false, selection: null, retryAudit: {} })), ...overrides } as any; } describe("assistant address runtime input builder", () => { it("maps payload provider/useMock/period hint into address runtime input", () => { const runtimeInput = buildAssistantAddressRuntimeInput(buildInput()); expect(runtimeInput.llmProvider).toBe("openai"); expect(runtimeInput.useMock).toBe(true); expect(runtimeInput.payloadContextPeriodHint).toBe("2020-07-31"); expect(runtimeInput.sessionId).toBe("asst-1"); expect(runtimeInput.userMessage).toBe("Show overdue docs"); }); it("keeps empty payload fields safe and preserves runtime callbacks", () => { const runAddressLaneAttempt = vi.fn(async () => null); const tryHandleLivingChat = vi.fn(async () => null); const runtimeInput = buildAssistantAddressRuntimeInput( buildInput({ payload: {}, runAddressLaneAttempt, tryHandleLivingChat }) ); expect(runtimeInput.llmProvider).toBeUndefined(); expect(runtimeInput.useMock).toBe(false); expect(runtimeInput.payloadContextPeriodHint).toBeUndefined(); expect(runtimeInput.runAddressLaneAttempt).toBe(runAddressLaneAttempt); expect(runtimeInput.tryHandleLivingChat).toBe(tryHandleLivingChat); }); });