|
1 | 1 | import { describe, expect, it, vi } from "vite-plus/test"; |
2 | 2 |
|
3 | | -import { render } from "../../test/render"; |
4 | | -import { useSnoozeWakeClock } from "./Sidebar.logic"; |
| 3 | +import { act, fakeTimers, render } from "../../test/render"; |
| 4 | +import { useSnoozeWakeClock, useThreadJumpHintsVisible } from "./Sidebar.logic"; |
5 | 5 |
|
6 | 6 | const MOUNTED_AT_MS = Date.parse("2026-10-24T08:00:00.000Z"); |
7 | 7 |
|
@@ -31,3 +31,29 @@ describe("useSnoozeWakeClock", () => { |
31 | 31 | await expect.element(screen.getByRole("status")).toHaveTextContent(String(lastWakeMs)); |
32 | 32 | }); |
33 | 33 | }); |
| 34 | + |
| 35 | +function JumpHints(props: { readonly held: boolean }) { |
| 36 | + return <output>{useThreadJumpHintsVisible(props.held) ? "shown" : "hidden"}</output>; |
| 37 | +} |
| 38 | + |
| 39 | +describe("useThreadJumpHintsVisible", () => { |
| 40 | + it("waits for the delay again on a second hold", async () => { |
| 41 | + // The first render reads the clock. |
| 42 | + using _timers = fakeTimers({ now: 0 }); |
| 43 | + await using screen = await render(<JumpHints held />, { |
| 44 | + // A bare hook host; nothing here links or navigates. |
| 45 | + router: false, |
| 46 | + }); |
| 47 | + await act(() => vi.advanceTimersByTime(1_000)); |
| 48 | + await expect.element(screen.getByRole("status")).toHaveTextContent("shown"); |
| 49 | + |
| 50 | + await screen.rerender(<JumpHints held={false} />); |
| 51 | + await expect.element(screen.getByRole("status")).toHaveTextContent("hidden"); |
| 52 | + await act(() => vi.advanceTimersByTime(1_000)); |
| 53 | + |
| 54 | + await screen.rerender(<JumpHints held />); |
| 55 | + await expect.element(screen.getByRole("status")).toHaveTextContent("hidden"); |
| 56 | + await act(() => vi.advanceTimersByTime(1_000)); |
| 57 | + await expect.element(screen.getByRole("status")).toHaveTextContent("shown"); |
| 58 | + }); |
| 59 | +}); |
0 commit comments