Files
markdown-converter/tests/unit/main/updater/__mirror.test.js
T
amitwh e25a5e1d75 fix(migration): normalize legacy theme values under v5 marker
Two related bugs surfaced during end-to-end verification:

1. The 'isAlreadyV5' short-circuit in both the main-side and renderer-side
   v4-to-v5 transforms returned the persisted object as-is when a
   migration.version=5 marker was present. A previously-shipped v4 build
   had written theme: 'ayu-light' (and similar) under the v5 marker;
   the transform trusted the marker and passed the invalid theme through,
   which then failed the renderer's zod schema on every launch and
   reset user settings to defaults.

   Fix: in both transforms, when isAlreadyV5 matches, normalize theme
   against the v5 enum (light/dark/system) and validate the full result
   with the v5 schema before returning. Out-of-range values are replaced
   with the v5 default ('system').

2. The renderer's settings-store onRehydrateStorage callback called
   useSettingsStore.setState() to reset the store on validation failure.
   At that moment the store is still being constructed, and setState
   could hit a TDZ ReferenceError (the one we already wrapped in a
   try/catch in v5.0.0, which only hid the symptom).

   Fix: return the normalized state object from onRehydrateStorage
   instead. Zustand's persist middleware applies the returned value
   *after* construction completes, so there is no TDZ.

Tests: 334 vitest + 208 jest = 542 passing.
E2E: 12/12 verify-features.mjs steps green; no console errors.

Amit Haridas
2026-06-08 07:45:06 +05:30

20 lines
938 B
JavaScript

// Regression test for the v5 migration normalizer: previously, files with
// migration.version:5 but a legacy theme value (e.g. 'ayu-light') were
// short-circuited and returned as-is, breaking the renderer schema.
const { migrateV4ToV5 } = require('../../../../src/main/updater/migration-transform');
describe('migrateV4ToV5 (main mirror) — regression: legacy theme under v5 marker', () => {
test('normalizes theme: ayu-light under v5 marker to a v5 enum value', () => {
const out = migrateV4ToV5({ 'migration.version': 5, theme: 'ayu-light' });
expect(['light', 'dark', 'system']).toContain(out.theme);
});
test('preserves a valid v5 theme', () => {
const out = migrateV4ToV5({ 'migration.version': 5, theme: 'dark' });
expect(out.theme).toBe('dark');
});
test('still maps v4 theme: auto to system', () => {
const out = migrateV4ToV5({ theme: 'auto' });
expect(out.theme).toBe('system');
});
});