Files
TREK/client/src/components/Settings/useSettingSaver.test.ts
T
Maurice a7bd26722a refactor(settings): share the general settings save between desktop and phone
Saving one preference with the error toast on failure lives in one useSettingSaver hook; the desktop tab drops its eleven inline copies of it.
2026-10-09 15:19:48 +02:00

41 lines
1.8 KiB
TypeScript

// FE-COMP-SETTINGSAVER-001 onwards: the one preference save behind both general settings shells.
import { act, renderHook } from '@testing-library/react';
import { buildSettings } from '../../../tests/helpers/factories';
import { resetAllStores, seedStore } from '../../../tests/helpers/store';
import { useSettingsStore } from '../../store/settingsStore';
import { useSettingSaver } from './useSettingSaver';
const toast = vi.hoisted(() => ({ success: vi.fn(), error: vi.fn() }));
vi.mock('../shared/Toast', () => ({ useToast: () => toast }));
vi.mock('../../i18n', () => ({ useTranslation: () => ({ t: (k: string) => k }) }));
const updateSetting = vi.fn();
beforeEach(() => {
resetAllStores();
toast.error.mockReset();
updateSetting.mockReset().mockResolvedValue(undefined);
seedStore(useSettingsStore, { settings: buildSettings({ time_format: '12h' }), updateSetting });
});
describe('useSettingSaver', () => {
it('FE-COMP-SETTINGSAVER-001: hands out the current settings and saves one key', async () => {
const { result } = renderHook(() => useSettingSaver());
expect(result.current.settings.time_format).toBe('12h');
await act(() => result.current.save('time_format', '24h'));
expect(updateSetting).toHaveBeenCalledWith('time_format', '24h');
expect(toast.error).not.toHaveBeenCalled();
});
it('FE-COMP-SETTINGSAVER-002: a failure shows its message, or the generic one', async () => {
const { result } = renderHook(() => useSettingSaver());
updateSetting.mockRejectedValueOnce(new Error('nope'));
await act(() => result.current.save('language', 'de'));
expect(toast.error).toHaveBeenLastCalledWith('nope');
updateSetting.mockRejectedValueOnce('x');
await act(() => result.current.save('language', 'de'));
expect(toast.error).toHaveBeenLastCalledWith('common.error');
});
});