Files
Psychotoxical-psysonic/src/store/authStoreRehydrate.test.ts
T
Frank Stellmacher ccf4d5d8cb feat(queue): persist queue header duration mode (#724)
* feat(queue): persist header duration mode (#625)

The queue header chip cycles total / remaining / ETA, but the choice
lived in QueuePanel `useState` and reset to 'total' on every app launch.
Move it into `authStore` (persisted under `psysonic-auth`) so the chosen
mode survives restarts like other UI preferences.

- `DurationMode` consolidated in `authStoreTypes` (re-exported from
  `queuePanelHelpers` so existing component imports stay valid).
- New `queueDurationDisplayMode` field + `setQueueDurationDisplayMode`
  setter wired through `createUiAppearanceActions`, default `'total'`.
- `computeAuthStoreRehydration` validates the persisted value against
  the three known modes (pattern matches the existing seekbarStyle
  block) — garbage, null, undefined, or a missing key map back to
  `'total'` so the chip never receives an unknown mode.
- `QueuePanel` reads / writes via `useAuthStore` selectors instead of
  local `useState`.
- Tests: trivial-setter coverage in `authStore.settings.test.ts` and a
  new `authStoreRehydrate.test.ts` covering corrupt, missing, and
  valid rehydration cases.

Reuses kveld9's design from PR #625; not merged because the 1.46
refactor split locales and reshuffled queue-helper exports. Credited
via Co-Authored-By trailer.

Co-Authored-By: Kveld. <kveld912@proton.me>

* docs(changelog): queue header duration mode persistence (#724)

Adds the CHANGELOG entry + kveld9 credits line referencing the real PR
numbers (no #TBD placeholder) — feedback.md §2.7+§2.8 workflow: commit
docs as a second push onto the open PR.

---------

Co-authored-by: Kveld. <kveld912@proton.me>
2026-05-15 19:14:06 +02:00

43 lines
1.4 KiB
TypeScript

import { beforeEach, describe, expect, it } from 'vitest';
import { computeAuthStoreRehydration } from './authStoreRehydrate';
import { useAuthStore } from './authStore';
import type { AuthState } from './authStoreTypes';
import { resetAuthStore } from '@/test/helpers/storeReset';
describe('computeAuthStoreRehydration — queueDurationDisplayMode', () => {
beforeEach(() => {
resetAuthStore();
});
it.each(['invalid_mode', 123, null, undefined] as const)(
'maps corrupted value %j back to "total"',
(corrupt) => {
const base = useAuthStore.getState();
const patch = computeAuthStoreRehydration({
...base,
queueDurationDisplayMode: corrupt as never,
});
expect(patch.queueDurationDisplayMode).toBe('total');
},
);
it('maps a rehydrated payload without the key back to "total"', () => {
const base = useAuthStore.getState();
const { queueDurationDisplayMode: _drop, ...without } = base;
const patch = computeAuthStoreRehydration(without as AuthState);
expect(patch.queueDurationDisplayMode).toBe('total');
});
it.each(['total', 'remaining', 'eta'] as const)(
'does not overwrite a valid mode (%s)',
(mode) => {
const base = useAuthStore.getState();
const patch = computeAuthStoreRehydration({
...base,
queueDurationDisplayMode: mode,
});
expect(patch.queueDurationDisplayMode).toBeUndefined();
},
);
});