test(stores): cover settings merge/clamp + notification sanitizer (29→42 tests)

Extract two pure helpers so they're testable without zustand/expo:
- settings-merge.ts: clampPageSize + forward-compatible mergeStoredSettings (the
  upgrade path where stored data predates a new notification category must yield
  the default, not undefined). stores/settings.ts now delegates.
- notify-format.ts: sanitizeBody (strip C0/DEL control chars, trim, cap at 200)
  used for server-supplied notification text. stores/events.ts now imports it.
Behavior unchanged; typecheck clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
engineer
2026-06-03 14:01:29 -07:00
parent dd55ca471d
commit 48bc314dfc
6 changed files with 137 additions and 8 deletions

14
src/lib/notify-format.ts Normal file
View File

@@ -0,0 +1,14 @@
// Pure formatting for notification bodies, extracted from stores/events.ts so the
// sanitization rules are unit-testable without the event store's RN dependencies.
export const MAX_NOTIF_BODY = 200
/**
* Make a server-supplied string safe to show in a notification:
* strip C0 control characters and DEL (which can corrupt the notification shade
* or hide content), collapse surrounding whitespace, and cap the length. Falls
* back to `fallback` when the input is empty/whitespace-only or undefined.
*/
export function sanitizeBody(s: string | undefined, fallback: string): string {
return (s ? s.replace(/[\x00-\x1f\x7f]/g, " ").trim().slice(0, MAX_NOTIF_BODY) : "") || fallback
}