@tambo-ai/react 1.2.6 → 1.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/hooks/use-tambo-voice.test.js.map +1 -1
  2. package/dist/mcp/elicitation.test.js +1 -1
  3. package/dist/mcp/elicitation.test.js.map +1 -1
  4. package/dist/mcp/mcp-hooks.test.js.map +1 -1
  5. package/dist/mcp/tambo-mcp-provider.test.js +1 -1
  6. package/dist/mcp/tambo-mcp-provider.test.js.map +1 -1
  7. package/dist/providers/hooks/use-tambo-session-token.test.js.map +1 -1
  8. package/dist/providers/tambo-client-provider.test.js.map +1 -1
  9. package/dist/providers/tambo-context-helpers-provider.js.map +1 -1
  10. package/dist/providers/tambo-interactable-provider.d.ts.map +1 -1
  11. package/dist/providers/tambo-interactable-provider.js +15 -16
  12. package/dist/providers/tambo-interactable-provider.js.map +1 -1
  13. package/dist/providers/tambo-interactables-additional-context.test.js.map +1 -1
  14. package/dist/schema/schema.test.js.map +1 -1
  15. package/dist/util/registry.test.js.map +1 -1
  16. package/dist/util/tool-caller.test.js.map +1 -1
  17. package/dist/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
  18. package/dist/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
  19. package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
  20. package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -1
  21. package/esm/hooks/use-tambo-voice.test.js.map +1 -1
  22. package/esm/mcp/elicitation.test.js +1 -1
  23. package/esm/mcp/elicitation.test.js.map +1 -1
  24. package/esm/mcp/mcp-hooks.test.js.map +1 -1
  25. package/esm/mcp/tambo-mcp-provider.test.js +1 -1
  26. package/esm/mcp/tambo-mcp-provider.test.js.map +1 -1
  27. package/esm/providers/hooks/use-tambo-session-token.test.js.map +1 -1
  28. package/esm/providers/tambo-client-provider.test.js.map +1 -1
  29. package/esm/providers/tambo-context-helpers-provider.js.map +1 -1
  30. package/esm/providers/tambo-interactable-provider.d.ts.map +1 -1
  31. package/esm/providers/tambo-interactable-provider.js +16 -17
  32. package/esm/providers/tambo-interactable-provider.js.map +1 -1
  33. package/esm/providers/tambo-interactables-additional-context.test.js.map +1 -1
  34. package/esm/schema/schema.test.js.map +1 -1
  35. package/esm/util/registry.test.js.map +1 -1
  36. package/esm/util/tool-caller.test.js.map +1 -1
  37. package/esm/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
  38. package/esm/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
  39. package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
  40. package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -1
  41. package/package.json +10 -10
@@ -1 +1 @@
1
- {"version":3,"file":"tambo-mcp-provider.test.js","sourceRoot":"","sources":["../../src/mcp/tambo-mcp-provider.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { RequestHandlerExtra } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport type {\n ClientNotification,\n ClientRequest,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { render, waitFor } from \"@testing-library/react\";\nimport React, { useEffect } from \"react\";\nimport {\n TamboClientContext,\n useTamboClient,\n} from \"../providers/tambo-client-provider\";\nimport { TamboMcpTokenProvider } from \"../providers/tambo-mcp-token-provider\";\nimport {\n TamboRegistryProvider,\n useTamboRegistry,\n} from \"../providers/tambo-registry-provider\";\nimport { MCPClient, MCPTransport } from \"@tambo-ai/client\";\nimport {\n extractErrorMessage,\n TamboMcpProvider,\n useTamboMcpServers,\n type McpServer,\n type ProviderMCPHandlers,\n} from \"./tambo-mcp-provider\";\n\n// Import the private function for testing by re-exporting it for tests only\n// We'll need to export it temporarily or test it through public API\n\n// Helper to create mock RequestHandlerExtra for testing\nfunction createMockExtra(): RequestHandlerExtra<\n ClientRequest,\n ClientNotification\n> {\n return {\n signal: new AbortController().signal,\n requestId: \"test-request-id\",\n sendNotification: (async () => {}) as any,\n sendRequest: (async () => ({ _meta: {} })) as any,\n };\n}\n\n// Mock the MCP client to avoid ES module issues\njest.mock(\"@tambo-ai/client\", () => ({\n ...jest.requireActual(\"@tambo-ai/client\"),\n MCPClient: jest.fn(),\n MCPTransport: {\n SSE: \"sse\",\n HTTP: \"http\",\n },\n}));\n\n// Mock the registry provider to avoid dependency issues\njest.mock(\"../providers/tambo-registry-provider\", () => {\n const actual = jest.requireActual(\"../providers/tambo-registry-provider\");\n return {\n ...actual,\n useTamboRegistry: jest.fn(),\n };\n});\n\n// Mock the client provider to avoid dependency issues\njest.mock(\"../providers/tambo-client-provider\", () => {\n return {\n useTamboClient: jest.fn(),\n TamboClientContext: React.createContext(undefined),\n };\n});\n\n// Helper to wrap tests with all required providers (used across multiple describe blocks)\nconst TestWrapper: React.FC<{\n mcpServers: any;\n handlers?: ProviderMCPHandlers;\n children: React.ReactNode;\n}> = ({ mcpServers, handlers, children }) => {\n const client = useTamboClient();\n return (\n <TamboClientContext.Provider\n value={{\n client,\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider mcpServers={mcpServers}>\n <TamboMcpTokenProvider>\n <TamboMcpProvider handlers={handlers}>{children}</TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>\n );\n};\n\ndescribe(\"extractErrorMessage\", () => {\n describe(\"Array content handling\", () => {\n it(\"should extract text from array content with multiple text items\", () => {\n const content = [\n { type: \"text\", text: \"Error:\" },\n { type: \"text\", text: \"Tool execution failed\" },\n { type: \"image\", url: \"http://example.com/error.png\" }, // Should be filtered out\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error: Tool execution failed\");\n });\n\n it(\"should extract text from array content with single text item\", () => {\n const content = [{ type: \"text\", text: \"Simple error message\" }];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Simple error message\");\n });\n\n it(\"should return fallback message for array content with no text items\", () => {\n const content = [\n { type: \"image\", url: \"http://example.com/error.png\" },\n { type: \"resource\", uri: \"file://error.log\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error occurred but no details provided\");\n });\n\n it(\"should return fallback message for empty array content\", () => {\n const content: any[] = [];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error occurred but no details provided\");\n });\n\n it(\"should handle array content with mixed types correctly\", () => {\n const content = [\n { type: \"resource\", uri: \"file://log.txt\" },\n { type: \"text\", text: \"First error\" },\n { type: \"image\", url: \"http://example.com/img.png\" },\n { type: \"text\", text: \"Second error\" },\n { type: \"unknown\", data: \"something\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"First error Second error\");\n });\n\n it(\"should handle array content with malformed items\", () => {\n const content = [\n null,\n { type: \"text\", text: \"Valid error\" },\n { type: \"text\" }, // Missing text property\n { type: \"text\", text: null }, // Invalid text type\n { type: \"text\", text: \"Another valid error\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Valid error Another valid error\");\n });\n });\n\n describe(\"Non-array content handling\", () => {\n it(\"should return string content as-is\", () => {\n const content = \"Direct error message\";\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Direct error message\");\n });\n\n it(\"should handle null content\", () => {\n const content = null;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Unknown error occurred\");\n });\n\n it(\"should handle undefined content\", () => {\n const content = undefined;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Unknown error occurred\");\n });\n\n it(\"should handle number content\", () => {\n const content = 42;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"42\");\n });\n\n it(\"should handle boolean content\", () => {\n const content = false;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"false\");\n });\n\n it(\"should handle object content\", () => {\n const content = { error: \"Something went wrong\" };\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe('{\"error\":\"Something went wrong\"}');\n });\n\n it(\"should handle complex object content\", () => {\n const content = {\n error: \"Something went wrong\",\n code: 500,\n details: { message: \"Internal server error\" },\n };\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\n '{\"error\":\"Something went wrong\",\"code\":500,\"details\":{\"message\":\"Internal server error\"}}',\n );\n });\n\n it(\"should handle empty object content\", () => {\n const content = {};\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"{}\");\n });\n });\n});\n\ndescribe(\"TamboMcpProvider server list changes\", () => {\n beforeEach(() => {\n // Mock registry so tool registration is a no-op\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: jest.fn(),\n });\n\n // Mock client with baseURL\n (useTamboClient as unknown as jest.Mock).mockReturnValue({\n baseURL: \"https://api.tambo.co\",\n });\n\n // Ensure MCPClient.create exists and returns a fake client with listTools and close\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n });\n\n const Capture: React.FC<{ onUpdate: (servers: McpServer[]) => void }> = ({\n onUpdate,\n }) => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n onUpdate(servers);\n }, [servers, onUpdate]);\n return <div data-testid=\"urls\">{servers.map((s) => s.url).join(\",\")}</div>;\n };\n\n it(\"adds a new server when the list grows\", async () => {\n let latest: McpServer[] = [];\n const { rerender, getByTestId } = render(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider mcpServers={[\"https://a.example\"]}>\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n // Wait for initial connection\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Add new server\n rerender(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n const urls = getByTestId(\"urls\").textContent || \"\";\n expect(urls).toContain(\"https://a.example\");\n expect(urls).toContain(\"https://b.example\");\n });\n });\n\n it(\"removes a server when the list shrinks\", async () => {\n let latest: McpServer[] = [];\n const { rerender, getByTestId } = render(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n // Remove one server\n rerender(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider mcpServers={[\"https://a.example\"]}>\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n const urls = getByTestId(\"urls\").textContent || \"\";\n expect(urls).toContain(\"https://a.example\");\n expect(urls).not.toContain(\"https://b.example\");\n });\n });\n\n it(\"does not duplicate when a new copy of the same list is passed\", async () => {\n let latest: McpServer[] = [];\n const initial = [\n { url: \"https://a.example\", transport: MCPTransport.SSE },\n { url: \"https://b.example\", transport: MCPTransport.SSE },\n ];\n\n const { rerender } = render(\n <TestWrapper mcpServers={initial}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n // Pass a new array instance with the same logical servers\n const same = [\n { url: \"https://a.example\", transport: MCPTransport.SSE },\n { url: \"https://b.example\", transport: MCPTransport.SSE },\n ];\n rerender(\n <TestWrapper mcpServers={same}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n const urls = latest.map((s) => s.url).sort();\n expect(urls).toEqual([\"https://a.example\", \"https://b.example\"].sort());\n });\n });\n\n it(\"forwards maxCalls from MCP listTools to registry.registerTool\", async () => {\n const registerToolMock = jest.fn();\n\n // Mock registry to capture registerTool calls\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: registerToolMock,\n });\n\n // Mock client\n (useTamboClient as unknown as jest.Mock).mockReturnValue({\n baseURL: \"https://api.tambo.co\",\n });\n\n // Prepare MCP client to return a tool with maxCalls in its metadata\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([\n {\n name: \"mcp-tool\",\n description: \"Tool from MCP\",\n inputSchema: {},\n outputSchema: {},\n // MCP may include maxCalls in the tool metadata\n maxCalls: 7,\n },\n ]),\n close: jest.fn(),\n });\n\n // Render provider to trigger MCP sync\n render(\n <TestWrapper mcpServers={[\"https://mcp.example\"]}>\n <div />\n </TestWrapper>,\n );\n\n // Wait for registerTool to be called\n await waitFor(() => {\n expect(registerToolMock).toHaveBeenCalled();\n });\n\n // Inspect the first registered tool\n const registered = registerToolMock.mock.calls[0][0];\n expect(registered).toBeDefined();\n expect(registered.name).toBe(\"mcp-tool\");\n expect(registered.maxCalls).toBe(7);\n });\n\n it(\"reuses client when same server is passed with new array instance\", async () => {\n const createSpy = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n (MCPClient as unknown as any).create = createSpy;\n\n let latest: McpServer[] = [];\n const initial = [{ url: \"https://a.example\", transport: MCPTransport.SSE }];\n\n const { rerender } = render(\n <TestWrapper mcpServers={initial}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify client was created once\n expect(createSpy).toHaveBeenCalledTimes(1);\n const firstClient = latest[0].client;\n\n // Pass a new array with same server\n const same = [{ url: \"https://a.example\", transport: MCPTransport.SSE }];\n rerender(\n <TestWrapper mcpServers={same}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Client should NOT have been created again\n expect(createSpy).toHaveBeenCalledTimes(1);\n // Should be the exact same client instance\n expect(latest[0].client).toBe(firstClient);\n });\n\n it(\"calls close() on removed server clients\", async () => {\n const closeSpy = jest.fn();\n const createSpy = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: closeSpy,\n });\n (MCPClient as unknown as any).create = createSpy;\n\n let latest: McpServer[] = [];\n const { rerender } = render(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n expect(closeSpy).not.toHaveBeenCalled();\n\n // Remove one server\n rerender(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider mcpServers={[\"https://a.example\"]}>\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // close() should have been called once for the removed server\n expect(closeSpy).toHaveBeenCalledTimes(1);\n });\n\n it(\"calls close() on all clients when provider unmounts\", async () => {\n const closeSpy = jest.fn();\n const createSpy = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: closeSpy,\n });\n (MCPClient as unknown as any).create = createSpy;\n\n let latest: McpServer[] = [];\n const { unmount } = render(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n expect(closeSpy).not.toHaveBeenCalled();\n\n // Unmount the provider\n unmount();\n\n // close() should have been called for both clients\n expect(closeSpy).toHaveBeenCalledTimes(2);\n });\n\n it(\"creates new client when customHeaders change\", async () => {\n const closeSpy = jest.fn();\n let clientIdCounter = 0;\n const createSpy = jest.fn().mockImplementation(async () => {\n const id = ++clientIdCounter;\n return {\n id, // Add an ID so we can track which client is which\n listTools: jest.fn().mockResolvedValue([]),\n close: closeSpy,\n };\n });\n (MCPClient as unknown as any).create = createSpy;\n\n let latest: McpServer[] = [];\n const { rerender } = render(\n <TestWrapper\n mcpServers={[\n {\n url: \"https://a.example\",\n transport: MCPTransport.SSE,\n customHeaders: { Authorization: \"Bearer token1\" },\n },\n ]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(createSpy).toHaveBeenCalledTimes(1);\n });\n\n const firstClientId = (latest[0].client as any)?.id;\n expect(firstClientId).toBe(1);\n\n // Change the customHeaders\n rerender(\n <TestWrapper\n mcpServers={[\n {\n url: \"https://a.example\",\n transport: MCPTransport.SSE,\n customHeaders: { Authorization: \"Bearer token2\" },\n },\n ]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n // Wait for old client to be closed and new client to be created\n await waitFor(\n () => {\n expect(closeSpy).toHaveBeenCalledTimes(1);\n expect(createSpy).toHaveBeenCalledTimes(2);\n expect(latest.length).toBe(1);\n const newClientId = (latest[0].client as any)?.id;\n expect(newClientId).toBe(2); // Should be the new client\n },\n { timeout: 3000 },\n );\n });\n\n // Note: Token changes for the internal Tambo server are covered by the\n // \"creates new client when customHeaders change\" test above, since token\n // changes result in different Authorization headers, which trigger client recreation.\n});\n\ndescribe(\"TamboMcpProvider handler support\", () => {\n let mockClient: any;\n let createSpy: jest.Mock;\n\n beforeEach(() => {\n // Mock registry so tool registration is a no-op\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: jest.fn(),\n });\n\n // Mock client with baseURL\n (useTamboClient as unknown as jest.Mock).mockReturnValue({\n baseURL: \"https://api.tambo.co\",\n });\n\n // Create a mock client with update methods\n mockClient = {\n listTools: jest.fn().mockResolvedValue([]),\n updateElicitationHandler: jest.fn(),\n updateSamplingHandler: jest.fn(),\n close: jest.fn(),\n };\n\n // Mock MCPClient.create to return our mock client\n createSpy = jest.fn().mockResolvedValue(mockClient);\n (MCPClient as unknown as any).create = createSpy;\n });\n\n const Capture: React.FC<{ onUpdate: (servers: McpServer[]) => void }> = ({\n onUpdate,\n }) => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n onUpdate(servers);\n }, [servers, onUpdate]);\n return null;\n };\n\n it(\"should pass provider-level elicitation handler to MCPClient.create\", async () => {\n const mockElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"test\" }],\n });\n\n const handlers: ProviderMCPHandlers = {\n elicitation: mockElicitationHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper mcpServers={[\"https://test.example\"]} handlers={handlers}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify MCPClient.create was called with an HTTP transport and wrapped handler\n expect(createSpy).toHaveBeenCalledWith(\n \"https://test.example\",\n MCPTransport.HTTP,\n undefined,\n undefined,\n undefined,\n expect.objectContaining({\n elicitation: expect.any(Function),\n }),\n );\n\n // Get the actual handler that was passed\n const passedHandlers = createSpy.mock.calls[0][5];\n expect(passedHandlers.elicitation).toBeDefined();\n\n // Call the wrapped handler and verify it receives serverInfo\n const mockRequest = {\n method: \"sampling/createMessage\" as const,\n params: {},\n };\n const mockExtra = createMockExtra();\n await passedHandlers.elicitation(mockRequest, mockExtra);\n\n expect(mockElicitationHandler).toHaveBeenCalledWith(\n mockRequest,\n mockExtra,\n expect.objectContaining({\n url: \"https://test.example\",\n serverKey: \"test\",\n }),\n );\n });\n\n it(\"should pass provider-level sampling handler to MCPClient.create\", async () => {\n const mockSamplingHandler = jest.fn().mockResolvedValue({\n model: \"test-model\",\n stopReason: \"endTurn\",\n role: \"assistant\",\n content: { type: \"text\", text: \"response\" },\n });\n\n const handlers: ProviderMCPHandlers = {\n sampling: mockSamplingHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper mcpServers={[\"https://test.example\"]} handlers={handlers}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify MCPClient.create was called with HTTP transport and sampling handler\n expect(createSpy).toHaveBeenCalledWith(\n \"https://test.example\",\n MCPTransport.HTTP,\n undefined,\n undefined,\n undefined,\n expect.objectContaining({\n sampling: expect.any(Function),\n }),\n );\n\n // Get the actual handler and verify it receives serverInfo\n const passedHandlers = createSpy.mock.calls[0][5];\n const mockRequest = {\n method: \"sampling/createMessage\" as const,\n params: {\n messages: [],\n modelPreferences: {},\n },\n };\n const mockExtra = createMockExtra();\n await passedHandlers.sampling(mockRequest, mockExtra);\n\n expect(mockSamplingHandler).toHaveBeenCalledWith(\n mockRequest,\n mockExtra,\n expect.objectContaining({\n url: \"https://test.example\",\n serverKey: \"test\",\n }),\n );\n });\n\n it(\"should allow per-server handlers to override provider-level handlers\", async () => {\n const providerElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"provider\" }],\n });\n\n const serverElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"server\" }],\n });\n\n const handlers: ProviderMCPHandlers = {\n elicitation: providerElicitationHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper\n mcpServers={[\n {\n url: \"https://test.example\",\n handlers: {\n elicitation: serverElicitationHandler,\n },\n },\n ]}\n handlers={handlers}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify the per-server handler was used, not the provider handler\n const passedHandlers = createSpy.mock.calls[0][5];\n expect(passedHandlers.elicitation).toBe(serverElicitationHandler);\n });\n\n it(\"should pass different serverInfo to handlers for different servers\", async () => {\n const mockElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"test\" }],\n });\n\n const handlers: ProviderMCPHandlers = {\n elicitation: mockElicitationHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper\n mcpServers={[\n { url: \"https://server-a.example\", name: \"Server A\" },\n { url: \"https://server-b.example\", name: \"Server B\" },\n ]}\n handlers={handlers}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n // Verify both servers got handlers\n expect(createSpy).toHaveBeenCalledTimes(2);\n\n // Get handlers for both servers\n const serverAHandlers = createSpy.mock.calls[0][5];\n const serverBHandlers = createSpy.mock.calls[1][5];\n\n const mockRequest = {\n method: \"sampling/createMessage\" as const,\n params: {},\n };\n const mockExtra = createMockExtra();\n\n // Call handler for server A\n await serverAHandlers.elicitation(mockRequest, mockExtra);\n expect(mockElicitationHandler).toHaveBeenCalledWith(\n mockRequest,\n mockExtra,\n expect.objectContaining({\n url: \"https://server-a.example\",\n name: \"Server A\",\n }),\n );\n\n mockElicitationHandler.mockClear();\n\n // Call handler for server B\n await serverBHandlers.elicitation(mockRequest, mockExtra);\n expect(mockElicitationHandler).toHaveBeenCalledWith(\n mockRequest,\n mockExtra,\n expect.objectContaining({\n url: \"https://server-b.example\",\n name: \"Server B\",\n }),\n );\n });\n\n it(\"should update handlers when provider handlers change\", async () => {\n const initialHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"initial\" }],\n });\n\n const updatedHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"updated\" }],\n });\n\n let latest: McpServer[] = [];\n const { rerender } = render(\n <TestWrapper\n mcpServers={[\"https://test.example\"]}\n handlers={{ elicitation: initialHandler }}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Update the handlers\n rerender(\n <TestWrapper\n mcpServers={[\"https://test.example\"]}\n handlers={{ elicitation: updatedHandler }}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(mockClient.updateElicitationHandler).toHaveBeenCalled();\n });\n\n // Verify the handler was updated\n expect(mockClient.updateElicitationHandler).toHaveBeenCalledWith(\n expect.any(Function),\n );\n });\n});\n\ndescribe(\"TamboMcpProvider serverKey derivation and tool prefixing\", () => {\n let mockRegisterTool: jest.Mock;\n\n beforeEach(() => {\n mockRegisterTool = jest.fn();\n\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: mockRegisterTool,\n });\n\n (useTamboClient as unknown as jest.Mock).mockReturnValue({\n baseURL: \"https://api.tambo.co\",\n });\n });\n\n const Capture: React.FC<{ onUpdate: (servers: McpServer[]) => void }> = ({\n onUpdate,\n }) => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n onUpdate(servers);\n }, [servers, onUpdate]);\n return null;\n };\n\n describe(\"serverKey derivation\", () => {\n it(\"should derive serverKey from URL when not provided\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper mcpServers={[\"https://mcp.linear.app/mcp\"]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(latest[0].serverKey).toBe(\"linear\");\n });\n });\n\n it(\"should use provided serverKey when specified\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper\n mcpServers={[\n {\n url: \"https://mcp.linear.app/mcp\",\n serverKey: \"custom-key\",\n },\n ]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(latest[0].serverKey).toBe(\"custom-key\");\n });\n });\n\n it(\"should derive serverKey correctly for various URL patterns\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n\n const testCases = [\n { url: \"https://api.github.com\", expected: \"github\" },\n { url: \"https://google.com\", expected: \"google\" },\n { url: \"https://google.co.uk\", expected: \"google\" },\n { url: \"https://mcp.company.co.uk\", expected: \"company\" },\n { url: \"https://www.example.com\", expected: \"example\" },\n ];\n\n for (const { url, expected } of testCases) {\n let latest: McpServer[] = [];\n const { unmount } = render(\n <TestWrapper mcpServers={[url]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(latest[0].serverKey).toBe(expected);\n });\n\n unmount();\n }\n });\n });\n\n describe(\"tool name prefixing\", () => {\n it(\"should NOT prefix tool names when only one server is present\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest\n .fn()\n .mockResolvedValue([\n { name: \"test-tool\", description: \"A test tool\" },\n ]),\n close: jest.fn(),\n });\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper mcpServers={[\"https://mcp.linear.app/mcp\"]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(mockRegisterTool).toHaveBeenCalledWith(\n expect.objectContaining({\n name: \"test-tool\", // NOT prefixed\n }),\n );\n });\n });\n\n it(\"should prefix tool names when multiple servers are present\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest\n .fn()\n .mockResolvedValue([\n { name: \"test-tool\", description: \"A test tool\" },\n ]),\n close: jest.fn(),\n });\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper\n mcpServers={[\"https://mcp.linear.app/mcp\", \"https://api.github.com\"]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(\n () => {\n expect(latest.length).toBe(2);\n // Check that tools are registered with prefixed names\n const calls = mockRegisterTool.mock.calls;\n const toolNames = calls.map((call) => call[0].name);\n\n // Debug: log the actual tool names registered\n if (toolNames.length < 2) {\n throw new Error(\n `Only ${toolNames.length} tools registered: ${toolNames.join(\", \")}`,\n );\n }\n\n expect(\n calls.some((call) => call[0].name === \"linear__test-tool\"),\n ).toBe(true);\n expect(\n calls.some((call) => call[0].name === \"github__test-tool\"),\n ).toBe(true);\n },\n { timeout: 5000 },\n );\n });\n\n it(\"should use custom serverKey in prefix when provided\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest\n .fn()\n .mockResolvedValue([\n { name: \"test-tool\", description: \"A test tool\" },\n ]),\n close: jest.fn(),\n });\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper\n mcpServers={[\n {\n url: \"https://mcp.linear.app/mcp\",\n serverKey: \"my-server\",\n },\n \"https://api.github.com\",\n ]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n const calls = mockRegisterTool.mock.calls;\n expect(\n calls.some((call) => call[0].name === \"my-server__test-tool\"),\n ).toBe(true);\n });\n });\n });\n});\n"]}
1
+ {"version":3,"file":"tambo-mcp-provider.test.js","sourceRoot":"","sources":["../../src/mcp/tambo-mcp-provider.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { RequestHandlerExtra } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport type {\n ClientNotification,\n ClientRequest,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { render, waitFor } from \"@testing-library/react\";\nimport React, { useEffect } from \"react\";\nimport {\n TamboClientContext,\n useTamboClient,\n} from \"../providers/tambo-client-provider\";\nimport { TamboMcpTokenProvider } from \"../providers/tambo-mcp-token-provider\";\nimport {\n TamboRegistryProvider,\n useTamboRegistry,\n} from \"../providers/tambo-registry-provider\";\nimport { MCPClient, MCPTransport } from \"@tambo-ai/client\";\nimport {\n extractErrorMessage,\n TamboMcpProvider,\n useTamboMcpServers,\n type McpServer,\n type ProviderMCPHandlers,\n} from \"./tambo-mcp-provider\";\n\n// Import the private function for testing by re-exporting it for tests only\n// We'll need to export it temporarily or test it through public API\n\n// Helper to create mock RequestHandlerExtra for testing\nfunction createMockExtra(): RequestHandlerExtra<\n ClientRequest,\n ClientNotification\n> {\n return {\n signal: new AbortController().signal,\n requestId: \"test-request-id\",\n sendNotification: async () => {},\n sendRequest: (async () => ({ _meta: {} })) as any,\n };\n}\n\n// Mock the MCP client to avoid ES module issues\njest.mock(\"@tambo-ai/client\", () => ({\n ...jest.requireActual(\"@tambo-ai/client\"),\n MCPClient: jest.fn(),\n MCPTransport: {\n SSE: \"sse\",\n HTTP: \"http\",\n },\n}));\n\n// Mock the registry provider to avoid dependency issues\njest.mock(\"../providers/tambo-registry-provider\", () => {\n const actual = jest.requireActual(\"../providers/tambo-registry-provider\");\n return {\n ...actual,\n useTamboRegistry: jest.fn(),\n };\n});\n\n// Mock the client provider to avoid dependency issues\njest.mock(\"../providers/tambo-client-provider\", () => {\n return {\n useTamboClient: jest.fn(),\n TamboClientContext: React.createContext(undefined),\n };\n});\n\n// Helper to wrap tests with all required providers (used across multiple describe blocks)\nconst TestWrapper: React.FC<{\n mcpServers: any;\n handlers?: ProviderMCPHandlers;\n children: React.ReactNode;\n}> = ({ mcpServers, handlers, children }) => {\n const client = useTamboClient();\n return (\n <TamboClientContext.Provider\n value={{\n client,\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider mcpServers={mcpServers}>\n <TamboMcpTokenProvider>\n <TamboMcpProvider handlers={handlers}>{children}</TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>\n );\n};\n\ndescribe(\"extractErrorMessage\", () => {\n describe(\"Array content handling\", () => {\n it(\"should extract text from array content with multiple text items\", () => {\n const content = [\n { type: \"text\", text: \"Error:\" },\n { type: \"text\", text: \"Tool execution failed\" },\n { type: \"image\", url: \"http://example.com/error.png\" }, // Should be filtered out\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error: Tool execution failed\");\n });\n\n it(\"should extract text from array content with single text item\", () => {\n const content = [{ type: \"text\", text: \"Simple error message\" }];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Simple error message\");\n });\n\n it(\"should return fallback message for array content with no text items\", () => {\n const content = [\n { type: \"image\", url: \"http://example.com/error.png\" },\n { type: \"resource\", uri: \"file://error.log\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error occurred but no details provided\");\n });\n\n it(\"should return fallback message for empty array content\", () => {\n const content: any[] = [];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error occurred but no details provided\");\n });\n\n it(\"should handle array content with mixed types correctly\", () => {\n const content = [\n { type: \"resource\", uri: \"file://log.txt\" },\n { type: \"text\", text: \"First error\" },\n { type: \"image\", url: \"http://example.com/img.png\" },\n { type: \"text\", text: \"Second error\" },\n { type: \"unknown\", data: \"something\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"First error Second error\");\n });\n\n it(\"should handle array content with malformed items\", () => {\n const content = [\n null,\n { type: \"text\", text: \"Valid error\" },\n { type: \"text\" }, // Missing text property\n { type: \"text\", text: null }, // Invalid text type\n { type: \"text\", text: \"Another valid error\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Valid error Another valid error\");\n });\n });\n\n describe(\"Non-array content handling\", () => {\n it(\"should return string content as-is\", () => {\n const content = \"Direct error message\";\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Direct error message\");\n });\n\n it(\"should handle null content\", () => {\n const content = null;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Unknown error occurred\");\n });\n\n it(\"should handle undefined content\", () => {\n const content = undefined;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Unknown error occurred\");\n });\n\n it(\"should handle number content\", () => {\n const content = 42;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"42\");\n });\n\n it(\"should handle boolean content\", () => {\n const content = false;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"false\");\n });\n\n it(\"should handle object content\", () => {\n const content = { error: \"Something went wrong\" };\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe('{\"error\":\"Something went wrong\"}');\n });\n\n it(\"should handle complex object content\", () => {\n const content = {\n error: \"Something went wrong\",\n code: 500,\n details: { message: \"Internal server error\" },\n };\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\n '{\"error\":\"Something went wrong\",\"code\":500,\"details\":{\"message\":\"Internal server error\"}}',\n );\n });\n\n it(\"should handle empty object content\", () => {\n const content = {};\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"{}\");\n });\n });\n});\n\ndescribe(\"TamboMcpProvider server list changes\", () => {\n beforeEach(() => {\n // Mock registry so tool registration is a no-op\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: jest.fn(),\n });\n\n // Mock client with baseURL\n (useTamboClient as unknown as jest.Mock).mockReturnValue({\n baseURL: \"https://api.tambo.co\",\n });\n\n // Ensure MCPClient.create exists and returns a fake client with listTools and close\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n });\n\n const Capture: React.FC<{ onUpdate: (servers: McpServer[]) => void }> = ({\n onUpdate,\n }) => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n onUpdate(servers);\n }, [servers, onUpdate]);\n return <div data-testid=\"urls\">{servers.map((s) => s.url).join(\",\")}</div>;\n };\n\n it(\"adds a new server when the list grows\", async () => {\n let latest: McpServer[] = [];\n const { rerender, getByTestId } = render(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider mcpServers={[\"https://a.example\"]}>\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n // Wait for initial connection\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Add new server\n rerender(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n const urls = getByTestId(\"urls\").textContent || \"\";\n expect(urls).toContain(\"https://a.example\");\n expect(urls).toContain(\"https://b.example\");\n });\n });\n\n it(\"removes a server when the list shrinks\", async () => {\n let latest: McpServer[] = [];\n const { rerender, getByTestId } = render(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n // Remove one server\n rerender(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider mcpServers={[\"https://a.example\"]}>\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n const urls = getByTestId(\"urls\").textContent || \"\";\n expect(urls).toContain(\"https://a.example\");\n expect(urls).not.toContain(\"https://b.example\");\n });\n });\n\n it(\"does not duplicate when a new copy of the same list is passed\", async () => {\n let latest: McpServer[] = [];\n const initial = [\n { url: \"https://a.example\", transport: MCPTransport.SSE },\n { url: \"https://b.example\", transport: MCPTransport.SSE },\n ];\n\n const { rerender } = render(\n <TestWrapper mcpServers={initial}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n // Pass a new array instance with the same logical servers\n const same = [\n { url: \"https://a.example\", transport: MCPTransport.SSE },\n { url: \"https://b.example\", transport: MCPTransport.SSE },\n ];\n rerender(\n <TestWrapper mcpServers={same}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n const urls = latest.map((s) => s.url).sort();\n expect(urls).toEqual([\"https://a.example\", \"https://b.example\"].sort());\n });\n });\n\n it(\"forwards maxCalls from MCP listTools to registry.registerTool\", async () => {\n const registerToolMock = jest.fn();\n\n // Mock registry to capture registerTool calls\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: registerToolMock,\n });\n\n // Mock client\n (useTamboClient as unknown as jest.Mock).mockReturnValue({\n baseURL: \"https://api.tambo.co\",\n });\n\n // Prepare MCP client to return a tool with maxCalls in its metadata\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([\n {\n name: \"mcp-tool\",\n description: \"Tool from MCP\",\n inputSchema: {},\n outputSchema: {},\n // MCP may include maxCalls in the tool metadata\n maxCalls: 7,\n },\n ]),\n close: jest.fn(),\n });\n\n // Render provider to trigger MCP sync\n render(\n <TestWrapper mcpServers={[\"https://mcp.example\"]}>\n <div />\n </TestWrapper>,\n );\n\n // Wait for registerTool to be called\n await waitFor(() => {\n expect(registerToolMock).toHaveBeenCalled();\n });\n\n // Inspect the first registered tool\n const registered = registerToolMock.mock.calls[0][0];\n expect(registered).toBeDefined();\n expect(registered.name).toBe(\"mcp-tool\");\n expect(registered.maxCalls).toBe(7);\n });\n\n it(\"reuses client when same server is passed with new array instance\", async () => {\n const createSpy = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n (MCPClient as unknown as any).create = createSpy;\n\n let latest: McpServer[] = [];\n const initial = [{ url: \"https://a.example\", transport: MCPTransport.SSE }];\n\n const { rerender } = render(\n <TestWrapper mcpServers={initial}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify client was created once\n expect(createSpy).toHaveBeenCalledTimes(1);\n const firstClient = latest[0].client;\n\n // Pass a new array with same server\n const same = [{ url: \"https://a.example\", transport: MCPTransport.SSE }];\n rerender(\n <TestWrapper mcpServers={same}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Client should NOT have been created again\n expect(createSpy).toHaveBeenCalledTimes(1);\n // Should be the exact same client instance\n expect(latest[0].client).toBe(firstClient);\n });\n\n it(\"calls close() on removed server clients\", async () => {\n const closeSpy = jest.fn();\n const createSpy = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: closeSpy,\n });\n (MCPClient as unknown as any).create = createSpy;\n\n let latest: McpServer[] = [];\n const { rerender } = render(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n expect(closeSpy).not.toHaveBeenCalled();\n\n // Remove one server\n rerender(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider mcpServers={[\"https://a.example\"]}>\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // close() should have been called once for the removed server\n expect(closeSpy).toHaveBeenCalledTimes(1);\n });\n\n it(\"calls close() on all clients when provider unmounts\", async () => {\n const closeSpy = jest.fn();\n const createSpy = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: closeSpy,\n });\n (MCPClient as unknown as any).create = createSpy;\n\n let latest: McpServer[] = [];\n const { unmount } = render(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n expect(closeSpy).not.toHaveBeenCalled();\n\n // Unmount the provider\n unmount();\n\n // close() should have been called for both clients\n expect(closeSpy).toHaveBeenCalledTimes(2);\n });\n\n it(\"creates new client when customHeaders change\", async () => {\n const closeSpy = jest.fn();\n let clientIdCounter = 0;\n const createSpy = jest.fn().mockImplementation(async () => {\n const id = ++clientIdCounter;\n return {\n id, // Add an ID so we can track which client is which\n listTools: jest.fn().mockResolvedValue([]),\n close: closeSpy,\n };\n });\n (MCPClient as unknown as any).create = createSpy;\n\n let latest: McpServer[] = [];\n const { rerender } = render(\n <TestWrapper\n mcpServers={[\n {\n url: \"https://a.example\",\n transport: MCPTransport.SSE,\n customHeaders: { Authorization: \"Bearer token1\" },\n },\n ]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(createSpy).toHaveBeenCalledTimes(1);\n });\n\n const firstClientId = (latest[0].client as any)?.id;\n expect(firstClientId).toBe(1);\n\n // Change the customHeaders\n rerender(\n <TestWrapper\n mcpServers={[\n {\n url: \"https://a.example\",\n transport: MCPTransport.SSE,\n customHeaders: { Authorization: \"Bearer token2\" },\n },\n ]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n // Wait for old client to be closed and new client to be created\n await waitFor(\n () => {\n expect(closeSpy).toHaveBeenCalledTimes(1);\n expect(createSpy).toHaveBeenCalledTimes(2);\n expect(latest.length).toBe(1);\n const newClientId = (latest[0].client as any)?.id;\n expect(newClientId).toBe(2); // Should be the new client\n },\n { timeout: 3000 },\n );\n });\n\n // Note: Token changes for the internal Tambo server are covered by the\n // \"creates new client when customHeaders change\" test above, since token\n // changes result in different Authorization headers, which trigger client recreation.\n});\n\ndescribe(\"TamboMcpProvider handler support\", () => {\n let mockClient: any;\n let createSpy: jest.Mock;\n\n beforeEach(() => {\n // Mock registry so tool registration is a no-op\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: jest.fn(),\n });\n\n // Mock client with baseURL\n (useTamboClient as unknown as jest.Mock).mockReturnValue({\n baseURL: \"https://api.tambo.co\",\n });\n\n // Create a mock client with update methods\n mockClient = {\n listTools: jest.fn().mockResolvedValue([]),\n updateElicitationHandler: jest.fn(),\n updateSamplingHandler: jest.fn(),\n close: jest.fn(),\n };\n\n // Mock MCPClient.create to return our mock client\n createSpy = jest.fn().mockResolvedValue(mockClient);\n (MCPClient as unknown as any).create = createSpy;\n });\n\n const Capture: React.FC<{ onUpdate: (servers: McpServer[]) => void }> = ({\n onUpdate,\n }) => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n onUpdate(servers);\n }, [servers, onUpdate]);\n return null;\n };\n\n it(\"should pass provider-level elicitation handler to MCPClient.create\", async () => {\n const mockElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"test\" }],\n });\n\n const handlers: ProviderMCPHandlers = {\n elicitation: mockElicitationHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper mcpServers={[\"https://test.example\"]} handlers={handlers}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify MCPClient.create was called with an HTTP transport and wrapped handler\n expect(createSpy).toHaveBeenCalledWith(\n \"https://test.example\",\n MCPTransport.HTTP,\n undefined,\n undefined,\n undefined,\n expect.objectContaining({\n elicitation: expect.any(Function),\n }),\n );\n\n // Get the actual handler that was passed\n const passedHandlers = createSpy.mock.calls[0][5];\n expect(passedHandlers.elicitation).toBeDefined();\n\n // Call the wrapped handler and verify it receives serverInfo\n const mockRequest = {\n method: \"sampling/createMessage\" as const,\n params: {},\n };\n const mockExtra = createMockExtra();\n await passedHandlers.elicitation(mockRequest, mockExtra);\n\n expect(mockElicitationHandler).toHaveBeenCalledWith(\n mockRequest,\n mockExtra,\n expect.objectContaining({\n url: \"https://test.example\",\n serverKey: \"test\",\n }),\n );\n });\n\n it(\"should pass provider-level sampling handler to MCPClient.create\", async () => {\n const mockSamplingHandler = jest.fn().mockResolvedValue({\n model: \"test-model\",\n stopReason: \"endTurn\",\n role: \"assistant\",\n content: { type: \"text\", text: \"response\" },\n });\n\n const handlers: ProviderMCPHandlers = {\n sampling: mockSamplingHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper mcpServers={[\"https://test.example\"]} handlers={handlers}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify MCPClient.create was called with HTTP transport and sampling handler\n expect(createSpy).toHaveBeenCalledWith(\n \"https://test.example\",\n MCPTransport.HTTP,\n undefined,\n undefined,\n undefined,\n expect.objectContaining({\n sampling: expect.any(Function),\n }),\n );\n\n // Get the actual handler and verify it receives serverInfo\n const passedHandlers = createSpy.mock.calls[0][5];\n const mockRequest = {\n method: \"sampling/createMessage\" as const,\n params: {\n messages: [],\n modelPreferences: {},\n },\n };\n const mockExtra = createMockExtra();\n await passedHandlers.sampling(mockRequest, mockExtra);\n\n expect(mockSamplingHandler).toHaveBeenCalledWith(\n mockRequest,\n mockExtra,\n expect.objectContaining({\n url: \"https://test.example\",\n serverKey: \"test\",\n }),\n );\n });\n\n it(\"should allow per-server handlers to override provider-level handlers\", async () => {\n const providerElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"provider\" }],\n });\n\n const serverElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"server\" }],\n });\n\n const handlers: ProviderMCPHandlers = {\n elicitation: providerElicitationHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper\n mcpServers={[\n {\n url: \"https://test.example\",\n handlers: {\n elicitation: serverElicitationHandler,\n },\n },\n ]}\n handlers={handlers}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify the per-server handler was used, not the provider handler\n const passedHandlers = createSpy.mock.calls[0][5];\n expect(passedHandlers.elicitation).toBe(serverElicitationHandler);\n });\n\n it(\"should pass different serverInfo to handlers for different servers\", async () => {\n const mockElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"test\" }],\n });\n\n const handlers: ProviderMCPHandlers = {\n elicitation: mockElicitationHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper\n mcpServers={[\n { url: \"https://server-a.example\", name: \"Server A\" },\n { url: \"https://server-b.example\", name: \"Server B\" },\n ]}\n handlers={handlers}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n // Verify both servers got handlers\n expect(createSpy).toHaveBeenCalledTimes(2);\n\n // Get handlers for both servers\n const serverAHandlers = createSpy.mock.calls[0][5];\n const serverBHandlers = createSpy.mock.calls[1][5];\n\n const mockRequest = {\n method: \"sampling/createMessage\" as const,\n params: {},\n };\n const mockExtra = createMockExtra();\n\n // Call handler for server A\n await serverAHandlers.elicitation(mockRequest, mockExtra);\n expect(mockElicitationHandler).toHaveBeenCalledWith(\n mockRequest,\n mockExtra,\n expect.objectContaining({\n url: \"https://server-a.example\",\n name: \"Server A\",\n }),\n );\n\n mockElicitationHandler.mockClear();\n\n // Call handler for server B\n await serverBHandlers.elicitation(mockRequest, mockExtra);\n expect(mockElicitationHandler).toHaveBeenCalledWith(\n mockRequest,\n mockExtra,\n expect.objectContaining({\n url: \"https://server-b.example\",\n name: \"Server B\",\n }),\n );\n });\n\n it(\"should update handlers when provider handlers change\", async () => {\n const initialHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"initial\" }],\n });\n\n const updatedHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"updated\" }],\n });\n\n let latest: McpServer[] = [];\n const { rerender } = render(\n <TestWrapper\n mcpServers={[\"https://test.example\"]}\n handlers={{ elicitation: initialHandler }}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Update the handlers\n rerender(\n <TestWrapper\n mcpServers={[\"https://test.example\"]}\n handlers={{ elicitation: updatedHandler }}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(mockClient.updateElicitationHandler).toHaveBeenCalled();\n });\n\n // Verify the handler was updated\n expect(mockClient.updateElicitationHandler).toHaveBeenCalledWith(\n expect.any(Function),\n );\n });\n});\n\ndescribe(\"TamboMcpProvider serverKey derivation and tool prefixing\", () => {\n let mockRegisterTool: jest.Mock;\n\n beforeEach(() => {\n mockRegisterTool = jest.fn();\n\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: mockRegisterTool,\n });\n\n (useTamboClient as unknown as jest.Mock).mockReturnValue({\n baseURL: \"https://api.tambo.co\",\n });\n });\n\n const Capture: React.FC<{ onUpdate: (servers: McpServer[]) => void }> = ({\n onUpdate,\n }) => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n onUpdate(servers);\n }, [servers, onUpdate]);\n return null;\n };\n\n describe(\"serverKey derivation\", () => {\n it(\"should derive serverKey from URL when not provided\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper mcpServers={[\"https://mcp.linear.app/mcp\"]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(latest[0].serverKey).toBe(\"linear\");\n });\n });\n\n it(\"should use provided serverKey when specified\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper\n mcpServers={[\n {\n url: \"https://mcp.linear.app/mcp\",\n serverKey: \"custom-key\",\n },\n ]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(latest[0].serverKey).toBe(\"custom-key\");\n });\n });\n\n it(\"should derive serverKey correctly for various URL patterns\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n\n const testCases = [\n { url: \"https://api.github.com\", expected: \"github\" },\n { url: \"https://google.com\", expected: \"google\" },\n { url: \"https://google.co.uk\", expected: \"google\" },\n { url: \"https://mcp.company.co.uk\", expected: \"company\" },\n { url: \"https://www.example.com\", expected: \"example\" },\n ];\n\n for (const { url, expected } of testCases) {\n let latest: McpServer[] = [];\n const { unmount } = render(\n <TestWrapper mcpServers={[url]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(latest[0].serverKey).toBe(expected);\n });\n\n unmount();\n }\n });\n });\n\n describe(\"tool name prefixing\", () => {\n it(\"should NOT prefix tool names when only one server is present\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest\n .fn()\n .mockResolvedValue([\n { name: \"test-tool\", description: \"A test tool\" },\n ]),\n close: jest.fn(),\n });\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper mcpServers={[\"https://mcp.linear.app/mcp\"]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(mockRegisterTool).toHaveBeenCalledWith(\n expect.objectContaining({\n name: \"test-tool\", // NOT prefixed\n }),\n );\n });\n });\n\n it(\"should prefix tool names when multiple servers are present\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest\n .fn()\n .mockResolvedValue([\n { name: \"test-tool\", description: \"A test tool\" },\n ]),\n close: jest.fn(),\n });\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper\n mcpServers={[\"https://mcp.linear.app/mcp\", \"https://api.github.com\"]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(\n () => {\n expect(latest.length).toBe(2);\n // Check that tools are registered with prefixed names\n const calls = mockRegisterTool.mock.calls;\n const toolNames = calls.map((call) => call[0].name);\n\n // Debug: log the actual tool names registered\n if (toolNames.length < 2) {\n throw new Error(\n `Only ${toolNames.length} tools registered: ${toolNames.join(\", \")}`,\n );\n }\n\n expect(\n calls.some((call) => call[0].name === \"linear__test-tool\"),\n ).toBe(true);\n expect(\n calls.some((call) => call[0].name === \"github__test-tool\"),\n ).toBe(true);\n },\n { timeout: 5000 },\n );\n });\n\n it(\"should use custom serverKey in prefix when provided\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest\n .fn()\n .mockResolvedValue([\n { name: \"test-tool\", description: \"A test tool\" },\n ]),\n close: jest.fn(),\n });\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper\n mcpServers={[\n {\n url: \"https://mcp.linear.app/mcp\",\n serverKey: \"my-server\",\n },\n \"https://api.github.com\",\n ]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n const calls = mockRegisterTool.mock.calls;\n expect(\n calls.some((call) => call[0].name === \"my-server__test-tool\"),\n ).toBe(true);\n });\n });\n });\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"use-tambo-session-token.test.js","sourceRoot":"","sources":["../../../src/providers/hooks/use-tambo-session-token.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { QueryClient } from \"@tanstack/react-query\";\nimport { act, renderHook } from \"@testing-library/react\";\nimport { useTamboSessionToken } from \"./use-tambo-session-token\";\nimport type { PartialTamboAI } from \"../../testing/types\";\n\ndescribe(\"useTamboSessionToken\", () => {\n const mockTokenResponse = {\n access_token: \"test-access-token\",\n expires_in: 3600, // 1 hour\n token_type: \"Bearer\",\n };\n\n const mockAuthApi = {\n getToken: jest.fn(),\n } satisfies NonNullable<PartialTamboAI[\"beta\"]>[\"auth\"];\n\n const mockBeta = {\n auth: mockAuthApi,\n } satisfies PartialTamboAI[\"beta\"];\n\n const mockTamboAI = {\n apiKey: \"\",\n beta: mockBeta,\n bearer: \"\",\n } satisfies PartialTamboAI as unknown as TamboAI;\n const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n retry: false,\n refetchOnWindowFocus: false,\n },\n },\n });\n\n beforeEach(() => {\n jest.clearAllMocks();\n jest.clearAllTimers();\n jest.useFakeTimers();\n (mockTamboAI as any).bearer = \"\";\n queryClient.clear();\n });\n\n afterEach(async () => {\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n jest.useRealTimers();\n jest.resetAllMocks();\n });\n\n it(\"should return null initially when no userToken is provided\", () => {\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, undefined),\n );\n\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: false,\n });\n expect(mockAuthApi.getToken).not.toHaveBeenCalled();\n });\n\n it(\"should fetch and return session token when userToken is provided\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(1);\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: mockTokenResponse,\n isFetching: false,\n });\n expect(mockTamboAI.bearer).toBe(mockTokenResponse.access_token);\n // Verify the hook was called with correct parameters\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(2);\n expect(mockAuthApi.getToken).toHaveBeenCalledWith(expect.any(Object));\n });\n\n it(\"should call getToken with correct token exchange parameters\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n const callArgs = mockAuthApi.getToken.mock.calls[0][0];\n const tokenRequestString = new TextDecoder().decode(callArgs);\n const tokenRequest = new URLSearchParams(tokenRequestString);\n\n expect(tokenRequest.get(\"grant_type\")).toBe(\n \"urn:ietf:params:oauth:grant-type:token-exchange\",\n );\n expect(tokenRequest.get(\"subject_token\")).toBe(\"user-token\");\n expect(tokenRequest.get(\"subject_token_type\")).toBe(\n \"urn:ietf:params:oauth:token-type:access_token\",\n );\n });\n\n it(\"should set bearer token on client\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: mockTokenResponse,\n });\n expect(mockTamboAI.bearer).toBe(\"test-access-token\");\n });\n\n it(\"should handle different token responses\", async () => {\n const customTokenResponse = {\n access_token: \"custom-access-token\",\n expires_in: 7200, // 2 hours\n token_type: \"Bearer\",\n };\n\n mockAuthApi.getToken.mockResolvedValue(customTokenResponse);\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: true,\n });\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: customTokenResponse,\n isFetching: false,\n });\n expect(mockTamboAI.bearer).toBe(\"custom-access-token\");\n });\n\n it(\"should not fetch token when userToken changes to undefined\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n const { result, rerender } = renderHook(\n ({ userToken }) =>\n useTamboSessionToken(mockTamboAI, queryClient, userToken),\n {\n initialProps: { userToken: \"user-token\" as string | undefined },\n },\n );\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(1);\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: mockTokenResponse,\n isFetching: false,\n });\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(2);\n\n // Clear mock and change userToken to undefined\n jest.clearAllMocks();\n\n act(() => {\n rerender({ userToken: undefined });\n });\n\n expect(mockAuthApi.getToken).not.toHaveBeenCalled();\n });\n\n it(\"should refetch token when userToken changes\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n const { result, rerender } = renderHook(\n ({ userToken }) =>\n useTamboSessionToken(mockTamboAI, queryClient, userToken),\n {\n initialProps: { userToken: \"user-token-1\" },\n },\n );\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(1);\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: mockTokenResponse,\n isFetching: false,\n });\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(2);\n\n // Mock response for new token\n mockAuthApi.getToken.mockResolvedValue({\n ...mockTokenResponse,\n access_token: \"new-access-token\",\n });\n\n // Change userToken\n act(() => {\n rerender({ userToken: \"user-token-2\" });\n });\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: { access_token: \"new-access-token\" },\n isFetching: false,\n });\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(4);\n });\n\n it(\"should reset token when userToken becomes null\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n const { result, rerender } = renderHook(\n ({ userToken }) =>\n useTamboSessionToken(mockTamboAI, queryClient, userToken),\n {\n initialProps: { userToken: \"user-token\" as string | undefined },\n },\n );\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: mockTokenResponse,\n isFetching: false,\n });\n\n // Change userToken to undefined\n rerender({ userToken: undefined });\n await act(async () => {\n await jest.runAllTimersAsync();\n });\n\n // Token should reset to null (hook doesn't reset it to null when userToken is undefined)\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: false,\n });\n });\n\n it(\"should not update state if component is unmounted during token fetch\", async () => {\n let resolvePromise: (value: any) => void;\n const promise = new Promise((resolve) => {\n resolvePromise = resolve;\n });\n\n mockAuthApi.getToken.mockReturnValue(promise);\n\n const { result, unmount } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: true,\n });\n\n // Unmount before the promise resolves\n unmount();\n\n // Now resolve the promise\n act(() => {\n resolvePromise!(mockTokenResponse);\n });\n\n // Token should still be null since component was unmounted\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: true,\n });\n });\n\n it(\"should set isUpdating to true while fetching token\", () => {\n mockAuthApi.getToken.mockImplementation(async () => {\n return await new Promise(() => {}); // Never resolves\n });\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n\n // Should be updating immediately when userToken is provided\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: true,\n });\n });\n\n it(\"should set isUpdating to false after token fetch completes\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n\n // Should be updating initially\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: true,\n });\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n // Should not be updating after completion\n expect(result.current).toMatchObject({\n data: mockTokenResponse,\n isFetching: false,\n });\n });\n\n it(\"should set isUpdating to false after token fetch fails\", async () => {\n mockAuthApi.getToken.mockRejectedValue(new Error(\"Token fetch failed\"));\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n\n // Should be updating initially\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: true,\n });\n\n await act(async () => {\n await jest.runAllTimersAsync();\n });\n\n // Should not be updating after failure\n expect(result.current).toMatchObject({\n data: undefined,\n error: expect.any(Error),\n isFetching: false,\n });\n });\n});\n"]}
1
+ {"version":3,"file":"use-tambo-session-token.test.js","sourceRoot":"","sources":["../../../src/providers/hooks/use-tambo-session-token.test.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAGjE,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,MAAM,iBAAiB,GAAG;QACxB,YAAY,EAAE,mBAAmB;QACjC,UAAU,EAAE,IAAI,EAAE,SAAS;QAC3B,UAAU,EAAE,QAAQ;KACrB,CAAC;IAEF,MAAM,WAAW,GAAG;QAClB,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;KACkC,CAAC;IAExD,MAAM,QAAQ,GAAG;QACf,IAAI,EAAE,WAAW;KACe,CAAC;IAEnC,MAAM,WAAW,GAAG;QAClB,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,EAAE;KACoC,CAAC;IACjD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;QAClC,cAAc,EAAE;YACd,OAAO,EAAE;gBACP,KAAK,EAAE,KAAK;gBACZ,oBAAoB,EAAE,KAAK;aAC5B;SACF;KACF,CAAC,CAAC;IAEH,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,aAAa,EAAE,CAAC;QACpB,WAAmB,CAAC,MAAM,GAAG,EAAE,CAAC;QACjC,WAAW,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CACjC,oBAAoB,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,CAC1D,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YACnC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;QAE1D,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CACjC,oBAAoB,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAC7D,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEtD,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YACnC,IAAI,EAAE,iBAAiB;YACvB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAChE,qDAAqD;QACrD,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;QAE1D,UAAU,CAAC,GAAG,EAAE,CACd,oBAAoB,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAC7D,CAAC;QAEF,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,kBAAkB,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9D,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,kBAAkB,CAAC,CAAC;QAE7D,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CACzC,iDAAiD,CAClD,CAAC;QACF,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7D,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CACjD,+CAA+C,CAChD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;QAE1D,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CACjC,oBAAoB,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAC7D,CAAC;QAEF,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YACnC,IAAI,EAAE,iBAAiB;SACxB,CAAC,CAAC;QACH,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,mBAAmB,GAAG;YAC1B,YAAY,EAAE,qBAAqB;YACnC,UAAU,EAAE,IAAI,EAAE,UAAU;YAC5B,UAAU,EAAE,QAAQ;SACrB,CAAC;QAEF,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QAE5D,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CACjC,oBAAoB,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAC7D,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YACnC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YACnC,IAAI,EAAE,mBAAmB;YACzB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;QAE1D,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAIrC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAChB,oBAAoB,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,EAC3D;YACE,YAAY,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE;SAC1C,CACF,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEtD,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YACnC,IAAI,EAAE,iBAAiB;YACvB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEtD,+CAA+C;QAC/C,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,GAAG,CAAC,GAAG,EAAE;YACP,QAAQ,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;QAE1D,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CACrC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAChB,oBAAoB,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,EAC3D;YACE,YAAY,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE;SAC5C,CACF,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEtD,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YACnC,IAAI,EAAE,iBAAiB;YACvB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEtD,8BAA8B;QAC9B,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YACrC,GAAG,iBAAiB;YACpB,YAAY,EAAE,kBAAkB;SACjC,CAAC,CAAC;QAEH,mBAAmB;QACnB,GAAG,CAAC,GAAG,EAAE;YACP,QAAQ,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YACnC,IAAI,EAAE,EAAE,YAAY,EAAE,kBAAkB,EAAE;YAC1C,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;QAE1D,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAIrC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAChB,oBAAoB,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,EAC3D;YACE,YAAY,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE;SAC1C,CACF,CAAC;QAEF,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YACnC,IAAI,EAAE,iBAAiB;YACvB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QAEH,gCAAgC;QAChC,QAAQ,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QACnC,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,yFAAyF;QACzF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YACnC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,IAAI,cAAoC,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACtC,cAAc,GAAG,OAAO,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,WAAW,CAAC,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAE9C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAC1C,oBAAoB,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAC7D,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YACnC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QAEH,sCAAsC;QACtC,OAAO,EAAE,CAAC;QAEV,0BAA0B;QAC1B,GAAG,CAAC,GAAG,EAAE;YACP,cAAe,CAAC,iBAAiB,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,2DAA2D;QAC3D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YACnC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;YACjD,OAAO,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,iBAAiB;QACvD,CAAC,CAAC,CAAC;QAEH,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CACjC,oBAAoB,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAC7D,CAAC;QAEF,4DAA4D;QAC5D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YACnC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;QAE1D,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CACjC,oBAAoB,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAC7D,CAAC;QAEF,+BAA+B;QAC/B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YACnC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,0CAA0C;QAC1C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YACnC,IAAI,EAAE,iBAAiB;YACvB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAExE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CACjC,oBAAoB,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAC7D,CAAC;QAEF,+BAA+B;QAC/B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YACnC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,uCAAuC;QACvC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YACnC,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YACxB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { QueryClient } from \"@tanstack/react-query\";\nimport { act, renderHook } from \"@testing-library/react\";\nimport { useTamboSessionToken } from \"./use-tambo-session-token\";\nimport type { PartialTamboAI } from \"../../testing/types\";\n\ndescribe(\"useTamboSessionToken\", () => {\n const mockTokenResponse = {\n access_token: \"test-access-token\",\n expires_in: 3600, // 1 hour\n token_type: \"Bearer\",\n };\n\n const mockAuthApi = {\n getToken: jest.fn(),\n } satisfies NonNullable<PartialTamboAI[\"beta\"]>[\"auth\"];\n\n const mockBeta = {\n auth: mockAuthApi,\n } satisfies PartialTamboAI[\"beta\"];\n\n const mockTamboAI = {\n apiKey: \"\",\n beta: mockBeta,\n bearer: \"\",\n } satisfies PartialTamboAI as unknown as TamboAI;\n const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n retry: false,\n refetchOnWindowFocus: false,\n },\n },\n });\n\n beforeEach(() => {\n jest.clearAllMocks();\n jest.clearAllTimers();\n jest.useFakeTimers();\n (mockTamboAI as any).bearer = \"\";\n queryClient.clear();\n });\n\n afterEach(async () => {\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n jest.useRealTimers();\n jest.resetAllMocks();\n });\n\n it(\"should return null initially when no userToken is provided\", () => {\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, undefined),\n );\n\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: false,\n });\n expect(mockAuthApi.getToken).not.toHaveBeenCalled();\n });\n\n it(\"should fetch and return session token when userToken is provided\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(1);\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: mockTokenResponse,\n isFetching: false,\n });\n expect(mockTamboAI.bearer).toBe(mockTokenResponse.access_token);\n // Verify the hook was called with correct parameters\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(2);\n expect(mockAuthApi.getToken).toHaveBeenCalledWith(expect.any(Object));\n });\n\n it(\"should call getToken with correct token exchange parameters\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n const callArgs = mockAuthApi.getToken.mock.calls[0][0];\n const tokenRequestString = new TextDecoder().decode(callArgs);\n const tokenRequest = new URLSearchParams(tokenRequestString);\n\n expect(tokenRequest.get(\"grant_type\")).toBe(\n \"urn:ietf:params:oauth:grant-type:token-exchange\",\n );\n expect(tokenRequest.get(\"subject_token\")).toBe(\"user-token\");\n expect(tokenRequest.get(\"subject_token_type\")).toBe(\n \"urn:ietf:params:oauth:token-type:access_token\",\n );\n });\n\n it(\"should set bearer token on client\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: mockTokenResponse,\n });\n expect(mockTamboAI.bearer).toBe(\"test-access-token\");\n });\n\n it(\"should handle different token responses\", async () => {\n const customTokenResponse = {\n access_token: \"custom-access-token\",\n expires_in: 7200, // 2 hours\n token_type: \"Bearer\",\n };\n\n mockAuthApi.getToken.mockResolvedValue(customTokenResponse);\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: true,\n });\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: customTokenResponse,\n isFetching: false,\n });\n expect(mockTamboAI.bearer).toBe(\"custom-access-token\");\n });\n\n it(\"should not fetch token when userToken changes to undefined\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n const { result, rerender } = renderHook<\n ReturnType<typeof useTamboSessionToken>,\n { userToken: string | undefined }\n >(\n ({ userToken }) =>\n useTamboSessionToken(mockTamboAI, queryClient, userToken),\n {\n initialProps: { userToken: \"user-token\" },\n },\n );\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(1);\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: mockTokenResponse,\n isFetching: false,\n });\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(2);\n\n // Clear mock and change userToken to undefined\n jest.clearAllMocks();\n\n act(() => {\n rerender({ userToken: undefined });\n });\n\n expect(mockAuthApi.getToken).not.toHaveBeenCalled();\n });\n\n it(\"should refetch token when userToken changes\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n const { result, rerender } = renderHook(\n ({ userToken }) =>\n useTamboSessionToken(mockTamboAI, queryClient, userToken),\n {\n initialProps: { userToken: \"user-token-1\" },\n },\n );\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(1);\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: mockTokenResponse,\n isFetching: false,\n });\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(2);\n\n // Mock response for new token\n mockAuthApi.getToken.mockResolvedValue({\n ...mockTokenResponse,\n access_token: \"new-access-token\",\n });\n\n // Change userToken\n act(() => {\n rerender({ userToken: \"user-token-2\" });\n });\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: { access_token: \"new-access-token\" },\n isFetching: false,\n });\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(4);\n });\n\n it(\"should reset token when userToken becomes null\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n const { result, rerender } = renderHook<\n ReturnType<typeof useTamboSessionToken>,\n { userToken: string | undefined }\n >(\n ({ userToken }) =>\n useTamboSessionToken(mockTamboAI, queryClient, userToken),\n {\n initialProps: { userToken: \"user-token\" },\n },\n );\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: mockTokenResponse,\n isFetching: false,\n });\n\n // Change userToken to undefined\n rerender({ userToken: undefined });\n await act(async () => {\n await jest.runAllTimersAsync();\n });\n\n // Token should reset to null (hook doesn't reset it to null when userToken is undefined)\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: false,\n });\n });\n\n it(\"should not update state if component is unmounted during token fetch\", async () => {\n let resolvePromise: (value: any) => void;\n const promise = new Promise((resolve) => {\n resolvePromise = resolve;\n });\n\n mockAuthApi.getToken.mockReturnValue(promise);\n\n const { result, unmount } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: true,\n });\n\n // Unmount before the promise resolves\n unmount();\n\n // Now resolve the promise\n act(() => {\n resolvePromise!(mockTokenResponse);\n });\n\n // Token should still be null since component was unmounted\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: true,\n });\n });\n\n it(\"should set isUpdating to true while fetching token\", () => {\n mockAuthApi.getToken.mockImplementation(async () => {\n return await new Promise(() => {}); // Never resolves\n });\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n\n // Should be updating immediately when userToken is provided\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: true,\n });\n });\n\n it(\"should set isUpdating to false after token fetch completes\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n\n // Should be updating initially\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: true,\n });\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n // Should not be updating after completion\n expect(result.current).toMatchObject({\n data: mockTokenResponse,\n isFetching: false,\n });\n });\n\n it(\"should set isUpdating to false after token fetch fails\", async () => {\n mockAuthApi.getToken.mockRejectedValue(new Error(\"Token fetch failed\"));\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n\n // Should be updating initially\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: true,\n });\n\n await act(async () => {\n await jest.runAllTimersAsync();\n });\n\n // Should not be updating after failure\n expect(result.current).toMatchObject({\n data: undefined,\n error: expect.any(Error),\n isFetching: false,\n });\n });\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tambo-client-provider.test.js","sourceRoot":"","sources":["../../src/providers/tambo-client-provider.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { renderHook } from \"@testing-library/react\";\nimport React from \"react\";\nimport {\n TamboClientProvider,\n TamboClientProviderProps,\n useIsTamboTokenUpdating,\n useTamboClient,\n useTamboQueryClient,\n} from \"./tambo-client-provider\";\n\n// Mock the session token hook to control token fetching state\njest.mock(\"./hooks/use-tambo-session-token\", () => ({\n useTamboSessionToken: jest.fn(),\n}));\n\nimport { useTamboSessionToken } from \"./hooks/use-tambo-session-token\";\n\n// Add fetch polyfill for jsdom environment (TamboAI SDK requires it)\nconst mockFetch = jest.fn();\nlet previousFetch: typeof fetch;\n\nbeforeEach(() => {\n mockFetch.mockReset();\n previousFetch = global.fetch;\n global.fetch = mockFetch as unknown as typeof fetch;\n});\n\nafterEach(() => {\n global.fetch = previousFetch;\n});\n\ndescribe(\"TamboClientProvider\", () => {\n beforeEach(() => {\n jest.clearAllMocks();\n\n // Default mock: not fetching\n jest.mocked(useTamboSessionToken).mockReturnValue({\n isFetching: false,\n data: undefined,\n error: null,\n isLoading: false,\n isError: false,\n isSuccess: false,\n status: \"pending\",\n fetchStatus: \"idle\",\n } as any);\n });\n\n const createWrapper = (props: TamboClientProviderProps) => {\n const Wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboClientProvider {...props}>{children}</TamboClientProvider>\n );\n Wrapper.displayName = \"TestWrapper\";\n return Wrapper;\n };\n\n describe(\"Client Configuration\", () => {\n it(\"should create client accessible via useTamboClient hook\", () => {\n const { result } = renderHook(() => useTamboClient(), {\n wrapper: createWrapper({ apiKey: \"test-api-key\" }),\n });\n\n // Client should be a TamboAI instance with expected shape\n expect(result.current).toBeDefined();\n expect(result.current.beta).toBeDefined();\n });\n\n it(\"should provide the same client instance on re-renders\", () => {\n const { result, rerender } = renderHook(() => useTamboClient(), {\n wrapper: createWrapper({ apiKey: \"test-api-key\" }),\n });\n\n const firstClient = result.current;\n rerender();\n const secondClient = result.current;\n\n expect(firstClient).toBe(secondClient);\n });\n\n it(\"should configure client with provided tamboUrl\", () => {\n const { result } = renderHook(() => useTamboClient(), {\n wrapper: createWrapper({\n apiKey: \"test-api-key\",\n tamboUrl: \"https://custom.tambo.api\",\n }),\n });\n\n expect(result.current.baseURL).toBe(\"https://custom.tambo.api\");\n });\n\n it(\"should configure client with provided environment\", async () => {\n const { result } = renderHook(() => useTamboClient(), {\n wrapper: createWrapper({\n apiKey: \"test-api-key\",\n environment: \"staging\",\n }),\n });\n\n const { url } = await result.current.buildRequest({\n method: \"get\",\n path: \"/test-endpoint\",\n });\n\n expect(url).toBe(\"https://hydra-api-dev.up.railway.app/test-endpoint\");\n });\n\n it(\"should throw if both tamboUrl and environment are provided\", () => {\n const consoleSpy = jest.spyOn(console, \"error\").mockImplementation();\n\n expect(() => {\n renderHook(() => useTamboClient(), {\n wrapper: createWrapper({\n apiKey: \"test-api-key\",\n tamboUrl: \"https://custom.tambo.api\",\n environment: \"staging\",\n }),\n });\n }).toThrow(\n \"Ambiguous URL; The `baseURL` option (or TAMBO_AI_BASE_URL env var) and the `environment` option are given. If you want to use the environment you must pass baseURL: null\",\n );\n\n consoleSpy.mockRestore();\n });\n\n it(\"should include additional headers in client configuration\", async () => {\n const { result } = renderHook(() => useTamboClient(), {\n wrapper: createWrapper({\n apiKey: \"test-api-key\",\n additionalHeaders: {\n \"X-Custom-Header\": \"custom-value\",\n \"X-Another-Header\": \"another-value\",\n },\n }),\n });\n\n const { req } = await result.current.buildRequest({\n method: \"get\",\n path: \"/test-endpoint\",\n });\n\n expect(req.headers.get(\"X-Tambo-React-Version\")).toBeDefined();\n expect(req.headers.get(\"X-Tambo-React-Version\")).toMatch(/\\d+\\.\\d+\\.\\d+/); // version format\n expect(req.headers.get(\"X-Custom-Header\")).toBe(\"custom-value\");\n expect(req.headers.get(\"X-Another-Header\")).toBe(\"another-value\");\n });\n });\n\n describe(\"Token State\", () => {\n it(\"should expose isUpdatingToken=true when session token is fetching\", () => {\n jest.mocked(useTamboSessionToken).mockReturnValue({\n isFetching: true,\n } as any);\n\n const { result } = renderHook(() => useIsTamboTokenUpdating(), {\n wrapper: createWrapper({\n apiKey: \"test-api-key\",\n userToken: \"oauth-token\",\n }),\n });\n\n expect(result.current).toBe(true);\n });\n\n it(\"should expose isUpdatingToken=false when not fetching\", () => {\n jest.mocked(useTamboSessionToken).mockReturnValue({\n isFetching: false,\n } as any);\n\n const { result } = renderHook(() => useIsTamboTokenUpdating(), {\n wrapper: createWrapper({ apiKey: \"test-api-key\" }),\n });\n\n expect(result.current).toBe(false);\n });\n\n it(\"should call useTamboSessionToken with userToken when provided\", () => {\n renderHook(() => useTamboClient(), {\n wrapper: createWrapper({\n apiKey: \"test-api-key\",\n userToken: \"my-oauth-token\",\n }),\n });\n\n expect(useTamboSessionToken).toHaveBeenCalledWith(\n expect.anything(), // client\n expect.anything(), // queryClient\n \"my-oauth-token\",\n );\n });\n });\n});\n\ndescribe(\"Hook Contracts\", () => {\n beforeEach(() => {\n jest.clearAllMocks();\n\n jest.mocked(useTamboSessionToken).mockReturnValue({\n isFetching: false,\n } as any);\n });\n\n const createWrapper = (props: { apiKey: string }) => {\n const Wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboClientProvider {...props}>{children}</TamboClientProvider>\n );\n Wrapper.displayName = \"TestWrapper\";\n return Wrapper;\n };\n\n describe(\"useTamboClient\", () => {\n it(\"should return client instance inside provider\", () => {\n const { result } = renderHook(() => useTamboClient(), {\n wrapper: createWrapper({ apiKey: \"test-api-key\" }),\n });\n\n expect(result.current).toBeDefined();\n expect(result.current.beta).toBeDefined();\n });\n\n it(\"should throw descriptive error outside provider\", () => {\n // Suppress console.error for this test\n const consoleSpy = jest.spyOn(console, \"error\").mockImplementation();\n\n expect(() => {\n renderHook(() => useTamboClient());\n }).toThrow(\"useTamboClient must be used within a TamboClientProvider\");\n\n consoleSpy.mockRestore();\n });\n });\n\n describe(\"useTamboQueryClient\", () => {\n it(\"should return QueryClient instance inside provider\", () => {\n const { result } = renderHook(() => useTamboQueryClient(), {\n wrapper: createWrapper({ apiKey: \"test-api-key\" }),\n });\n\n expect(result.current).toBeDefined();\n expect(typeof result.current.getQueryCache).toBe(\"function\");\n });\n\n it(\"should throw descriptive error outside provider\", () => {\n const consoleSpy = jest.spyOn(console, \"error\").mockImplementation();\n\n expect(() => {\n renderHook(() => useTamboQueryClient());\n }).toThrow(\n \"useTamboQueryClient must be used within a TamboClientProvider\",\n );\n\n consoleSpy.mockRestore();\n });\n });\n\n describe(\"useIsTamboTokenUpdating\", () => {\n it(\"should throw descriptive error outside provider\", () => {\n const consoleSpy = jest.spyOn(console, \"error\").mockImplementation();\n\n expect(() => {\n renderHook(() => useIsTamboTokenUpdating());\n }).toThrow(\n \"useIsTamboTokenUpdating must be used within a TamboClientProvider\",\n );\n\n consoleSpy.mockRestore();\n });\n });\n});\n"]}
1
+ {"version":3,"file":"tambo-client-provider.test.js","sourceRoot":"","sources":["../../src/providers/tambo-client-provider.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { renderHook } from \"@testing-library/react\";\nimport React from \"react\";\nimport {\n TamboClientProvider,\n TamboClientProviderProps,\n useIsTamboTokenUpdating,\n useTamboClient,\n useTamboQueryClient,\n} from \"./tambo-client-provider\";\n\n// Mock the session token hook to control token fetching state\njest.mock(\"./hooks/use-tambo-session-token\", () => ({\n useTamboSessionToken: jest.fn(),\n}));\n\nimport { useTamboSessionToken } from \"./hooks/use-tambo-session-token\";\n\n// Add fetch polyfill for jsdom environment (TamboAI SDK requires it)\nconst mockFetch = jest.fn();\nlet previousFetch: typeof fetch;\n\nbeforeEach(() => {\n mockFetch.mockReset();\n previousFetch = global.fetch;\n global.fetch = mockFetch;\n});\n\nafterEach(() => {\n global.fetch = previousFetch;\n});\n\ndescribe(\"TamboClientProvider\", () => {\n beforeEach(() => {\n jest.clearAllMocks();\n\n // Default mock: not fetching\n jest.mocked(useTamboSessionToken).mockReturnValue({\n isFetching: false,\n data: undefined,\n error: null,\n isLoading: false,\n isError: false,\n isSuccess: false,\n status: \"pending\",\n fetchStatus: \"idle\",\n } as any);\n });\n\n const createWrapper = (props: TamboClientProviderProps) => {\n const Wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboClientProvider {...props}>{children}</TamboClientProvider>\n );\n Wrapper.displayName = \"TestWrapper\";\n return Wrapper;\n };\n\n describe(\"Client Configuration\", () => {\n it(\"should create client accessible via useTamboClient hook\", () => {\n const { result } = renderHook(() => useTamboClient(), {\n wrapper: createWrapper({ apiKey: \"test-api-key\" }),\n });\n\n // Client should be a TamboAI instance with expected shape\n expect(result.current).toBeDefined();\n expect(result.current.beta).toBeDefined();\n });\n\n it(\"should provide the same client instance on re-renders\", () => {\n const { result, rerender } = renderHook(() => useTamboClient(), {\n wrapper: createWrapper({ apiKey: \"test-api-key\" }),\n });\n\n const firstClient = result.current;\n rerender();\n const secondClient = result.current;\n\n expect(firstClient).toBe(secondClient);\n });\n\n it(\"should configure client with provided tamboUrl\", () => {\n const { result } = renderHook(() => useTamboClient(), {\n wrapper: createWrapper({\n apiKey: \"test-api-key\",\n tamboUrl: \"https://custom.tambo.api\",\n }),\n });\n\n expect(result.current.baseURL).toBe(\"https://custom.tambo.api\");\n });\n\n it(\"should configure client with provided environment\", async () => {\n const { result } = renderHook(() => useTamboClient(), {\n wrapper: createWrapper({\n apiKey: \"test-api-key\",\n environment: \"staging\",\n }),\n });\n\n const { url } = await result.current.buildRequest({\n method: \"get\",\n path: \"/test-endpoint\",\n });\n\n expect(url).toBe(\"https://hydra-api-dev.up.railway.app/test-endpoint\");\n });\n\n it(\"should throw if both tamboUrl and environment are provided\", () => {\n const consoleSpy = jest.spyOn(console, \"error\").mockImplementation();\n\n expect(() => {\n renderHook(() => useTamboClient(), {\n wrapper: createWrapper({\n apiKey: \"test-api-key\",\n tamboUrl: \"https://custom.tambo.api\",\n environment: \"staging\",\n }),\n });\n }).toThrow(\n \"Ambiguous URL; The `baseURL` option (or TAMBO_AI_BASE_URL env var) and the `environment` option are given. If you want to use the environment you must pass baseURL: null\",\n );\n\n consoleSpy.mockRestore();\n });\n\n it(\"should include additional headers in client configuration\", async () => {\n const { result } = renderHook(() => useTamboClient(), {\n wrapper: createWrapper({\n apiKey: \"test-api-key\",\n additionalHeaders: {\n \"X-Custom-Header\": \"custom-value\",\n \"X-Another-Header\": \"another-value\",\n },\n }),\n });\n\n const { req } = await result.current.buildRequest({\n method: \"get\",\n path: \"/test-endpoint\",\n });\n\n expect(req.headers.get(\"X-Tambo-React-Version\")).toBeDefined();\n expect(req.headers.get(\"X-Tambo-React-Version\")).toMatch(/\\d+\\.\\d+\\.\\d+/); // version format\n expect(req.headers.get(\"X-Custom-Header\")).toBe(\"custom-value\");\n expect(req.headers.get(\"X-Another-Header\")).toBe(\"another-value\");\n });\n });\n\n describe(\"Token State\", () => {\n it(\"should expose isUpdatingToken=true when session token is fetching\", () => {\n jest.mocked(useTamboSessionToken).mockReturnValue({\n isFetching: true,\n } as any);\n\n const { result } = renderHook(() => useIsTamboTokenUpdating(), {\n wrapper: createWrapper({\n apiKey: \"test-api-key\",\n userToken: \"oauth-token\",\n }),\n });\n\n expect(result.current).toBe(true);\n });\n\n it(\"should expose isUpdatingToken=false when not fetching\", () => {\n jest.mocked(useTamboSessionToken).mockReturnValue({\n isFetching: false,\n } as any);\n\n const { result } = renderHook(() => useIsTamboTokenUpdating(), {\n wrapper: createWrapper({ apiKey: \"test-api-key\" }),\n });\n\n expect(result.current).toBe(false);\n });\n\n it(\"should call useTamboSessionToken with userToken when provided\", () => {\n renderHook(() => useTamboClient(), {\n wrapper: createWrapper({\n apiKey: \"test-api-key\",\n userToken: \"my-oauth-token\",\n }),\n });\n\n expect(useTamboSessionToken).toHaveBeenCalledWith(\n expect.anything(), // client\n expect.anything(), // queryClient\n \"my-oauth-token\",\n );\n });\n });\n});\n\ndescribe(\"Hook Contracts\", () => {\n beforeEach(() => {\n jest.clearAllMocks();\n\n jest.mocked(useTamboSessionToken).mockReturnValue({\n isFetching: false,\n } as any);\n });\n\n const createWrapper = (props: { apiKey: string }) => {\n const Wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboClientProvider {...props}>{children}</TamboClientProvider>\n );\n Wrapper.displayName = \"TestWrapper\";\n return Wrapper;\n };\n\n describe(\"useTamboClient\", () => {\n it(\"should return client instance inside provider\", () => {\n const { result } = renderHook(() => useTamboClient(), {\n wrapper: createWrapper({ apiKey: \"test-api-key\" }),\n });\n\n expect(result.current).toBeDefined();\n expect(result.current.beta).toBeDefined();\n });\n\n it(\"should throw descriptive error outside provider\", () => {\n // Suppress console.error for this test\n const consoleSpy = jest.spyOn(console, \"error\").mockImplementation();\n\n expect(() => {\n renderHook(() => useTamboClient());\n }).toThrow(\"useTamboClient must be used within a TamboClientProvider\");\n\n consoleSpy.mockRestore();\n });\n });\n\n describe(\"useTamboQueryClient\", () => {\n it(\"should return QueryClient instance inside provider\", () => {\n const { result } = renderHook(() => useTamboQueryClient(), {\n wrapper: createWrapper({ apiKey: \"test-api-key\" }),\n });\n\n expect(result.current).toBeDefined();\n expect(typeof result.current.getQueryCache).toBe(\"function\");\n });\n\n it(\"should throw descriptive error outside provider\", () => {\n const consoleSpy = jest.spyOn(console, \"error\").mockImplementation();\n\n expect(() => {\n renderHook(() => useTamboQueryClient());\n }).toThrow(\n \"useTamboQueryClient must be used within a TamboClientProvider\",\n );\n\n consoleSpy.mockRestore();\n });\n });\n\n describe(\"useIsTamboTokenUpdating\", () => {\n it(\"should throw descriptive error outside provider\", () => {\n const consoleSpy = jest.spyOn(console, \"error\").mockImplementation();\n\n expect(() => {\n renderHook(() => useIsTamboTokenUpdating());\n }).toThrow(\n \"useIsTamboTokenUpdating must be used within a TamboClientProvider\",\n );\n\n consoleSpy.mockRestore();\n });\n });\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tambo-context-helpers-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-context-helpers-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport React, {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n AdditionalContext,\n ContextHelperFn,\n ContextHelpers,\n} from \"../context-helpers\";\nimport { resolveAdditionalContext } from \"../context-helpers/registry\";\n\nexport interface TamboContextHelpersProviderProps {\n /**\n * A dictionary of context helper functions.\n * The key becomes the AdditionalContext.name and the function returns the value.\n * Return null/undefined to skip including that context.\n */\n contextHelpers?: ContextHelpers;\n}\n\nexport interface TamboContextHelpersContextProps {\n /** Get all additional context by running all helper functions */\n getAdditionalContext: () => Promise<AdditionalContext[]>;\n /** Get the current context helpers map */\n getContextHelpers: () => ContextHelpers;\n /** Add or update a context helper by name */\n addContextHelper: (name: string, helper: ContextHelperFn) => void;\n /** Remove a context helper by name */\n removeContextHelper: (name: string) => void;\n}\n\nconst TamboContextHelpersContext =\n createContext<TamboContextHelpersContextProps | null>(null);\n\n/**\n * Provider for managing additional context helpers.\n * Accepts a map of { key: () => any | null | undefined | Promise<any | null | undefined> }.\n * Returning null/undefined skips inclusion; returned values are wrapped as { name: key, context: value }.\n * @param props - The props for the TamboContextHelpersProvider.\n * @param props.contextHelpers - A dictionary of context helper functions keyed by context name.\n * @param props.children - The children to render.\n * @returns The provider that exposes context helper APIs via useTamboContextHelpers.\n */\nexport const TamboContextHelpersProvider: React.FC<\n PropsWithChildren<TamboContextHelpersProviderProps>\n> = ({ children, contextHelpers }) => {\n const [helpers, setHelpers] = useState<Record<string, ContextHelperFn>>({});\n const addContextHelper = useCallback((name: string, fn: ContextHelperFn) => {\n setHelpers((prev) => ({ ...prev, [name]: fn }));\n }, []);\n const removeContextHelper = useCallback(\n (name: string, fn?: ContextHelperFn) => {\n setHelpers((prev) => {\n const { [name]: registeredFn, ...rest } = prev;\n if (fn === undefined || registeredFn === fn) {\n return rest;\n }\n return prev;\n });\n },\n [],\n );\n // Hydrate the global registry with initial helpers (runs on prop changes)\n useEffect(() => {\n const addedEntries: [string, ContextHelperFn][] = [];\n\n if (contextHelpers) {\n for (const [name, fn] of Object.entries(contextHelpers)) {\n addContextHelper(name, fn);\n addedEntries.push([name, fn]);\n }\n }\n\n return () => {\n for (const [name, fn] of addedEntries) {\n // Only remove if the registry still points to the same function\n removeContextHelper(name, fn);\n }\n };\n }, [addContextHelper, contextHelpers, removeContextHelper]);\n\n const getAdditionalContext = useCallback(async () => {\n const contexts = await resolveAdditionalContext(helpers);\n return contexts as AdditionalContext[];\n }, [helpers]);\n\n const getContextHelpers = useCallback(() => {\n return helpers as ContextHelpers;\n }, [helpers]);\n\n const value = useMemo(\n () => ({\n getAdditionalContext,\n getContextHelpers,\n addContextHelper,\n removeContextHelper,\n }),\n [\n getAdditionalContext,\n getContextHelpers,\n addContextHelper,\n removeContextHelper,\n ],\n );\n\n return (\n <TamboContextHelpersContext.Provider value={value}>\n {children}\n </TamboContextHelpersContext.Provider>\n );\n};\n\n/**\n * Hook to access context helpers functionality.\n *\n * Behavior without a provider: this hook does NOT throw immediately. If it is\n * called outside of a `TamboContextHelpersProvider`, it returns a fallback\n * object whose methods will throw when invoked. This \"lazy-throw\" pattern is\n * intentional so the error surfaces at the actual point of use.\n * @returns The context helpers API when a provider is present; otherwise, a\n * fallback object whose methods throw if called.\n */\nexport const useTamboContextHelpers = () => {\n const context = useContext(TamboContextHelpersContext);\n if (context) return context;\n\n // No provider present: return methods that throw with a helpful error when used\n return {\n getAdditionalContext: async () => {\n throw new Error(\n \"useTamboContextHelpers must be used within a TamboContextHelpersProvider\",\n );\n },\n getContextHelpers: () => {\n throw new Error(\n \"useTamboContextHelpers must be used within a TamboContextHelpersProvider\",\n );\n },\n addContextHelper: (_name: string, _helper: ContextHelperFn) => {\n throw new Error(\n \"useTamboContextHelpers must be used within a TamboContextHelpersProvider\",\n );\n },\n removeContextHelper: (_name: string) => {\n throw new Error(\n \"useTamboContextHelpers must be used within a TamboContextHelpersProvider\",\n );\n },\n } as TamboContextHelpersContextProps;\n};\n"]}
1
+ {"version":3,"file":"tambo-context-helpers-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-context-helpers-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport React, {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n AdditionalContext,\n ContextHelperFn,\n ContextHelpers,\n} from \"../context-helpers\";\nimport { resolveAdditionalContext } from \"../context-helpers/registry\";\n\nexport interface TamboContextHelpersProviderProps {\n /**\n * A dictionary of context helper functions.\n * The key becomes the AdditionalContext.name and the function returns the value.\n * Return null/undefined to skip including that context.\n */\n contextHelpers?: ContextHelpers;\n}\n\nexport interface TamboContextHelpersContextProps {\n /** Get all additional context by running all helper functions */\n getAdditionalContext: () => Promise<AdditionalContext[]>;\n /** Get the current context helpers map */\n getContextHelpers: () => ContextHelpers;\n /** Add or update a context helper by name */\n addContextHelper: (name: string, helper: ContextHelperFn) => void;\n /** Remove a context helper by name */\n removeContextHelper: (name: string) => void;\n}\n\nconst TamboContextHelpersContext =\n createContext<TamboContextHelpersContextProps | null>(null);\n\n/**\n * Provider for managing additional context helpers.\n * Accepts a map of { key: () => any | null | undefined | Promise<any | null | undefined> }.\n * Returning null/undefined skips inclusion; returned values are wrapped as { name: key, context: value }.\n * @param props - The props for the TamboContextHelpersProvider.\n * @param props.contextHelpers - A dictionary of context helper functions keyed by context name.\n * @param props.children - The children to render.\n * @returns The provider that exposes context helper APIs via useTamboContextHelpers.\n */\nexport const TamboContextHelpersProvider: React.FC<\n PropsWithChildren<TamboContextHelpersProviderProps>\n> = ({ children, contextHelpers }) => {\n const [helpers, setHelpers] = useState<Record<string, ContextHelperFn>>({});\n const addContextHelper = useCallback((name: string, fn: ContextHelperFn) => {\n setHelpers((prev) => ({ ...prev, [name]: fn }));\n }, []);\n const removeContextHelper = useCallback(\n (name: string, fn?: ContextHelperFn) => {\n setHelpers((prev) => {\n const { [name]: registeredFn, ...rest } = prev;\n if (fn === undefined || registeredFn === fn) {\n return rest;\n }\n return prev;\n });\n },\n [],\n );\n // Hydrate the global registry with initial helpers (runs on prop changes)\n useEffect(() => {\n const addedEntries: [string, ContextHelperFn][] = [];\n\n if (contextHelpers) {\n for (const [name, fn] of Object.entries(contextHelpers)) {\n addContextHelper(name, fn);\n addedEntries.push([name, fn]);\n }\n }\n\n return () => {\n for (const [name, fn] of addedEntries) {\n // Only remove if the registry still points to the same function\n removeContextHelper(name, fn);\n }\n };\n }, [addContextHelper, contextHelpers, removeContextHelper]);\n\n const getAdditionalContext = useCallback(async () => {\n const contexts = await resolveAdditionalContext(helpers);\n return contexts;\n }, [helpers]);\n\n const getContextHelpers = useCallback(() => {\n return helpers;\n }, [helpers]);\n\n const value = useMemo(\n () => ({\n getAdditionalContext,\n getContextHelpers,\n addContextHelper,\n removeContextHelper,\n }),\n [\n getAdditionalContext,\n getContextHelpers,\n addContextHelper,\n removeContextHelper,\n ],\n );\n\n return (\n <TamboContextHelpersContext.Provider value={value}>\n {children}\n </TamboContextHelpersContext.Provider>\n );\n};\n\n/**\n * Hook to access context helpers functionality.\n *\n * Behavior without a provider: this hook does NOT throw immediately. If it is\n * called outside of a `TamboContextHelpersProvider`, it returns a fallback\n * object whose methods will throw when invoked. This \"lazy-throw\" pattern is\n * intentional so the error surfaces at the actual point of use.\n * @returns The context helpers API when a provider is present; otherwise, a\n * fallback object whose methods throw if called.\n */\nexport const useTamboContextHelpers = () => {\n const context = useContext(TamboContextHelpersContext);\n if (context) return context;\n\n // No provider present: return methods that throw with a helpful error when used\n return {\n getAdditionalContext: async () => {\n throw new Error(\n \"useTamboContextHelpers must be used within a TamboContextHelpersProvider\",\n );\n },\n getContextHelpers: () => {\n throw new Error(\n \"useTamboContextHelpers must be used within a TamboContextHelpersProvider\",\n );\n },\n addContextHelper: (_name: string, _helper: ContextHelperFn) => {\n throw new Error(\n \"useTamboContextHelpers must be used within a TamboContextHelpersProvider\",\n );\n },\n removeContextHelper: (_name: string) => {\n throw new Error(\n \"useTamboContextHelpers must be used within a TamboContextHelpersProvider\",\n );\n },\n } as TamboContextHelpersContextProps;\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tambo-interactable-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tambo-interactable-provider.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAEZ,iBAAiB,EAMlB,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,6BAA6B,CAAC;AAMrC,QAAA,MAAM,wBAAwB,yCAY5B,CAAC;AAKH;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAogBjE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,gCAEhC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;GAS3C,CAAC"}
1
+ {"version":3,"file":"tambo-interactable-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tambo-interactable-provider.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAEZ,iBAAiB,EAOlB,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,6BAA6B,CAAC;AAMrC,QAAA,MAAM,wBAAwB,yCAY5B,CAAC;AAKH;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAogBjE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,gCAEhC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;GAS3C,CAAC"}