mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-19 13:21:46 +00:00
test: expand frontend test suite to 82% coverage
Adds ~45 new and updated test files covering Admin, Collab, Dashboard, Map, Memories, PDF, Photos, Planner, Settings, Vacay, Weather components, pages, stores, and a WebSocket integration test.
This commit is contained in:
@@ -79,4 +79,110 @@ describe('settingsStore', () => {
|
||||
expect(state.isLoaded).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('FE-STORE-SETTINGS-006: setLanguageLocal updates state and localStorage', () => {
|
||||
it('sets language in state and localStorage without an API call', () => {
|
||||
useSettingsStore.getState().setLanguageLocal('ja');
|
||||
|
||||
const state = useSettingsStore.getState();
|
||||
expect(state.settings.language).toBe('ja');
|
||||
expect(localStorage.getItem('app_language')).toBe('ja');
|
||||
});
|
||||
});
|
||||
|
||||
describe('FE-STORE-SETTINGS-007: setLanguageLocal without prior localStorage value', () => {
|
||||
it('writes to localStorage even when no prior value exists', () => {
|
||||
localStorage.clear();
|
||||
|
||||
useSettingsStore.getState().setLanguageLocal('ko');
|
||||
|
||||
const state = useSettingsStore.getState();
|
||||
expect(state.settings.language).toBe('ko');
|
||||
expect(localStorage.getItem('app_language')).toBe('ko');
|
||||
});
|
||||
});
|
||||
|
||||
describe('FE-STORE-SETTINGS-008: updateSettings bulk update', () => {
|
||||
it('updates multiple settings keys and calls bulk API', async () => {
|
||||
await useSettingsStore.getState().updateSettings({ dark_mode: true, default_currency: 'JPY' });
|
||||
|
||||
const state = useSettingsStore.getState();
|
||||
expect(state.settings.dark_mode).toBe(true);
|
||||
expect(state.settings.default_currency).toBe('JPY');
|
||||
});
|
||||
});
|
||||
|
||||
describe('FE-STORE-SETTINGS-009: updateSettings optimistic update', () => {
|
||||
it('updates state synchronously before API resolves', async () => {
|
||||
const promise = useSettingsStore.getState().updateSettings({ dark_mode: true });
|
||||
|
||||
expect(useSettingsStore.getState().settings.dark_mode).toBe(true);
|
||||
|
||||
await promise;
|
||||
});
|
||||
});
|
||||
|
||||
describe('FE-STORE-SETTINGS-010: updateSettings API failure throws', () => {
|
||||
it('throws when bulk API returns 500', async () => {
|
||||
server.use(
|
||||
http.post('/api/settings/bulk', () =>
|
||||
HttpResponse.json({ error: 'Server error' }, { status: 500 })
|
||||
)
|
||||
);
|
||||
|
||||
await expect(
|
||||
useSettingsStore.getState().updateSettings({ dark_mode: true })
|
||||
).rejects.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
describe('FE-STORE-SETTINGS-011: updateSetting non-language key does not write to localStorage', () => {
|
||||
it('does not modify app_language in localStorage', async () => {
|
||||
const before = localStorage.getItem('app_language');
|
||||
|
||||
await useSettingsStore.getState().updateSetting('dark_mode', true);
|
||||
|
||||
expect(localStorage.getItem('app_language')).toBe(before);
|
||||
});
|
||||
});
|
||||
|
||||
describe('FE-STORE-SETTINGS-012: loadSettings merges server values with defaults', () => {
|
||||
it('preserves default keys not returned by server', async () => {
|
||||
server.use(
|
||||
http.get('/api/settings', () =>
|
||||
HttpResponse.json({ settings: { dark_mode: true } })
|
||||
)
|
||||
);
|
||||
|
||||
await useSettingsStore.getState().loadSettings();
|
||||
|
||||
const state = useSettingsStore.getState();
|
||||
expect(state.settings.dark_mode).toBe(true);
|
||||
expect(state.settings.default_currency).toBe('USD');
|
||||
});
|
||||
});
|
||||
|
||||
describe('FE-STORE-SETTINGS-013: updateSetting for time_format', () => {
|
||||
it('updates time_format in state', async () => {
|
||||
await useSettingsStore.getState().updateSetting('time_format', '24h');
|
||||
|
||||
expect(useSettingsStore.getState().settings.time_format).toBe('24h');
|
||||
});
|
||||
});
|
||||
|
||||
describe('FE-STORE-SETTINGS-014: updateSetting API failure leaves optimistic state', () => {
|
||||
it('throws on API failure but keeps the optimistic state', async () => {
|
||||
server.use(
|
||||
http.put('/api/settings', () =>
|
||||
HttpResponse.json({ error: 'Server error' }, { status: 500 })
|
||||
)
|
||||
);
|
||||
|
||||
await expect(
|
||||
useSettingsStore.getState().updateSetting('default_zoom', 15)
|
||||
).rejects.toThrow();
|
||||
|
||||
expect(useSettingsStore.getState().settings.default_zoom).toBe(15);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user