// @vitest-environment jsdom // // The `list` key scope — what puts j/k, the arrows and Enter on the cheat sheet — is live only while a // registered list has an item to land on. An empty download queue, a list still loading or one that // failed mounts its container all the same, and the sheet listed the keys over nothing (deep-review // E11 round 2). Its own file: listNav keeps module state. import { useRef } from "react"; import { afterEach, describe, expect, it } from "vitest"; import { cleanup, render, screen, waitFor } from "@testing-library/react"; import { navItemAttrs, useListNav } from "./listNav"; import { useActiveScopes } from "./keymap"; afterEach(cleanup); function Scopes() { return {useActiveScopes().join(" ")}; } function Queue({ count }: { count: number }) { const ref = useRef(null); useListNav(ref, { enabled: true }); return (
{count === 0 ? (

Nothing queued

) : ( Array.from({ length: count }, (_, i) => (
item
)) )}
); } const page = (count: number) => ( <> ); const scopes = () => screen.getByTestId("scopes").textContent!.split(" "); describe("useListNav · the list key scope", () => { it("is not live over a list with nothing in it, and is while it has items", async () => { const { rerender } = render(page(0)); expect(scopes()).not.toContain("list"); rerender(page(2)); await waitFor(() => expect(scopes()).toContain("list")); rerender(page(0)); await waitFor(() => expect(scopes()).not.toContain("list")); }); });