diff options
| author | Miguel Solorio <[email protected]> | 2025-07-17 15:51:42 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-07-17 22:51:42 +0000 |
| commit | 5b7bf74d66645163db14e6f1f7aea1f31d8b5f8a (patch) | |
| tree | 81997804659dc551d9c9cb3fbb9c719166612f33 /packages/cli/src/ui/components/shared/RadioButtonSelect.test.tsx | |
| parent | 6aac93ee075757fcb0b840012ff0abf0b17feea1 (diff) | |
Add numbers to selection list (#4320)
Diffstat (limited to 'packages/cli/src/ui/components/shared/RadioButtonSelect.test.tsx')
| -rw-r--r-- | packages/cli/src/ui/components/shared/RadioButtonSelect.test.tsx | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/packages/cli/src/ui/components/shared/RadioButtonSelect.test.tsx b/packages/cli/src/ui/components/shared/RadioButtonSelect.test.tsx new file mode 100644 index 00000000..4b36fe3c --- /dev/null +++ b/packages/cli/src/ui/components/shared/RadioButtonSelect.test.tsx @@ -0,0 +1,115 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import { render } from 'ink-testing-library'; +import { + RadioButtonSelect, + type RadioSelectItem, +} from './RadioButtonSelect.js'; +import { describe, it, expect } from 'vitest'; + +const ITEMS: Array<RadioSelectItem<string>> = [ + { label: 'Option 1', value: 'one' }, + { label: 'Option 2', value: 'two' }, + { label: 'Option 3', value: 'three', disabled: true }, +]; + +describe('<RadioButtonSelect />', () => { + it('renders a list of items and matches snapshot', () => { + const { lastFrame } = render( + <RadioButtonSelect items={ITEMS} onSelect={() => {}} isFocused={true} />, + ); + expect(lastFrame()).toMatchSnapshot(); + }); + + it('renders with the second item selected and matches snapshot', () => { + const { lastFrame } = render( + <RadioButtonSelect + items={ITEMS} + initialIndex={1} + onSelect={() => {}} + isFocused={true} + />, + ); + expect(lastFrame()).toMatchSnapshot(); + }); + + it('renders with numbers hidden and matches snapshot', () => { + const { lastFrame } = render( + <RadioButtonSelect + items={ITEMS} + onSelect={() => {}} + isFocused={true} + showNumbers={false} + />, + ); + expect(lastFrame()).toMatchSnapshot(); + }); + + it('renders with scroll arrows and matches snapshot', () => { + const manyItems = Array.from({ length: 20 }, (_, i) => ({ + label: `Item ${i + 1}`, + value: `item-${i + 1}`, + })); + const { lastFrame } = render( + <RadioButtonSelect + items={manyItems} + onSelect={() => {}} + isFocused={true} + showScrollArrows={true} + maxItemsToShow={5} + />, + ); + expect(lastFrame()).toMatchSnapshot(); + }); + + it('renders with special theme display and matches snapshot', () => { + const themeItems: Array<RadioSelectItem<string>> = [ + { + label: 'Theme A (Light)', + value: 'a-light', + themeNameDisplay: 'Theme A', + themeTypeDisplay: '(Light)', + }, + { + label: 'Theme B (Dark)', + value: 'b-dark', + themeNameDisplay: 'Theme B', + themeTypeDisplay: '(Dark)', + }, + ]; + const { lastFrame } = render( + <RadioButtonSelect + items={themeItems} + onSelect={() => {}} + isFocused={true} + />, + ); + expect(lastFrame()).toMatchSnapshot(); + }); + + it('renders a list with >10 items and matches snapshot', () => { + const manyItems = Array.from({ length: 12 }, (_, i) => ({ + label: `Item ${i + 1}`, + value: `item-${i + 1}`, + })); + const { lastFrame } = render( + <RadioButtonSelect + items={manyItems} + onSelect={() => {}} + isFocused={true} + />, + ); + expect(lastFrame()).toMatchSnapshot(); + }); + + it('renders nothing when no items are provided', () => { + const { lastFrame } = render( + <RadioButtonSelect items={[]} onSelect={() => {}} isFocused={true} />, + ); + expect(lastFrame()).toBe(''); + }); +}); |
