test(web): cover the settings toast's reload-failure title
Copilot review r4. The r3 title branch was the one modified behavior with no test of its own — the existing ServerListReloadError cases cover the pagination, add, and rename paths only, so a regression back to "Failed to save settings" would have gone green. `useSettingsDraft` is mocked in this suite, so the test invokes the `onError` App handed it and asserts both titles: the reload-failure one, and that a genuine write failure still reads as a failure. Forcing the branch off fails it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UL9retfvAXRgvi6EWk4SY4 Signed-off-by: cliffhall <cliff@futurescale.com>
This commit is contained in:
parent
b49d4f20f5
commit
6c1cc6c1ae
1 changed files with 33 additions and 0 deletions
|
|
@ -2581,6 +2581,39 @@ describe("App config submit with a failed list reload (#1914)", () => {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("labels a settings save whose reload failed as saved, not failed (#1914)", () => {
|
||||||
|
// The settings draft debounces and flushes on close, so this toast is the
|
||||||
|
// user's only signal — a flush that rejects usually does so after the
|
||||||
|
// modal is gone. `useSettingsDraft` is mocked here, so the App's `onError`
|
||||||
|
// is invoked directly with the options it was handed.
|
||||||
|
renderWithMantine(<App />);
|
||||||
|
const onError = vi.mocked(useSettingsDraft).mock.calls.at(-1)?.[0].onError;
|
||||||
|
expect(onError).toBeDefined();
|
||||||
|
|
||||||
|
act(() => {
|
||||||
|
onError!(
|
||||||
|
"A",
|
||||||
|
new ServerListReloadError(
|
||||||
|
"The server was saved, but the server list could not be reloaded: disk full",
|
||||||
|
),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
expect(notificationsMock.show).toHaveBeenCalledWith(
|
||||||
|
expect.objectContaining({
|
||||||
|
title: 'Saved settings for "A", but the server list did not reload',
|
||||||
|
message: expect.stringContaining("disk full"),
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
|
// A genuinely failed write still reads as a failure.
|
||||||
|
act(() => {
|
||||||
|
onError!("A", new Error("disk full"));
|
||||||
|
});
|
||||||
|
expect(notificationsMock.show).toHaveBeenCalledWith(
|
||||||
|
expect.objectContaining({ title: 'Failed to save settings for "A"' }),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
it("keeps a successful add in the highlight batch when the reload failed (#1914)", async () => {
|
it("keeps a successful add in the highlight batch when the reload failed (#1914)", async () => {
|
||||||
// `addServerHighlighted` marked the new id only after `addServer`
|
// `addServerHighlighted` marked the new id only after `addServer`
|
||||||
// resolved. The row is on disk either way, so on a reload failure it has
|
// resolved. The row is on disk either way, so on a reload failure it has
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue