import { test, expect } from "vitest"; import { disableActEnvironment, renderHookToSnapshotStream, } from "@testing-library/react-render-stream"; import { Suspense } from "react"; import { InMemoryCache } from "@apollo/client"; import { useToolInfo } from "../useToolInfo.js"; import { eachHostEnv, mockApplicationManifest, spyOnConsole, } from "../../../testing/internal/index.js"; import { ApolloProvider } from "../../ApolloProvider.js"; eachHostEnv((setupHost, ApolloClient, { hostEnv }) => { test("returns tool name and input combined", async () => { using _ = spyOnConsole("debug"); const client = new ApolloClient({ cache: new InMemoryCache(), manifest: mockApplicationManifest(), }); using env = await setupHost({ client, toolCall: { name: "GetProduct", input: { id: "1" }, result: { structuredContent: { result: { data: { product: null } } } }, }, }); const { host, params } = env; host.sendToolInput(params.toolInput); host.sendToolResult(params.toolResult); using _disabledAct = disableActEnvironment(); const { takeSnapshot } = await renderHookToSnapshotStream( () => useToolInfo(), { wrapper: ({ children }) => ( {children} ), } ); await expect(takeSnapshot()).resolves.toEqual({ toolName: "GetProduct", toolInput: { id: "1" }, }); await expect(takeSnapshot).not.toRerender(); }); if (hostEnv === "openai") { test("returns undefined toolInput when toolInput is not provided", async () => { using _ = spyOnConsole("debug"); const client = new ApolloClient({ cache: new InMemoryCache(), manifest: mockApplicationManifest(), }); using env = await setupHost({ client, toolCall: { name: "GetProduct", result: { structuredContent: { result: { data: { product: null } } }, }, }, }); const { host, params } = env; host.sendToolResult(params.toolResult); using _disabledAct = disableActEnvironment(); const { takeSnapshot } = await renderHookToSnapshotStream( () => useToolInfo(), { wrapper: ({ children }) => ( {children} ), } ); await expect(takeSnapshot()).resolves.toEqual({ toolName: "GetProduct", toolInput: undefined, }); await expect(takeSnapshot).not.toRerender(); }); } });