Files
life-echo/app-expo/tests/core/settings/memoir-reading-settings.test.ts
Kevin 6f41574bda feat(memoir): persist chapter reading prefs globally
Share font size, font family, and background across all memoir chapters via MemoirReadingSettingsProvider and SecureStore (same app-settings pattern). Add parse/merge helpers and unit tests.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-15 17:23:02 +08:00

87 lines
2.4 KiB
TypeScript

import {
DEFAULT_MEMOIR_READING_PREFERENCES,
mergeMemoirReadingPreferences,
parseMemoirReadingPreferences,
} from '@/core/settings/memoir-reading-settings';
describe('parseMemoirReadingPreferences', () => {
it('returns defaults for null and empty', () => {
expect(parseMemoirReadingPreferences(null)).toEqual(
DEFAULT_MEMOIR_READING_PREFERENCES,
);
expect(parseMemoirReadingPreferences('')).toEqual(
DEFAULT_MEMOIR_READING_PREFERENCES,
);
expect(parseMemoirReadingPreferences(' ')).toEqual(
DEFAULT_MEMOIR_READING_PREFERENCES,
);
});
it('returns defaults for invalid JSON', () => {
expect(parseMemoirReadingPreferences('not json')).toEqual(
DEFAULT_MEMOIR_READING_PREFERENCES,
);
});
it('returns defaults for non-object JSON', () => {
expect(parseMemoirReadingPreferences('[]')).toEqual(
DEFAULT_MEMOIR_READING_PREFERENCES,
);
expect(parseMemoirReadingPreferences('"x"')).toEqual(
DEFAULT_MEMOIR_READING_PREFERENCES,
);
});
it('fills missing or invalid fields from defaults', () => {
expect(parseMemoirReadingPreferences('{}')).toEqual(
DEFAULT_MEMOIR_READING_PREFERENCES,
);
expect(
parseMemoirReadingPreferences(
JSON.stringify({
fontSize: 'huge',
fontFamily: 'comic',
background: 'black',
}),
),
).toEqual(DEFAULT_MEMOIR_READING_PREFERENCES);
});
it('accepts valid partial object', () => {
expect(
parseMemoirReadingPreferences(
JSON.stringify({ fontSize: 'large' }),
),
).toEqual(
mergeMemoirReadingPreferences(DEFAULT_MEMOIR_READING_PREFERENCES, {
fontSize: 'large',
}),
);
expect(
parseMemoirReadingPreferences(
JSON.stringify({ background: 'sepia', fontFamily: 'sans' }),
),
).toEqual({
...DEFAULT_MEMOIR_READING_PREFERENCES,
background: 'sepia',
fontFamily: 'sans',
});
});
});
describe('mergeMemoirReadingPreferences', () => {
it('applies only defined patch keys', () => {
const base = {
fontSize: 'small' as const,
fontFamily: 'sans' as const,
background: 'sepia' as const,
};
expect(mergeMemoirReadingPreferences(base, { fontSize: 'large' })).toEqual({
fontSize: 'large',
fontFamily: 'sans',
background: 'sepia',
});
expect(mergeMemoirReadingPreferences(base, {})).toEqual(base);
});
});