@@ -13,6 +13,8 @@ import {
1313} from '@mui/internal-test-utils' ;
1414import { camelCase } from 'es-toolkit/string' ;
1515import Tooltip , { tooltipClasses as classes } from '@mui/material/Tooltip' ;
16+ import IconButton from '@mui/material/IconButton' ;
17+ import SaveIcon from '@mui/icons-material/Save' ;
1618import { testReset } from './Tooltip' ;
1719import describeConformance from '../../test/describeConformance' ;
1820
@@ -1492,4 +1494,75 @@ describe('<Tooltip />', () => {
14921494 expect ( screen . getByTestId ( 'popper' ) ) . to . have . class ( 'my-class' ) ;
14931495 } ) ;
14941496 } ) ;
1497+
1498+ describe ( 'IconButton trigger' , ( ) => {
1499+ it ( 'uncontrolled mode' , async ( ) => {
1500+ render (
1501+ < Tooltip enterDelay = { 0 } title = "Save" TransitionProps = { { timeout : 0 } } >
1502+ < IconButton >
1503+ < SaveIcon />
1504+ </ IconButton >
1505+ </ Tooltip > ,
1506+ ) ;
1507+ expect ( screen . queryByRole ( 'tooltip' ) ) . to . equal ( null ) ;
1508+
1509+ fireEvent . mouseOver ( screen . getByRole ( 'button' ) ) ;
1510+ clock . tick ( 0 ) ;
1511+
1512+ expect ( screen . getByRole ( 'tooltip' ) ) . toBeVisible ( ) ;
1513+
1514+ fireEvent . mouseLeave ( screen . getByRole ( 'button' ) ) ;
1515+ // Tooltip schedules timeout even with no delay
1516+ clock . tick ( 0 ) ;
1517+ clock . tick ( 0 ) ;
1518+
1519+ expect ( screen . queryByRole ( 'tooltip' ) ) . to . equal ( null ) ;
1520+ } ) ;
1521+
1522+ it ( 'controlled mode' , async ( ) => {
1523+ function App ( ) {
1524+ const [ open , setOpen ] = React . useState ( false ) ;
1525+
1526+ const handleClose = ( ) => {
1527+ setOpen ( false ) ;
1528+ } ;
1529+
1530+ const handleOpen = ( ) => {
1531+ setOpen ( true ) ;
1532+ } ;
1533+
1534+ return (
1535+ < Tooltip
1536+ open = { open }
1537+ onClose = { handleClose }
1538+ onOpen = { handleOpen }
1539+ title = "Save"
1540+ enterDelay = { 0 }
1541+ TransitionProps = { { timeout : 0 } }
1542+ >
1543+ < IconButton >
1544+ < SaveIcon />
1545+ </ IconButton >
1546+ </ Tooltip >
1547+ ) ;
1548+ }
1549+
1550+ await render ( < App /> ) ;
1551+
1552+ const trigger = screen . getByRole ( 'button' ) ;
1553+
1554+ expect ( screen . queryByRole ( 'tooltip' ) ) . to . equal ( null ) ;
1555+
1556+ fireEvent . mouseOver ( trigger ) ;
1557+
1558+ expect ( screen . getByRole ( 'tooltip' ) ) . toBeVisible ( ) ;
1559+
1560+ fireEvent . mouseLeave ( screen . getByRole ( 'button' ) ) ;
1561+
1562+ clock . tick ( 0 ) ; // enterDelay
1563+ clock . tick ( 0 ) ; // TransitionProps.timeout
1564+
1565+ expect ( screen . queryByRole ( 'tooltip' ) ) . to . equal ( null ) ;
1566+ } ) ;
1567+ } ) ;
14951568} ) ;
0 commit comments