|
10 | 10 | * governing permissions and limitations under the License.
|
11 | 11 | */
|
12 | 12 |
|
13 |
| -import {fireEvent, installPointerEvent, pointerMap, render, simulateDesktop, simulateMobile} from '@react-spectrum/test-utils-internal'; |
| 13 | +import {fireEvent, installPointerEvent, pointerMap, render, simulateDesktop, simulateMobile, within} from '@react-spectrum/test-utils-internal'; |
14 | 14 | import {Item} from '@react-stately/collections';
|
15 | 15 | import {List} from '../stories/List';
|
16 | 16 | import React from 'react';
|
@@ -107,5 +107,43 @@ describe('useSelectableCollection', () => {
|
107 | 107 | expect(options[1]).not.toHaveAttribute('aria-selected');
|
108 | 108 | expect(options[2]).toHaveAttribute('aria-selected', 'true');
|
109 | 109 | });
|
| 110 | + |
| 111 | + it('focuses first/last selected item on focus enter and does not change the selection', async () => { |
| 112 | + let onSelectionChange1 = jest.fn(); |
| 113 | + let onSelectionChange2 = jest.fn(); |
| 114 | + let {getByText, getAllByRole} = render( |
| 115 | + <> |
| 116 | + <List |
| 117 | + selectionMode="multiple" |
| 118 | + selectionBehavior="replace" |
| 119 | + defaultSelectedKeys={['i2', 'i3']} |
| 120 | + onSelectionChange={onSelectionChange1}> |
| 121 | + <Item key="i1">Paco de Lucia</Item> |
| 122 | + <Item key="i2">Vicente Amigo</Item> |
| 123 | + <Item key="i3">Gerardo Nunez</Item> |
| 124 | + </List> |
| 125 | + <button>focus stop</button> |
| 126 | + <List |
| 127 | + selectionMode="multiple" |
| 128 | + selectionBehavior="replace" |
| 129 | + defaultSelectedKeys={['i2', 'i3']} |
| 130 | + onSelectionChange={onSelectionChange2}> |
| 131 | + <Item key="i1">Paco de Lucia</Item> |
| 132 | + <Item key="i2">Vicente Amigo</Item> |
| 133 | + <Item key="i3">Gerardo Nunez</Item> |
| 134 | + </List> |
| 135 | + </> |
| 136 | + ); |
| 137 | + let [firstList, secondList] = getAllByRole('listbox'); |
| 138 | + await user.click(getByText('focus stop')); |
| 139 | + await user.tab(); |
| 140 | + expect(document.activeElement).toBe(within(secondList).getByRole('option', {name: 'Vicente Amigo'})); |
| 141 | + await user.click(getByText('focus stop')); |
| 142 | + await user.tab({shift: true}); |
| 143 | + expect(document.activeElement).toBe(within(firstList).getByRole('option', {name: 'Gerardo Nunez'})); |
| 144 | + |
| 145 | + expect(onSelectionChange1).not.toHaveBeenCalled(); |
| 146 | + expect(onSelectionChange2).not.toHaveBeenCalled(); |
| 147 | + }); |
110 | 148 | });
|
111 | 149 | });
|
0 commit comments