import { describe, expect, it } from 'vitest'; import { withMenuOptionSpacing, withMultiselectNavigation, withTextInputNavigation } from '../src/prompt-navigation.js'; describe('prompt navigation helpers', () => { it('leaves compact single-line menu prompts unchanged', () => { expect(withMenuOptionSpacing('What do you want to do?')).toBe('What do you want to do?'); }); it('adds a blank separator between multiline menu copy and the option list', () => { expect(withMenuOptionSpacing('Which embedding option should KTX use?\n\nKTX uses embeddings for search.')).toBe( 'Which embedding option should KTX use?\n\nKTX uses embeddings for search.\n', ); }); it('does not duplicate an existing option-list separator', () => { expect(withMenuOptionSpacing('Question\n\nContext\n')).toBe('Question\n\nContext\n'); }); it('keeps multiselect navigation copy multiline so menu renderers can separate it from options', () => { expect(withMultiselectNavigation('Which sources?')).toBe( 'Which sources?\nUse Up/Down to move, Space to select or unselect, Enter to confirm, Escape to go back, or Ctrl+C to exit.', ); }); it('adds a blank separator between text input helper copy and the editable value', () => { expect( withTextInputNavigation( 'Name this PostgreSQL connection\nKTX will use this short name in commands and config. You can rename it now.', ), ).toBe( 'Name this PostgreSQL connection\n│\n│ KTX will use this short name in commands and config. You can rename it now.\n│ Press Escape to go back.\n│', ); }); it('adds a blank separator before compact text input values', () => { expect(withTextInputNavigation('Project folder path')).toBe('Project folder path\n│ Press Escape to go back.\n│'); }); it('normalizes already hinted text input prompts without duplicating the hint', () => { expect( withTextInputNavigation( 'Name this PostgreSQL connection\nKTX will use this short name in commands and config. You can rename it now.\nPress Escape to go back.', ), ).toBe( 'Name this PostgreSQL connection\n│\n│ KTX will use this short name in commands and config. You can rename it now.\n│ Press Escape to go back.\n│', ); }); it('is idempotent when text input navigation is applied twice', () => { const once = withTextInputNavigation('Project folder path'); expect(withTextInputNavigation(once)).toBe(once); }); it('is idempotent when text input navigation with body is applied twice', () => { const once = withTextInputNavigation( 'Name this PostgreSQL connection\nKTX will use this short name in commands and config.', ); expect(withTextInputNavigation(once)).toBe(once); }); });