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>
This commit is contained in:
86
app-expo/tests/core/settings/memoir-reading-settings.test.ts
Normal file
86
app-expo/tests/core/settings/memoir-reading-settings.test.ts
Normal file
@@ -0,0 +1,86 @@
|
||||
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);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user