|
1 | 1 | import test from 'ava'
|
2 | 2 | import React from 'react'
|
3 |
| -import { spy } from 'sinon' |
| 3 | +import { spy, stub } from 'sinon' |
4 | 4 | import { mount } from 'enzyme'
|
5 | 5 | import DropdownTreeSelect from './index'
|
6 | 6 |
|
@@ -161,3 +161,80 @@ test('should set current focus as selected on tab out for simpleSelect', t => {
|
161 | 161 | triggerOnKeyboardKeyDown(wrapper, ['ArrowDown', 'ArrowRight', 'ArrowRight', 'Tab'])
|
162 | 162 | t.deepEqual(wrapper.state().tags[0].label, 'ccc 1')
|
163 | 163 | })
|
| 164 | + |
| 165 | +test('should scroll on keyboard navigation', t => { |
| 166 | + const largeTree = [...Array(150).keys()].map(i => node(`id${i}`, `label${i}`)) |
| 167 | + const wrapper = mount(<DropdownTreeSelect data={largeTree} showDropdown="initial" />) |
| 168 | + const getElementById = stub(document, 'getElementById') |
| 169 | + const contentNode = wrapper.find('.dropdown-content').getDOMNode() |
| 170 | + |
| 171 | + t.deepEqual(contentNode.scrollTop, 0) |
| 172 | + |
| 173 | + triggerOnKeyboardKeyDown(wrapper, ['ArrowUp']) |
| 174 | + largeTree.forEach((n, index) => { |
| 175 | + getElementById.withArgs(`${n.id}_li`).returns({ offsetTop: index, clientHeight: 1 }) |
| 176 | + }) |
| 177 | + |
| 178 | + triggerOnKeyboardKeyDown(wrapper, ['ArrowUp']) |
| 179 | + t.deepEqual(wrapper.find('li.focused').text(), 'label148') |
| 180 | + t.notDeepEqual(contentNode.scrollTop, 0) |
| 181 | + |
| 182 | + getElementById.restore() |
| 183 | +}) |
| 184 | + |
| 185 | +test('should only scroll on keyboard navigation', t => { |
| 186 | + const largeTree = [...Array(150).keys()].map(i => node(`id${i}`, `label${i}`)) |
| 187 | + const wrapper = mount(<DropdownTreeSelect data={largeTree} showDropdown="initial" />) |
| 188 | + const getElementById = stub(document, 'getElementById') |
| 189 | + const contentNode = wrapper.find('.dropdown-content').getDOMNode() |
| 190 | + |
| 191 | + triggerOnKeyboardKeyDown(wrapper, ['ArrowUp']) |
| 192 | + largeTree.forEach((n, index) => { |
| 193 | + getElementById.withArgs(`${n.id}_li`).returns({ offsetTop: index, clientHeight: 1 }) |
| 194 | + }) |
| 195 | + |
| 196 | + triggerOnKeyboardKeyDown(wrapper, ['ArrowUp']) |
| 197 | + |
| 198 | + const scrollTop = contentNode.scrollTop |
| 199 | + |
| 200 | + // Simulate scroll up and setting new props |
| 201 | + contentNode.scrollTop -= 20 |
| 202 | + const newTree = largeTree.map(n => { |
| 203 | + return { checked: true, ...n } |
| 204 | + }) |
| 205 | + wrapper.setProps({ data: newTree, showDropdown: 'initial' }) |
| 206 | + t.notDeepEqual(contentNode.scrollTop, scrollTop) |
| 207 | + |
| 208 | + // Verify scroll is restored to previous position after keyboard nav |
| 209 | + triggerOnKeyboardKeyDown(wrapper, ['ArrowUp', 'ArrowDown']) |
| 210 | + t.deepEqual(contentNode.scrollTop, scrollTop) |
| 211 | + |
| 212 | + getElementById.restore() |
| 213 | +}) |
| 214 | + |
| 215 | +const keyDownTests = [ |
| 216 | + { keyCode: 13, expected: true }, // Enter |
| 217 | + { keyCode: 32, expected: true }, // Space |
| 218 | + { keyCode: 40, expected: true }, // Arrow down |
| 219 | + { keyCode: 9, expected: false }, // Tab |
| 220 | + { keyCode: 38, expected: false }, // Up arrow |
| 221 | +] |
| 222 | + |
| 223 | +keyDownTests.forEach(testArgs => { |
| 224 | + test(`Key code ${testArgs.keyCode} ${testArgs.expected ? 'can' : "can't"} open dropdown on keyDown`, t => { |
| 225 | + const wrapper = mount(<DropdownTreeSelect data={tree} />) |
| 226 | + const trigger = wrapper.find('.dropdown-trigger') |
| 227 | + trigger.instance().focus() |
| 228 | + trigger.simulate('keyDown', { key: 'mock', keyCode: testArgs.keyCode }) |
| 229 | + t.is(wrapper.state().showDropdown, testArgs.expected) |
| 230 | + }) |
| 231 | +}) |
| 232 | + |
| 233 | +test(`Key event should not trigger if not focused/active element`, t => { |
| 234 | + const wrapper = mount(<DropdownTreeSelect data={tree} />) |
| 235 | + const trigger = wrapper.find('.dropdown-trigger') |
| 236 | + const input = wrapper.find('.search') |
| 237 | + input.instance().focus() |
| 238 | + trigger.simulate('keyDown', { key: 'mock', keyCode: 13 }) |
| 239 | + t.is(wrapper.state().showDropdown, false) |
| 240 | +}) |
0 commit comments