import { act, render, renderHook, waitFor } from "@testing-library/react"; import { MeshClient } from "@meshtastic/sdk"; import { createFakeTransport } from "@meshtastic/sdk/testing"; import { ChannelNumber } from "@meshtastic/sdk"; import { describe, expect, it } from "vitest"; import { MeshProvider, useChat, useMeshDevice } from "../mod.ts"; function setup() { const handle = createFakeTransport(); const client = new MeshClient({ transport: handle.transport }); const wrapper = ({ children }: { children: React.ReactNode }) => ( {children} ); return { client, handle, wrapper }; } describe("sdk-react hooks", () => { it("useMeshDevice re-renders on myNodeInfo", async () => { const { handle, wrapper } = setup(); const { result } = renderHook(() => useMeshDevice(), { wrapper }); expect(result.current.myNodeNum).toBeUndefined(); await act(async () => { handle.respond.withMyNodeInfo({ myNodeNum: 99 }); await new Promise((r) => setTimeout(r, 10)); }); await waitFor(() => { expect(result.current.myNodeNum).toBe(99); }); }); it("useChat surfaces inbound messages", async () => { const { handle, wrapper } = setup(); const { result } = renderHook(() => useChat(ChannelNumber.Primary), { wrapper, }); expect(result.current.messages).toEqual([]); // Exhaustive integration coverage is in packages/sdk; this test ensures // the hook wiring re-renders on a signal change. void handle; void render; }); });