import { act, render, screen } from "@testing-library/react"; import { describe, expect, it, vi } from "vitest"; import { MarkdownText } from "@/components/MarkdownText"; const rendererSpy = vi.hoisted(() => vi.fn()); vi.mock("@/components/MarkdownTextRenderer", () => ({ default: ({ children, highlightCode, }: { children: string; highlightCode?: boolean; }) => { rendererSpy({ children, highlightCode }); return (
{children}
); }, })); describe("MarkdownText", () => { it("throttles streaming markdown commits and flushes before final highlighting", async () => { rendererSpy.mockClear(); vi.useFakeTimers(); try { const { rerender } = render( hello, ); await act(async () => { await Promise.resolve(); await Promise.resolve(); }); expect(screen.getByTestId("markdown-renderer")).toHaveTextContent("hello"); expect(screen.getByTestId("markdown-renderer")).toHaveAttribute( "data-highlight-code", "false", ); expect(rendererSpy).toHaveBeenCalledTimes(1); rerender(hello world); expect(screen.getByTestId("markdown-renderer")).toHaveTextContent("hello"); expect(rendererSpy).toHaveBeenCalledTimes(1); act(() => { vi.advanceTimersByTime(79); }); expect(screen.getByTestId("markdown-renderer")).toHaveTextContent("hello"); expect(rendererSpy).toHaveBeenCalledTimes(1); act(() => { vi.advanceTimersByTime(1); }); await act(async () => { await Promise.resolve(); }); expect(screen.getByTestId("markdown-renderer")).toHaveTextContent("hello world"); expect(rendererSpy).toHaveBeenCalledTimes(2); rerender(hello world!!!); expect(screen.getByTestId("markdown-renderer")).toHaveTextContent("hello world"); rerender(hello world!!!); expect(screen.getByTestId("markdown-renderer")).toHaveTextContent("hello world!!!"); expect(screen.getByTestId("markdown-renderer")).toHaveAttribute( "data-highlight-code", "true", ); } finally { vi.useRealTimers(); } }); });