fix: the diagnostics tab keeps its focus, its level and its consent
Deep-review round 1 of E22. - After a 429 the stream sent one POST per new event while a full batch waited; it now stays quiet for 15 s. Past the queue cap the oldest events go, as the comment always said, a refused batch included. - A batch refused after the level was lowered came back into the queue of a later consent in the same tab; each consent is its own session. - A `me` fetch that left before a level or preference change could put the old value back for up to a minute. `updateMeCache` writes the cache and cancels that fetch; usePref goes through it too. - The consent box's buttons and "revert now" took the focus with them to <body>; it returns to the level picker. Watched until the button is gone — in Chrome the saved level arrives in two renders, and a one-shot check spent itself on the first (jsdom never showed it). - The countdown line is no longer a live region re-read every minute. - "Saját napló" rows were keyed by index on a newest-first list, so every new event remounted every row and dropped the focus off a row button.
This commit is contained in:
@@ -63,6 +63,7 @@ function mount(me: Partial<Me>) {
|
||||
<DiagnosticsSettings />
|
||||
</QueryClientProvider>,
|
||||
);
|
||||
return qc;
|
||||
}
|
||||
|
||||
const levelButton = (name: string) =>
|
||||
@@ -113,6 +114,58 @@ describe("DiagnosticsSettings", () => {
|
||||
await waitFor(() => expect(setLevel).toHaveBeenCalledWith("INFO"));
|
||||
});
|
||||
|
||||
it("the focus goes back to the level picker when the box it was in goes away", async () => {
|
||||
mount({});
|
||||
fireEvent.click(levelButton("settings.diagnostics.levels.DEBUG"));
|
||||
const cancel = screen.getByRole("button", { name: "settings.diagnostics.consent.cancel" });
|
||||
cancel.focus();
|
||||
fireEvent.click(cancel);
|
||||
expect(document.activeElement).toBe(levelButton("settings.diagnostics.levels.INFO"));
|
||||
|
||||
fireEvent.click(levelButton("settings.diagnostics.levels.TRACE"));
|
||||
const confirm = screen.getByTestId("diagnostics-consent-confirm");
|
||||
confirm.focus();
|
||||
fireEvent.click(confirm);
|
||||
await waitFor(() => expect(screen.getByTestId("diagnostics-status")).toBeTruthy());
|
||||
expect(document.activeElement).toBe(levelButton("settings.diagnostics.levels.TRACE"));
|
||||
|
||||
const revert = screen.getByRole("button", { name: "settings.diagnostics.revert" });
|
||||
revert.focus();
|
||||
fireEvent.click(revert);
|
||||
await waitFor(() => expect(screen.queryByTestId("diagnostics-status")).toBeNull());
|
||||
expect(document.activeElement).toBe(levelButton("settings.diagnostics.levels.INFO"));
|
||||
});
|
||||
|
||||
it("the ticking status line is not a live region", async () => {
|
||||
const until = new Date(Date.now() + 3_600_000).toISOString();
|
||||
mount({ diagnostics: { level: "DEBUG", until, retention_days: 7 } });
|
||||
const status = screen.getByTestId("diagnostics-status");
|
||||
expect(status.closest('[role="status"], [aria-live]')).toBeNull();
|
||||
});
|
||||
|
||||
it("a `me` fetch that left before the change cannot put the old level back", async () => {
|
||||
const qc = mount({});
|
||||
let answerStale: (me: unknown) => void = () => {};
|
||||
const stale = qc
|
||||
.fetchQuery({
|
||||
queryKey: qk.me(),
|
||||
queryFn: () => new Promise((resolve) => (answerStale = resolve)),
|
||||
})
|
||||
.catch(() => null);
|
||||
fireEvent.click(levelButton("settings.diagnostics.levels.TRACE"));
|
||||
fireEvent.click(screen.getByTestId("diagnostics-consent-confirm"));
|
||||
await waitFor(() => expect(screen.getByTestId("diagnostics-status")).toBeTruthy());
|
||||
answerStale({
|
||||
id: 1,
|
||||
is_demo: false,
|
||||
preferences: {},
|
||||
diagnostics: { level: "INFO", until: null, retention_days: 7 },
|
||||
});
|
||||
await stale;
|
||||
expect(qc.getQueryData<Me>(qk.me())?.diagnostics.level).toBe("TRACE");
|
||||
expect(screen.getByTestId("diagnostics-status")).toBeTruthy();
|
||||
});
|
||||
|
||||
it("a lapsed level shows as the base level", () => {
|
||||
const until = new Date(Date.now() - 60_000).toISOString();
|
||||
mount({ diagnostics: { level: "TRACE", until, retention_days: 7 } });
|
||||
|
||||
Reference in New Issue
Block a user