import { expect, test } from "vitest"; import { InMemoryCache } from "@apollo/client"; import { eachHostEnv, minimalHostContextWithToolName, mockApplicationManifest, spyOnConsole, } from "../../../testing/internal/index.js"; import { disableActEnvironment, renderHookToSnapshotStream, } from "@testing-library/react-render-stream"; import { useHostContext } from "../useHostContext.js"; import { ApolloProvider } from "../../ApolloProvider.js"; eachHostEnv((setupHost, ApolloClient) => { test("returns the host context from the host", 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 } } } }, }, hostContext: { theme: "light" }, }); const { host, params } = env; host.sendToolInput(params.toolInput); host.sendToolResult(params.toolResult); using _disabledAct = disableActEnvironment(); const { takeSnapshot } = await renderHookToSnapshotStream( () => useHostContext(), { wrapper: ({ children }) => ( {children} ), } ); await expect(takeSnapshot()).resolves.toStrictEqual({ ...minimalHostContextWithToolName("GetProduct"), theme: "light", }); await expect(takeSnapshot).not.toRerender(); }); test("rerenders when the host context changes", 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 } } } }, }, hostContext: { theme: "light" }, }); const { host, params } = env; host.sendToolInput(params.toolInput); host.sendToolResult(params.toolResult); using _disabledAct = disableActEnvironment(); const { takeSnapshot } = await renderHookToSnapshotStream( () => useHostContext(), { wrapper: ({ children }) => ( {children} ), } ); await expect(takeSnapshot()).resolves.toStrictEqual({ ...minimalHostContextWithToolName("GetProduct"), theme: "light", }); host.sendHostContextChanged({ theme: "dark" }); await expect(takeSnapshot()).resolves.toStrictEqual({ ...minimalHostContextWithToolName("GetProduct"), theme: "dark", }); await expect(takeSnapshot).not.toRerender(); }); });