@@ -6,6 +6,11 @@ import ReactDOM, { createPortal } from 'react-dom';
66import Trigger from '../src' ;
77import { awaitFakeTimer , placementAlignMap } from './util' ;
88
9+ jest . mock ( '@rc-component/util/lib/hooks/useId' , ( ) => {
10+ const origin = jest . requireActual ( 'react' ) ;
11+ return origin . useId ;
12+ } ) ;
13+
914describe ( 'Trigger.Basic' , ( ) => {
1015 beforeAll ( ( ) => {
1116 spyElementPrototypes ( HTMLElement , {
@@ -1200,4 +1205,75 @@ describe('Trigger.Basic', () => {
12001205 await awaitFakeTimer ( ) ;
12011206 expect ( isPopupHidden ( ) ) . toBeTruthy ( ) ;
12021207 } ) ;
1208+
1209+ describe ( 'keyboard' , ( ) => {
1210+ it ( 'esc should close popup' , async ( ) => {
1211+ const { container } = render (
1212+ < Trigger action = "click" popup = { < strong > trigger</ strong > } >
1213+ < div className = "target" />
1214+ </ Trigger > ,
1215+ ) ;
1216+
1217+ trigger ( container , '.target' ) ;
1218+ expect ( isPopupHidden ( ) ) . toBeFalsy ( ) ;
1219+
1220+ fireEvent . keyDown ( window , { key : 'Escape' } ) ;
1221+ expect ( isPopupHidden ( ) ) . toBeTruthy ( ) ;
1222+ } ) ;
1223+
1224+ it ( 'non-escape key should not close popup' , async ( ) => {
1225+ const { container } = render (
1226+ < Trigger action = "click" popup = { < strong > trigger</ strong > } >
1227+ < div className = "target" />
1228+ </ Trigger > ,
1229+ ) ;
1230+
1231+ trigger ( container , '.target' ) ;
1232+ expect ( isPopupHidden ( ) ) . toBeFalsy ( ) ;
1233+
1234+ fireEvent . keyDown ( window , { key : 'Enter' } ) ;
1235+ expect ( isPopupHidden ( ) ) . toBeFalsy ( ) ;
1236+ } ) ;
1237+
1238+ it ( 'esc should close nested popup from inside out' , async ( ) => {
1239+ const NestedPopup = ( ) => (
1240+ < Trigger
1241+ action = "click"
1242+ popupClassName = "inner-popup"
1243+ popup = { < div > Inner Content</ div > }
1244+ >
1245+ < button type = "button" className = "inner-target" >
1246+ Inner Target
1247+ </ button >
1248+ </ Trigger >
1249+ ) ;
1250+
1251+ const { container } = render (
1252+ < Trigger
1253+ action = "click"
1254+ popupClassName = "outer-popup"
1255+ popup = {
1256+ < div className = "outer-popup-content" >
1257+ < NestedPopup />
1258+ </ div >
1259+ }
1260+ >
1261+ < div className = "outer-target" />
1262+ </ Trigger > ,
1263+ ) ;
1264+
1265+ trigger ( container , '.outer-target' ) ;
1266+ expect ( isPopupClassHidden ( '.outer-popup' ) ) . toBeFalsy ( ) ;
1267+
1268+ fireEvent . click ( document . querySelector ( '.inner-target' ) ) ;
1269+ expect ( isPopupClassHidden ( '.inner-popup' ) ) . toBeFalsy ( ) ;
1270+
1271+ fireEvent . keyDown ( window , { key : 'Escape' } ) ;
1272+ expect ( isPopupClassHidden ( '.inner-popup' ) ) . toBeTruthy ( ) ;
1273+ expect ( isPopupClassHidden ( '.outer-popup' ) ) . toBeFalsy ( ) ;
1274+
1275+ fireEvent . keyDown ( window , { key : 'Escape' } ) ;
1276+ expect ( isPopupClassHidden ( '.outer-popup' ) ) . toBeTruthy ( ) ;
1277+ } ) ;
1278+ } ) ;
12031279} ) ;
0 commit comments