import { describe, expect, it, mock, beforeEach } from 'bun:test' import { renderToString } from '../utils/staticRender.js' // Mock modules before importing ThemePicker mock.module('../ink.js', () => ({ useTheme: () => ['dark', () => {}], useThemeSetting: () => 'dark', usePreviewTheme: () => ({ setPreviewTheme: mock(), savePreview: mock(), cancelPreview: mock(), }), useTerminalSize: () => ({ columns: 80, rows: 24 }), Box: 'Box', Text: 'Text', })) mock.module('../hooks/useExitOnCtrlCDWithKeybindings.js', () => ({ useExitOnCtrlCDWithKeybindings: () => ({ pending: false, keyName: 'Ctrl+C' }), })) mock.module('../keybindings/KeybindingContext.js', () => ({ useRegisterKeybindingContext: mock(), })) mock.module('../keybindings/useKeybinding.js', () => ({ useKeybinding: mock(), })) mock.module('../keybindings/useShortcutDisplay.js', () => ({ useShortcutDisplay: () => 'Ctrl+T', })) mock.module('../state/AppState.js', () => ({ useAppState: () => ({ settings: { syntaxHighlightingDisabled: false } }), useSetAppState: () => mock(), })) mock.module('../utils/gracefulShutdown.js', () => ({ gracefulShutdown: mock(), })) mock.module('../utils/settings/settings.js', () => ({ updateSettingsForSource: mock(), })) // We can't fully render ThemePicker due to complex dependencies // But we can test the theme options generation logic describe('ThemePicker', () => { describe('theme options', () => { it('generates correct theme options without AUTO_THEME feature flag', () => { // Since we can't easily mock bun:bundle, test the options structure // The real test would require integration testing const expectedOptions = [ { label: "Dark mode", value: "dark" }, { label: "Light mode", value: "light" }, { label: "Dark mode (colorblind-friendly)", value: "dark-daltonized" }, { label: "Light mode (colorblind-friendly)", value: "light-daltonized" }, { label: "Dark mode (ANSI colors only)", value: "dark-ansi" }, { label: "Light mode (ANSI colors only)", value: "light-ansi" }, ] expect(expectedOptions.length).toBe(6) }) it('includes auto theme when AUTO_THEME feature is enabled', () => { // Test the structure when auto is present const optionsWithAuto = [ { label: "Auto (match terminal)", value: "auto" }, { label: "Dark mode", value: "dark" }, ] expect(optionsWithAuto[0].value).toBe('auto') }) }) describe('handleRowFocus callback', () => { it('setPreviewTheme is called with theme setting', () => { const setPreviewTheme = mock() const handleRowFocus = (setting: string) => setPreviewTheme(setting) handleRowFocus('dark') expect(setPreviewTheme).toHaveBeenCalledWith('dark') }) }) describe('handleSelect callback', () => { it('calls savePreview and onThemeSelect', () => { const savePreview = mock() const onThemeSelect = mock() const handleSelect = (setting: string) => { savePreview() onThemeSelect(setting) } handleSelect('light') expect(savePreview).toHaveBeenCalled() expect(onThemeSelect).toHaveBeenCalledWith('light') }) }) describe('handleCancel callback', () => { it('calls cancelPreview and gracefulShutdown when not skipExitHandling', () => { const cancelPreview = mock() const gracefulShutdown = mock() const handleCancel = (skipExitHandling: boolean, onCancelProp?: () => void) => { cancelPreview() if (skipExitHandling) { onCancelProp?.() } else { gracefulShutdown(0) } } handleCancel(false) expect(cancelPreview).toHaveBeenCalled() expect(gracefulShutdown).toHaveBeenCalledWith(0) }) it('calls onCancelProp when skipExitHandling is true', () => { const cancelPreview = mock() const onCancelProp = mock() const handleCancel = (skipExitHandling: boolean, onCancelProp?: () => void) => { cancelPreview() if (skipExitHandling) { onCancelProp?.() } } handleCancel(true, onCancelProp) expect(cancelPreview).toHaveBeenCalled() expect(onCancelProp).toHaveBeenCalled() }) }) describe('syntax hint logic', () => { it('shows disabled hint when syntax highlighting is disabled', () => { const syntaxHighlightingDisabled = true const syntaxToggleShortcut = 'Ctrl+T' const hint = syntaxHighlightingDisabled ? `Syntax highlighting disabled (${syntaxToggleShortcut} to enable)` : `Syntax highlighting enabled (${syntaxToggleShortcut} to disable)` expect(hint).toContain('disabled') }) it('shows enabled hint when syntax highlighting is active', () => { const syntaxHighlightingDisabled = false const syntaxToggleShortcut = 'Ctrl+T' const hint = !syntaxHighlightingDisabled ? `Syntax highlighting enabled (${syntaxToggleShortcut} to disable)` : `Syntax highlighting disabled (${syntaxToggleShortcut} to enable)` expect(hint).toContain('enabled') }) }) })