import { describe, expect, it } from 'vitest'; import { createSettingsHelpers } from './settings-helpers.js'; const createTestHelpers = () => createSettingsHelpers({ normalizePathForPersistence: (value) => value, normalizeDirectoryPath: (value) => value, normalizeTunnelBootstrapTtlMs: (value) => value, normalizeTunnelSessionTtlMs: (value) => value, normalizeTunnelProvider: (value) => value, normalizeTunnelMode: (value) => value, normalizeOptionalPath: (value) => value, normalizeManagedRemoteTunnelHostname: (value) => value, normalizeManagedRemoteTunnelPresets: () => undefined, normalizeManagedRemoteTunnelPresetTokens: () => undefined, sanitizeTypographySizesPartial: () => undefined, normalizeStringArray: (input) => input, sanitizeModelRefs: () => undefined, sanitizeSkillCatalogs: () => undefined, sanitizeProjects: () => undefined, }); describe('settings helpers', () => { it('accepts messageStreamTransport as a persisted shared setting', () => { const helpers = createTestHelpers(); expect(helpers.sanitizeSettingsUpdate({ messageStreamTransport: 'ws' })).toEqual({ messageStreamTransport: 'ws', }); expect(helpers.sanitizeSettingsUpdate({ messageStreamTransport: 'sse' })).toEqual({ messageStreamTransport: 'sse', }); expect(helpers.sanitizeSettingsUpdate({ messageStreamTransport: 'auto' })).toEqual({ messageStreamTransport: 'auto', }); }); it('rejects invalid messageStreamTransport values', () => { const helpers = createTestHelpers(); expect(helpers.sanitizeSettingsUpdate({ messageStreamTransport: 'websocket' })).toEqual({}); }); it('accepts desktopLanAccessEnabled as a persisted shared setting', () => { const helpers = createTestHelpers(); expect(helpers.sanitizeSettingsUpdate({ desktopLanAccessEnabled: true })).toEqual({ desktopLanAccessEnabled: true, }); expect(helpers.sanitizeSettingsUpdate({ desktopLanAccessEnabled: false })).toEqual({ desktopLanAccessEnabled: false, }); }); it('accepts desktopUiPassword as a persisted shared setting', () => { const helpers = createTestHelpers(); expect(helpers.sanitizeSettingsUpdate({ desktopUiPassword: ' secret ' })).toEqual({ desktopUiPassword: 'secret', }); expect(helpers.sanitizeSettingsUpdate({ desktopUiPassword: '' })).toEqual({ desktopUiPassword: '', }); }); it('accepts mobileKeyboardMode as a persisted shared setting', () => { const helpers = createTestHelpers(); expect(helpers.sanitizeSettingsUpdate({ mobileKeyboardMode: 'native' })).toEqual({ mobileKeyboardMode: 'native', }); expect(helpers.sanitizeSettingsUpdate({ mobileKeyboardMode: 'resize-content' })).toEqual({ mobileKeyboardMode: 'resize-content', }); expect(helpers.sanitizeSettingsUpdate({ mobileKeyboardMode: ' resize-content ' })).toEqual({ mobileKeyboardMode: 'resize-content', }); }); it('rejects invalid mobileKeyboardMode values', () => { const helpers = createTestHelpers(); expect(helpers.sanitizeSettingsUpdate({ mobileKeyboardMode: 'fixed-layout' })).toEqual({}); }); it('accepts collapsibleThinkingBlocks as a persisted shared setting', () => { const helpers = createTestHelpers(); expect(helpers.sanitizeSettingsUpdate({ collapsibleThinkingBlocks: true })).toEqual({ collapsibleThinkingBlocks: true, }); expect(helpers.sanitizeSettingsUpdate({ collapsibleThinkingBlocks: false })).toEqual({ collapsibleThinkingBlocks: false, }); }); it('accepts shortcut overrides as a persisted shared setting', () => { const helpers = createTestHelpers(); expect(helpers.sanitizeSettingsUpdate({ shortcutOverrides: { open_settings: 'mod+comma', new_chat: '__unassigned__', invalid: 123, empty: '', }, })).toEqual({ shortcutOverrides: { open_settings: 'mod+comma', new_chat: '__unassigned__', }, }); }); it('preserves empty shortcut overrides when resetting all shortcuts', () => { const helpers = createTestHelpers(); expect(helpers.sanitizeSettingsUpdate({ shortcutOverrides: {} })).toEqual({ shortcutOverrides: {}, }); }); it('accepts OpenCode update notification preference as a persisted shared setting', () => { const helpers = createTestHelpers(); expect(helpers.sanitizeSettingsUpdate({ showOpenCodeUpdateNotifications: false })).toEqual({ showOpenCodeUpdateNotifications: false, }); expect(helpers.sanitizeSettingsUpdate({ showOpenCodeUpdateNotifications: true })).toEqual({ showOpenCodeUpdateNotifications: true, }); }); it('accepts dismissed OpenCode update toast version as a persisted shared setting', () => { const helpers = createTestHelpers(); expect(helpers.sanitizeSettingsUpdate({ openCodeUpdateToastDismissedVersion: ' 1.16.0 ' })).toEqual({ openCodeUpdateToastDismissedVersion: '1.16.0', }); expect(helpers.sanitizeSettingsUpdate({ openCodeUpdateToastDismissedVersion: '' })).toEqual({ openCodeUpdateToastDismissedVersion: '', }); }); it('rejects non-boolean collapsibleThinkingBlocks values', () => { const helpers = createTestHelpers(); expect(helpers.sanitizeSettingsUpdate({ collapsibleThinkingBlocks: 'true' })).toEqual({}); expect(helpers.sanitizeSettingsUpdate({ collapsibleThinkingBlocks: 1 })).toEqual({}); }); it('includes collapsibleThinkingBlocks in formatSettingsResponse', () => { const helpers = createTestHelpers(); const response = helpers.formatSettingsResponse({ collapsibleThinkingBlocks: false }); expect(response.collapsibleThinkingBlocks).toBe(false); const responseTrue = helpers.formatSettingsResponse({ collapsibleThinkingBlocks: true }); expect(responseTrue.collapsibleThinkingBlocks).toBe(true); }); it('defaults collapsibleThinkingBlocks to true in formatSettingsResponse when absent', () => { const helpers = createTestHelpers(); const response = helpers.formatSettingsResponse({}); expect(response.collapsibleThinkingBlocks).toBe(true); }); it('includes transient desktop LAN access runtime status in desktop settings response', () => { const helpers = createTestHelpers(); const previousRuntime = process.env.OPENCHAMBER_RUNTIME; const previousActive = process.env.OPENCHAMBER_DESKTOP_LAN_ACCESS_ACTIVE; const previousReason = process.env.OPENCHAMBER_DESKTOP_LAN_ACCESS_BLOCKED_REASON; try { process.env.OPENCHAMBER_RUNTIME = 'desktop'; process.env.OPENCHAMBER_DESKTOP_LAN_ACCESS_ACTIVE = 'false'; process.env.OPENCHAMBER_DESKTOP_LAN_ACCESS_BLOCKED_REASON = 'missing-password'; const response = helpers.formatSettingsResponse({ desktopLanAccessEnabled: true }); expect(response.desktopLanAccessActive).toBe(false); expect(response.desktopLanAccessBlockedReason).toBe('missing-password'); } finally { if (typeof previousRuntime === 'string') process.env.OPENCHAMBER_RUNTIME = previousRuntime; else delete process.env.OPENCHAMBER_RUNTIME; if (typeof previousActive === 'string') process.env.OPENCHAMBER_DESKTOP_LAN_ACCESS_ACTIVE = previousActive; else delete process.env.OPENCHAMBER_DESKTOP_LAN_ACCESS_ACTIVE; if (typeof previousReason === 'string') process.env.OPENCHAMBER_DESKTOP_LAN_ACCESS_BLOCKED_REASON = previousReason; else delete process.env.OPENCHAMBER_DESKTOP_LAN_ACCESS_BLOCKED_REASON; } }); });