@@ -4,13 +4,16 @@ import { configure, mount } from 'enzyme';
44import Adapter from 'enzyme-adapter-react-16' ;
55import React from 'react' ;
66import { IntlProvider } from 'react-intl' ;
7+ import { makeKeyDownEvent } from './TestUtils' ;
78import type { TileCode } from './TileData' ;
89import TilePanel from './TilePanel' ;
910import type { ThemeName } from './types' ;
1011import messages from './messages.json' ;
1112
1213configure ( { adapter : new Adapter ( ) } ) ;
1314
15+ const selectedTileClass = 'TilePanel__tile--selected' ;
16+
1417function createComponent ( selectedTile : ?TileCode , theme : ThemeName ) {
1518 const selectTileHandler = jest . fn ( ) ;
1619
@@ -41,28 +44,74 @@ test('All expected tiles are rendered', () => {
4144 expect ( wrapper . find ( 'button' ) ) . toHaveLength ( 17 ) ;
4245} ) ;
4346
44- describe ( 'If there is a selceted tile, it has the TilePanel__tile--selected class' , ( ) => {
45- const selectedTileClassSelector = '.TilePanel__tile--selected' ;
46- test ( 'No selected tile' , ( ) => {
47- const { wrapper } = createComponent ( null , 'default' ) ;
48- expect ( wrapper . find ( selectedTileClassSelector ) ) . toHaveLength ( 0 ) ;
47+ test ( 'When no tile is selected, no tile has the TilePanel__tile--selected class and all tiles has aria-checked=false' , ( ) => {
48+ expect . assertions ( 35 ) ;
49+ const { wrapper } = createComponent ( null , 'default' ) ;
50+ const tiles = wrapper . find ( 'button' ) ;
51+ expect ( tiles ) . toHaveLength ( 17 ) ;
52+ tiles . forEach ( ( tile ) => {
53+ expect ( tile . hasClass ( selectedTileClass ) ) . toBe ( false ) ;
54+ expect ( tile . getDOMNode ( ) . getAttribute ( 'aria-checked' ) ) . toBe ( 'false' ) ;
4955 } ) ;
50- test ( 'Selected tile' , ( ) => {
51- const { wrapper } = createComponent ( '0' , 'default' ) ;
52- expect ( wrapper . find ( selectedTileClassSelector ) ) . toHaveLength ( 1 ) ;
56+ } ) ;
57+
58+ test ( 'When no tile is selected, the first tile has tabIndex=0 and all others have tabIndex=-1' , ( ) => {
59+ expect . assertions ( 18 ) ;
60+ const { wrapper } = createComponent ( null , 'default' ) ;
61+ const tiles = wrapper . find ( 'button' ) ;
62+ expect ( tiles ) . toHaveLength ( 17 ) ;
63+ tiles . forEach ( ( tile , i ) => {
64+ if ( i === 0 ) {
65+ expect ( tile . getDOMNode ( ) . getAttribute ( 'tabIndex' ) ) . toBe ( '0' ) ;
66+ } else {
67+ expect ( tile . getDOMNode ( ) . getAttribute ( 'tabIndex' ) ) . toBe ( '-1' ) ;
68+ }
5369 } ) ;
5470} ) ;
5571
56- test ( 'Clicking on a tile calls the provided callback' , ( ) => {
72+ test ( 'When a tile is selected, only that tile has the TilePanel__tile--selected class, aria-checked=true, and tabIndex=0; all other tiles have aria-checked=false and tabIndex=-1' , ( ) => {
73+ expect . assertions ( 52 ) ;
74+
75+ const selectedTileCode = '2' ;
76+ // The tile with code '2' is at index 5 in the tile panel
77+ const expectedSelectedTileIndex = 5 ;
78+
79+ const { wrapper } = createComponent ( selectedTileCode , 'default' ) ;
80+ const tiles = wrapper . find ( 'button' ) ;
81+ expect ( tiles ) . toHaveLength ( 17 ) ;
82+ tiles . forEach ( ( tile , i ) => {
83+ if ( i === expectedSelectedTileIndex ) {
84+ expect ( tile . hasClass ( selectedTileClass ) ) . toBe ( true ) ;
85+ expect ( tile . getDOMNode ( ) . getAttribute ( 'aria-checked' ) ) . toBe ( 'true' ) ;
86+ expect ( tile . getDOMNode ( ) . getAttribute ( 'tabIndex' ) ) . toBe ( '0' ) ;
87+ } else {
88+ expect ( tile . hasClass ( selectedTileClass ) ) . toBe ( false ) ;
89+ expect ( tile . getDOMNode ( ) . getAttribute ( 'aria-checked' ) ) . toBe ( 'false' ) ;
90+ expect ( tile . getDOMNode ( ) . getAttribute ( 'tabIndex' ) ) . toBe ( '-1' ) ;
91+ }
92+ } ) ;
93+ } ) ;
94+
95+ test . each ( [
96+ [ 'ArrowRight' , '0' , '1' ] ,
97+ [ 'ArrowRight' , 'D' , '0' ] ,
98+ [ 'ArrowDown' , '0' , '1' ] ,
99+ [ 'ArrowDown' , 'D' , '0' ] ,
100+ [ 'ArrowLeft' , '0' , 'D' ] ,
101+ [ 'ArrowLeft' , '1' , '0' ] ,
102+ [ 'ArrowUp' , '0' , 'D' ] ,
103+ [ 'ArrowUp' , '1' , '0' ]
104+ ] ) ( '%s on TileCode %s, expect TileCode %s' , ( key , startTileCode , expectedTileCode ) => {
57105 const { wrapper, selectTileHandler } = createComponent ( null , 'default' ) ;
58- wrapper . find ( 'button[data-tilecode="2"]' ) . simulate ( 'click' ) ;
106+ const tile = wrapper . find ( `button[data-tilecode="${ startTileCode } "]` ) ;
107+ tile . simulate ( 'keydown' , makeKeyDownEvent ( tile . getDOMNode ( ) , key ) ) ;
59108 expect ( selectTileHandler . mock . calls . length ) . toBe ( 1 ) ;
60- expect ( selectTileHandler . mock . calls [ 0 ] [ 0 ] ) . toBe ( '2' ) ;
109+ expect ( selectTileHandler . mock . calls [ 0 ] [ 0 ] ) . toBe ( expectedTileCode ) ;
61110} ) ;
62111
63- test ( 'Mouse down on a tile calls the provided callback' , ( ) => {
112+ test ( 'Clicking on a tile calls the provided callback' , ( ) => {
64113 const { wrapper, selectTileHandler } = createComponent ( null , 'default' ) ;
65- wrapper . find ( 'button[data-tilecode="2"]' ) . simulate ( 'mousedown ' ) ;
114+ wrapper . find ( 'button[data-tilecode="2"]' ) . simulate ( 'click ' ) ;
66115 expect ( selectTileHandler . mock . calls . length ) . toBe ( 1 ) ;
67116 expect ( selectTileHandler . mock . calls [ 0 ] [ 0 ] ) . toBe ( '2' ) ;
68117} ) ;
0 commit comments