import { act, render, screen } from "@testing-library/react"; import type { JSX } from "react"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { AgentConversationClockProvider, useAgentConversationMinuteNowUnixMs } from "./AgentConversationClock"; import { useElapsedSeconds } from "./useElapsedSeconds"; describe("AgentConversationClock", () => { beforeEach(() => { vi.useFakeTimers(); vi.setSystemTime(1_000); }); afterEach(() => { vi.useRealTimers(); }); it("shares one interval and pauses it while the AgentGUI is hidden", () => { const setInterval = vi.spyOn(window, "setInterval"); const clearInterval = vi.spyOn(window, "clearInterval"); const { rerender } = render(); expect(screen.getByTestId("elapsed-a")).toHaveTextContent("0"); expect(screen.getByTestId("elapsed-b")).toHaveTextContent("0"); expect(setInterval).toHaveBeenCalledTimes(1); act(() => { vi.advanceTimersByTime(2_000); }); expect(screen.getByTestId("elapsed-a")).toHaveTextContent("2"); expect(screen.getByTestId("elapsed-b")).toHaveTextContent("2"); rerender(); expect(clearInterval).toHaveBeenCalledTimes(1); expect(vi.getTimerCount()).toBe(0); act(() => { vi.advanceTimersByTime(5_000); }); expect(vi.getTimerCount()).toBe(0); rerender(); expect(screen.getByTestId("elapsed-a")).toHaveTextContent("7"); expect(screen.getByTestId("elapsed-b")).toHaveTextContent("7"); expect(setInterval).toHaveBeenCalledTimes(2); }); it("pauses minute updates while the AgentGUI is hidden", () => { const setInterval = vi.spyOn(window, "setInterval"); const clearInterval = vi.spyOn(window, "clearInterval"); const { rerender } = render(); expect(screen.getByTestId("minute-now")).toHaveTextContent("1000"); expect(setInterval).toHaveBeenCalledTimes(1); act(() => { vi.advanceTimersByTime(60_000); }); expect(screen.getByTestId("minute-now")).toHaveTextContent("61000"); rerender(); expect(clearInterval).toHaveBeenCalledTimes(1); expect(vi.getTimerCount()).toBe(0); act(() => { vi.advanceTimersByTime(120_000); }); expect(screen.getByTestId("minute-now")).toHaveTextContent("61000"); rerender(); expect(screen.getByTestId("minute-now")).toHaveTextContent("181000"); expect(setInterval).toHaveBeenCalledTimes(2); }); }); function ElapsedPair({ isVisible }: { isVisible: boolean }): JSX.Element { return ( ); } function ElapsedValue({ testId }: { testId: string }): JSX.Element { const elapsedSeconds = useElapsedSeconds(1_000); return {elapsedSeconds}; } function MinuteValue({ isVisible }: { isVisible: boolean }): JSX.Element { return ( ); } function MinuteNow(): JSX.Element { const nowUnixMs = useAgentConversationMinuteNowUnixMs(); return {nowUnixMs}; }