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>
87 lines
2.4 KiB
TypeScript
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);
|
|
});
|
|
});
|