From 02425705fd2cc16e3f2f8246c3079260cb72f735 Mon Sep 17 00:00:00 2001 From: Fadi Khadra Date: Thu, 10 Nov 2022 10:28:57 +0100 Subject: [PATCH] update tests --- ...rd-navigation.spec.ts => keyboard.spec.ts} | 21 +++++++++- example/components/App.tsx | 38 ++++++++++++++++--- example/constants.ts | 1 + scss/_themes.scss | 1 + src/components/Item.tsx | 7 ++-- src/components/Submenu.tsx | 6 +-- src/components/keyboardController.ts | 2 +- src/types/index.ts | 3 +- 8 files changed, 65 insertions(+), 14 deletions(-) rename cypress/e2e/{keyboard-navigation.spec.ts => keyboard.spec.ts} (78%) diff --git a/cypress/e2e/keyboard-navigation.spec.ts b/cypress/e2e/keyboard.spec.ts similarity index 78% rename from cypress/e2e/keyboard-navigation.spec.ts rename to cypress/e2e/keyboard.spec.ts index eb6654c..31363f3 100644 --- a/cypress/e2e/keyboard-navigation.spec.ts +++ b/cypress/e2e/keyboard.spec.ts @@ -1,6 +1,6 @@ import { DATA_TEST } from '../../example/constants'; -describe('Context menu', () => { +describe('Context menu keyboard interaction', () => { beforeEach(() => { cy.visit('/'); }); @@ -70,4 +70,23 @@ describe('Context menu', () => { cy.get('body').type('{leftarrow}'); cy.focused().should('have.attr', 'data-test', DATA_TEST.SUBMENU); }); + + it('Should handle keyboard shortcut', () => { + cy.getByDataTest(DATA_TEST.CONTEXT_MENU_TRIGGER).rightclick(); + + cy.get('body').type('{ctrl}{u}'); + cy.wait(500); + cy.getByDataTest(DATA_TEST.KDB_SHORTCUT).then((el) => { + expect(el.text()).eq('ctrl+u'); + }); + + // nested shortcut + cy.getByDataTest(DATA_TEST.CONTEXT_MENU_TRIGGER).rightclick(); + + cy.get('body').type('{ctrl}{s}'); + cy.wait(500); + cy.getByDataTest(DATA_TEST.KDB_SHORTCUT).then((el) => { + expect(el.text()).eq('ctrl+s'); + }); + }); }); diff --git a/example/components/App.tsx b/example/components/App.tsx index 161bf99..50d399c 100644 --- a/example/components/App.tsx +++ b/example/components/App.tsx @@ -49,6 +49,7 @@ interface SelectorState { customPosition: boolean; disableEnterAnimation: boolean; disableExitAnimation: boolean; + kbdShortcut: string; } function selectorReducer( @@ -82,6 +83,7 @@ export function App() { customPosition: false, disableEnterAnimation: false, disableExitAnimation: false, + kbdShortcut: '', }); const [payload, setPayload] = React.useState({ x: 0, @@ -222,6 +224,13 @@ export function App() { +
+

Keyboard shortcut

+
+ Shortcut triggered: + {state.kbdShortcut} +
+
{cloneItems(children, { diff --git a/src/components/keyboardController.ts b/src/components/keyboardController.ts index 0470215..bd147d5 100644 --- a/src/components/keyboardController.ts +++ b/src/components/keyboardController.ts @@ -119,7 +119,7 @@ export function createKeyboardController() { function matchKeys(e: KeyboardEvent) { // matches shortcut inside submenu as well even when submenu is not open - // it matches native behavior + // it matches native menu behavior function walkAndMatch(items: ItemTrackerRecord[]) { for (const item of items) { if (item.isSubmenu && item.submenuRefTracker) diff --git a/src/types/index.ts b/src/types/index.ts index e4ec640..8828efe 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -99,7 +99,8 @@ export interface ItemParams event: | React.MouseEvent | React.TouchEvent - | React.KeyboardEvent; + | React.KeyboardEvent + | KeyboardEvent; } export interface InternalProps {