test(nav): pin the restore's last look and the clearing of the name it looks for

This commit is contained in:
2026-10-29 01:31:41 +01:00
parent b22e903174
commit 91256b10b0
@@ -13,6 +13,7 @@ import {
NAV_REVEAL_EVENT,
navItemAttrs,
navPosition,
pendingNavName,
restoreNavPosition,
useListNav,
} from "./listNav";
@@ -150,4 +151,56 @@ describe("Back to an item that moved to another list", () => {
document.querySelector("main")!.firstElementChild,
);
});
it("looks in another list at its last look when its own never renders the place it counts", async () => {
vi.useFakeTimers();
try {
const { unmount } = render(<Page lists={[["older", "subscribed"], ["subscribed-2"]]} />);
button("subscribed").focus();
const pos = navPosition()!;
unmount();
// Its own list still counts two, and keeps showing one; the item is in the next list.
render(<Page lists={[["older"], ["subscribed"]]} counts={[2]} />);
const cancel = restoreNavPosition(pos);
await act(async () => vi.advanceTimersByTimeAsync(1000));
expect(focused()).toBeUndefined(); // still giving its own list the chance
await act(async () => vi.advanceTimersByTimeAsync(1100));
expect(focused()).toBe("subscribed");
cancel();
} finally {
vi.useRealTimers();
}
});
});
describe("the name a Back is still looking for", () => {
const pos = { list: 0, lists: 1, index: 0, name: "subscribed" };
it("is there while it looks, and gone once cancelled", () => {
const cancel = restoreNavPosition(pos);
expect(pendingNavName()).toBe("subscribed");
cancel();
expect(pendingNavName()).toBeNull();
});
it("is gone once the focus went somewhere else", async () => {
render(<button>elsewhere</button>);
const cancel = restoreNavPosition(pos);
button("elsewhere").focus();
await wait(80);
expect(pendingNavName()).toBeNull();
cancel();
});
it("is gone once it gave up", async () => {
vi.useFakeTimers();
try {
const cancel = restoreNavPosition(pos);
await vi.advanceTimersByTimeAsync(2100);
expect(pendingNavName()).toBeNull();
cancel();
} finally {
vi.useRealTimers();
}
});
});