Files
orca/mobile/src/storage/preferences.test.ts
T
c9bd61376f feat(mobile): combine PR sidebar and checks parity (#5641)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Orca <help@stably.ai>
Co-authored-by: gsxdsm <gsxdsm@users.noreply.github.com>
2026-06-17 22:52:12 -07:00

147 lines
5.0 KiB
TypeScript

import AsyncStorage from '@react-native-async-storage/async-storage'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import {
HOST_DOCK_MAX_WIDTH,
HOST_DOCK_MIN_WIDTH,
HOST_SIDEBAR_DEFAULT_WIDTH,
HOST_SIDEBAR_MAX_WIDTH,
HOST_SIDEBAR_MIN_WIDTH,
clampHostDockWidth,
clampHostSidebarWidth,
loadHostSidebarWidth,
loadTerminalAutocompleteEnabled,
loadTerminalLinkOpenMode,
saveHostSidebarWidth,
saveTerminalAutocompleteEnabled,
saveTerminalLinkOpenMode
} from './preferences'
vi.mock('@react-native-async-storage/async-storage', () => ({
default: {
getItem: vi.fn(),
setItem: vi.fn()
}
}))
describe('terminal autocomplete preference', () => {
beforeEach(() => {
vi.mocked(AsyncStorage.getItem).mockReset()
vi.mocked(AsyncStorage.setItem).mockReset()
})
it('defaults to disabled when unset', async () => {
vi.mocked(AsyncStorage.getItem).mockResolvedValue(null)
await expect(loadTerminalAutocompleteEnabled()).resolves.toBe(false)
expect(AsyncStorage.getItem).toHaveBeenCalledWith('orca:terminalAutocompleteEnabled')
})
it('loads enabled only from the persisted true value', async () => {
vi.mocked(AsyncStorage.getItem).mockResolvedValue('true')
await expect(loadTerminalAutocompleteEnabled()).resolves.toBe(true)
vi.mocked(AsyncStorage.getItem).mockResolvedValue('false')
await expect(loadTerminalAutocompleteEnabled()).resolves.toBe(false)
})
it('falls back to disabled when storage cannot be read', async () => {
vi.mocked(AsyncStorage.getItem).mockRejectedValue(new Error('storage unavailable'))
await expect(loadTerminalAutocompleteEnabled()).resolves.toBe(false)
})
it('persists the selected value', async () => {
await saveTerminalAutocompleteEnabled(true)
expect(AsyncStorage.setItem).toHaveBeenCalledWith('orca:terminalAutocompleteEnabled', 'true')
await saveTerminalAutocompleteEnabled(false)
expect(AsyncStorage.setItem).toHaveBeenCalledWith('orca:terminalAutocompleteEnabled', 'false')
})
})
describe('host sidebar width preference', () => {
beforeEach(() => {
vi.mocked(AsyncStorage.getItem).mockReset()
vi.mocked(AsyncStorage.setItem).mockReset()
})
it('clamps saved widths to the supported sidebar range', () => {
expect(clampHostSidebarWidth(HOST_SIDEBAR_MIN_WIDTH - 10)).toBe(HOST_SIDEBAR_MIN_WIDTH)
expect(clampHostSidebarWidth(HOST_SIDEBAR_MAX_WIDTH + 10)).toBe(HOST_SIDEBAR_MAX_WIDTH)
expect(clampHostSidebarWidth(337.6)).toBe(338)
})
it('falls back to the default width for missing, invalid, or unreadable storage', async () => {
vi.mocked(AsyncStorage.getItem).mockResolvedValue(null)
await expect(loadHostSidebarWidth()).resolves.toBe(HOST_SIDEBAR_DEFAULT_WIDTH)
vi.mocked(AsyncStorage.getItem).mockResolvedValue('not-a-number')
await expect(loadHostSidebarWidth()).resolves.toBe(HOST_SIDEBAR_DEFAULT_WIDTH)
vi.mocked(AsyncStorage.getItem).mockRejectedValue(new Error('storage unavailable'))
await expect(loadHostSidebarWidth()).resolves.toBe(HOST_SIDEBAR_DEFAULT_WIDTH)
})
it('loads and persists clamped sidebar widths', async () => {
vi.mocked(AsyncStorage.getItem).mockResolvedValue(String(HOST_SIDEBAR_MAX_WIDTH + 20))
await expect(loadHostSidebarWidth()).resolves.toBe(HOST_SIDEBAR_MAX_WIDTH)
await saveHostSidebarWidth(HOST_SIDEBAR_MIN_WIDTH - 20)
expect(AsyncStorage.setItem).toHaveBeenCalledWith(
'orca:hostSidebarWidth',
String(HOST_SIDEBAR_MIN_WIDTH)
)
})
})
describe('host dock width preference', () => {
it('clamps saved widths to the supported dock range', () => {
expect(clampHostDockWidth(HOST_DOCK_MIN_WIDTH - 10)).toBe(HOST_DOCK_MIN_WIDTH)
expect(clampHostDockWidth(HOST_DOCK_MAX_WIDTH + 10)).toBe(HOST_DOCK_MAX_WIDTH)
expect(clampHostDockWidth(337.6)).toBe(338)
})
})
describe('terminal link open mode preference', () => {
beforeEach(() => {
vi.mocked(AsyncStorage.getItem).mockReset()
vi.mocked(AsyncStorage.setItem).mockReset()
})
it('defaults to Orca browser when unset', async () => {
vi.mocked(AsyncStorage.getItem).mockResolvedValue(null)
await expect(loadTerminalLinkOpenMode()).resolves.toBe('orca-browser')
expect(AsyncStorage.getItem).toHaveBeenCalledWith('orca:terminalLinkOpenMode')
})
it('loads only known modes', async () => {
vi.mocked(AsyncStorage.getItem).mockResolvedValue('phone-browser')
await expect(loadTerminalLinkOpenMode()).resolves.toBe('phone-browser')
vi.mocked(AsyncStorage.getItem).mockResolvedValue('external')
await expect(loadTerminalLinkOpenMode()).resolves.toBe('orca-browser')
})
it('falls back to Orca browser when storage cannot be read', async () => {
vi.mocked(AsyncStorage.getItem).mockRejectedValue(new Error('storage unavailable'))
await expect(loadTerminalLinkOpenMode()).resolves.toBe('orca-browser')
})
it('persists the selected mode', async () => {
await saveTerminalLinkOpenMode('phone-browser')
expect(AsyncStorage.setItem).toHaveBeenCalledWith('orca:terminalLinkOpenMode', 'phone-browser')
})
})