// @vitest-environment jsdom
import { render, screen, waitFor } from "@testing-library/react";
import type { FC, PropsWithChildren } from "react";
import { describe, expect, it } from "vitest";
import { AssistantRuntimeProvider } from "../context";
import * as MessagePartPrimitive from "../primitives/messagePart";
import * as MessagePrimitive from "../primitives/message";
import * as ThreadPrimitive from "../primitives/thread";
import { useLocalRuntime } from "../legacy-runtime/runtime-cores/local/useLocalRuntime";
import type { ChatModelAdapter, ThreadMessageLike } from "../index";
const noOpAdapter: ChatModelAdapter = {
async *run() {},
};
const initialMessages: ThreadMessageLike[] = [
{
role: "assistant",
content: [],
status: { type: "running" },
},
];
const completeInitialMessages: ThreadMessageLike[] = [
{
role: "assistant",
content: [],
status: { type: "complete", reason: "stop" },
},
];
const RunningText: FC = () => {
return (
dot
);
};
const ComponentsMessage: FC = () => {
return ;
};
const ChildrenMessage: FC = () => {
return (
{({ part }) => {
if (part.type === "text") return ;
return null;
}}
);
};
const RuntimeProvider: FC<
PropsWithChildren<{ messages?: ThreadMessageLike[] }>
> = ({ children, messages = initialMessages }) => {
const runtime = useLocalRuntime(noOpAdapter, {
initialMessages: messages,
});
return (
{children}
);
};
const renderThread = (MessageComponent: FC, messages?: ThreadMessageLike[]) => {
render(
,
);
};
describe("MessagePrimitive.Parts loading state", () => {
it("renders the loading indicator for the components API when assistant parts are empty", async () => {
renderThread(ComponentsMessage);
await waitFor(() => {
expect(screen.getByTestId("loading-dot")).toBeTruthy();
});
});
it("renders the loading indicator for the children API when assistant parts are empty", async () => {
renderThread(ChildrenMessage);
await waitFor(() => {
expect(screen.getByTestId("loading-dot")).toBeTruthy();
});
});
it("does not render the loading indicator when assistant parts are empty but the message is complete", async () => {
renderThread(ChildrenMessage, completeInitialMessages);
await waitFor(() => {
expect(screen.queryByTestId("loading-dot")).toBeNull();
});
});
});