114 lines
3.9 KiB
TypeScript
114 lines
3.9 KiB
TypeScript
import { describe, expect, it, mock } from 'bun:test'
|
|
|
|
// 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')
|
|
})
|
|
})
|
|
})
|