fix(KB-309): add missing notification settings to form state

- Add ntfyEnabled and ntfyTopic to initial form state in SettingsModal
- Add comprehensive tests for notification settings persistence
- Ensure notification values are properly initialized from settings
This commit is contained in:
gsxdsm
2026-03-31 11:00:59 -07:00
parent be63047d26
commit f3e90ebfca
2 changed files with 65 additions and 1 deletions

View File

@@ -1044,6 +1044,70 @@ describe("SettingsModal", () => {
expect(screen.getByLabelText("ntfy Topic")).toBeTruthy();
});
it("re-opening modal shows previously saved notification settings", async () => {
// First render with ntfy enabled
(fetchSettings as ReturnType<typeof vi.fn>).mockResolvedValueOnce({
...defaultSettings,
ntfyEnabled: true,
ntfyTopic: "saved-topic",
});
const { unmount } = render(<SettingsModal onClose={onClose} addToast={addToast} />);
await waitFor(() => expect(fetchSettings).toHaveBeenCalled());
fireEvent.click(screen.getByText("Notifications"));
const checkbox = screen.getByLabelText("Enable ntfy.sh notifications") as HTMLInputElement;
expect(checkbox.checked).toBe(true);
const input = screen.getByLabelText("ntfy Topic") as HTMLInputElement;
expect(input.value).toBe("saved-topic");
unmount();
vi.clearAllMocks();
// Re-open modal - should still show saved settings
(fetchSettings as ReturnType<typeof vi.fn>).mockResolvedValueOnce({
...defaultSettings,
ntfyEnabled: true,
ntfyTopic: "saved-topic",
});
render(<SettingsModal onClose={onClose} addToast={addToast} />);
await waitFor(() => expect(fetchSettings).toHaveBeenCalled());
fireEvent.click(screen.getByText("Notifications"));
const newCheckbox = screen.getByLabelText("Enable ntfy.sh notifications") as HTMLInputElement;
expect(newCheckbox.checked).toBe(true);
const newInput = screen.getByLabelText("ntfy Topic") as HTMLInputElement;
expect(newInput.value).toBe("saved-topic");
});
it("disabling ntfy persists correctly when saving", async () => {
// Start with ntfy enabled
(fetchSettings as ReturnType<typeof vi.fn>).mockResolvedValueOnce({
...defaultSettings,
ntfyEnabled: true,
ntfyTopic: "my-topic",
});
render(<SettingsModal onClose={onClose} addToast={addToast} />);
await waitFor(() => expect(fetchSettings).toHaveBeenCalled());
fireEvent.click(screen.getByText("Notifications"));
const checkbox = screen.getByLabelText("Enable ntfy.sh notifications") as HTMLInputElement;
expect(checkbox.checked).toBe(true);
// Disable ntfy
fireEvent.click(checkbox);
expect(checkbox.checked).toBe(false);
fireEvent.click(screen.getByText("Save"));
// ntfyEnabled is a global setting
await waitFor(() => expect(updateGlobalSettings).toHaveBeenCalledTimes(1));
const payload = (updateGlobalSettings as ReturnType<typeof vi.fn>).mock.calls[0][0];
expect(payload.ntfyEnabled).toBe(false);
});
// Model filter tests with CustomModelDropdown
it("renders filter input in Model section dropdown", async () => {
const user = userEvent.setup();