mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-11-13 07:40:59 +00:00
a7bd26722a
Saving one preference with the error toast on failure lives in one useSettingSaver hook; the desktop tab drops its eleven inline copies of it.
41 lines
1.8 KiB
TypeScript
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');
|
|
});
|
|
});
|