// @vitest-environment jsdom
import { act, render } from "@testing-library/react";
import { type FC, type PropsWithChildren, useState } from "react";
import { afterEach, describe, expect, it, vi } from "vitest";
import { useRemoteThreadListRuntime } from "@assistant-ui/core/react";
import { makeAdapter } from "./remote-thread-list-test-helpers";
import type { AssistantRuntime } from "@assistant-ui/core";
import { AssistantRuntimeProvider } from "../context";
import { useLocalRuntime } from "../legacy-runtime/runtime-cores/local/useLocalRuntime";
import { useAssistantRuntime } from "../legacy-runtime/hooks/AssistantContext";
import type { ChatModelAdapter, RemoteThreadListAdapter } from "../index";
const noOpAdapter: ChatModelAdapter = {
async *run() {},
};
const useTestRuntimeHook = () => useLocalRuntime(noOpAdapter);
const RuntimeProvider: FC<
PropsWithChildren<{ adapter: RemoteThreadListAdapter }>
> = ({ children, adapter }) => {
const runtime = useRemoteThreadListRuntime({
runtimeHook: useTestRuntimeHook,
adapter,
});
return (
{children}
);
};
const RuntimeCapture: FC<{
runtimeRef: { current: AssistantRuntime | null };
}> = ({ runtimeRef }) => {
const runtime = useAssistantRuntime();
runtimeRef.current = runtime;
return null;
};
afterEach(() => {
vi.useRealTimers();
});
describe("useRemoteThreadListRuntime with unstable_Provider", () => {
it("composer.setText works when unstable_Provider renders children unconditionally", () => {
const Provider: FC = ({ children }) => <>{children}>;
const adapter = makeAdapter({ unstable_Provider: Provider });
const runtimeRef: { current: AssistantRuntime | null } = { current: null };
render(
,
);
const runtime = runtimeRef.current;
expect(runtime).toBeTruthy();
expect(() => runtime!.thread.composer.setText("hello")).not.toThrow();
});
it("warns in dev when unstable_Provider defers children", () => {
vi.useFakeTimers();
const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
const Provider: FC = ({ children }) => {
const [ready] = useState(false);
if (!ready) return null;
return <>{children}>;
};
const adapter = makeAdapter({ unstable_Provider: Provider });
render(
,
);
act(() => {
vi.advanceTimersByTime(150);
});
expect(warn).toHaveBeenCalledWith(
expect.stringContaining("did not render its `children` synchronously"),
);
warn.mockRestore();
});
});