fix(review round 1): daemon PAT-header auth, job pruning, session-split batches, streaming tars, seed cleanup, ping/pong, byte caps, branch switch, slug --, ctx cancel, Init:true, pagination, latest/before events; web newest-window history + load-older, offline busy gate, staleness guards, memo store, auth probe, scroll key, focus-visible, draft restore, poll dedup; 106+181 tests, coverage 96.2%/95.1%+
This commit is contained in:
@@ -61,20 +61,22 @@ describe("SessionsView", () => {
|
||||
it("empty state message (after load window)", () => {
|
||||
vi.useFakeTimers();
|
||||
renderView({ sessions: [] });
|
||||
act(() => { vi.advanceTimersByTime(700); });
|
||||
act(() => {
|
||||
vi.advanceTimersByTime(700);
|
||||
});
|
||||
expect(screen.getByText(/No active sessions/i)).toBeInTheDocument();
|
||||
vi.useRealTimers();
|
||||
});
|
||||
|
||||
it("skeleton while first load pending", () => {
|
||||
renderView({ sessions: [] });
|
||||
expect(screen.getByRole("heading", { name: "Active sessions" })).toBeInTheDocument();
|
||||
expect(
|
||||
screen.getByRole("heading", { name: "Active sessions" }),
|
||||
).toBeInTheDocument();
|
||||
const skel = document.querySelector(".skeleton");
|
||||
expect(skel).not.toBeNull();
|
||||
});
|
||||
|
||||
|
||||
|
||||
it("renders cards sorted by last activity with fallbacks", () => {
|
||||
renderView({
|
||||
sessions: [
|
||||
@@ -181,12 +183,54 @@ describe("SessionsView", () => {
|
||||
</Routes>
|
||||
</MemoryRouter>,
|
||||
);
|
||||
fireEvent.keyDown(screen.getByRole("button", { name: "Open session s8" }), {
|
||||
key: " ",
|
||||
});
|
||||
const ev = fireEvent.keyDown(
|
||||
screen.getByRole("button", { name: "Open session s8" }),
|
||||
{
|
||||
key: " ",
|
||||
},
|
||||
);
|
||||
expect(ev).toBe(false); // preventDefault consumed the default action
|
||||
expect(probe).toHaveBeenCalledWith("/s/s8");
|
||||
});
|
||||
|
||||
it("Space and Enter keydown are default-prevented so the page does not scroll (S8)", () => {
|
||||
const probe = vi.fn();
|
||||
const renderKb = (): HTMLElement => {
|
||||
render(
|
||||
<MemoryRouter initialEntries={["/"]}>
|
||||
<Routes>
|
||||
<Route
|
||||
path="/"
|
||||
element={
|
||||
<SessionsView
|
||||
sessions={[session({ id: "kb2" })]}
|
||||
onChanged={() => undefined}
|
||||
pushToast={() => undefined}
|
||||
/>
|
||||
}
|
||||
/>
|
||||
<Route path="/s/:id" element={<Probe onVisit={probe} />} />
|
||||
</Routes>
|
||||
</MemoryRouter>,
|
||||
);
|
||||
return screen.getByRole("button", { name: "Open session kb2" });
|
||||
};
|
||||
// document-level bubble listener observes the event AFTER React's
|
||||
// delegated handler, so defaultPrevented reflects the component's call
|
||||
const seen: boolean[] = [];
|
||||
const rec = (e: Event): void => {
|
||||
seen.push(e.defaultPrevented);
|
||||
};
|
||||
document.addEventListener("keydown", rec);
|
||||
// Space: navigation unmounts the card, so each key gets a fresh render
|
||||
fireEvent.keyDown(renderKb(), { key: " " });
|
||||
fireEvent.keyDown(renderKb(), { key: "Enter" });
|
||||
fireEvent.keyDown(renderKb(), { key: "Tab" });
|
||||
document.removeEventListener("keydown", rec);
|
||||
expect(seen).toEqual([true, true, false]);
|
||||
expect(probe).toHaveBeenCalledWith("/s/kb2");
|
||||
});
|
||||
|
||||
it("stop with unnamed session toasts the id", async () => {
|
||||
seedSettings();
|
||||
mockFetchJson(() => ({ ok: true }));
|
||||
|
||||
Reference in New Issue
Block a user