import React, { useEffect } from 'react'; import { CloseOutlined } from '@ant-design/icons'; import { render } from '@testing-library/react'; import type { UseClosableParams } from '../hooks/useClosable'; import useClosable from '../hooks/useClosable'; type ParamsOfUseClosable = [ closable: UseClosableParams['closable'], closeIcon: UseClosableParams['closeIcon'], defaultClosable: UseClosableParams['defaultClosable'], ]; describe('hooks test', () => { const useClosableParams: { params: ParamsOfUseClosable; res: [boolean, string] }[] = [ // test case like: { params: [undefined, undefined, undefined], res: [false, ''], }, { params: [undefined, undefined, true], res: [true, '.anticon-close'], }, { params: [undefined, undefined, false], res: [false, ''], }, // test case like: { params: [false, undefined, undefined], res: [false, ''], }, { params: [true, undefined, true], res: [true, '.anticon-close'], }, { params: [true, undefined, false], res: [true, '.anticon-close'], }, // test case like: { params: [false, null, undefined], res: [false, ''], }, { params: [false, false, undefined], res: [false, ''], }, { params: [true, null, true], res: [true, '.anticon-close'], }, { params: [true, false, true], res: [true, '.anticon-close'], }, { params: [true, null, false], res: [true, '.anticon-close'], }, { params: [true, false, false], res: [true, '.anticon-close'], }, { params: [ true,
close
, false, ], res: [true, '.custom-close'], }, { params: [false,
close
, false], res: [false, ''], }, // test case like: { params: [undefined, null, undefined], res: [false, ''], }, { params: [undefined, false, undefined], res: [false, ''], }, { params: [undefined, true, undefined], res: [true, '.anticon-close'], }, { params: [ undefined,
close
, undefined, ], res: [true, '.custom-close'], }, { params: [ undefined,
close
, true, ], res: [true, '.custom-close'], }, { params: [ undefined,
close
, false, ], res: [true, '.custom-close'], }, { params: [ { closeIcon: 'Close', 'aria-label': 'Close Btn', }, undefined, false, ], res: [true, '*[aria-label="Close Btn"]'], }, ]; useClosableParams.forEach(({ params, res }) => { it(`useClosable with closable=${params[0]},closeIcon=${ React.isValidElement(params[1]) ? 'element' : params[1] },defaultClosable=${params[2]}. the result should be ${res}`, () => { const App = () => { const [closable, closeIcon] = useClosable( { closable: params[0], closeIcon: params[1], }, null, { closable: params[2], }, ); useEffect(() => { expect(closable).toBe(res[0]); }, [closable]); return
hooks test {closeIcon}
; }; const { container } = render(); if (res[1] === '') { expect(container.querySelector('.anticon-close')).toBeFalsy(); } else { expect(container.querySelector(`${res[1]}`)).toBeTruthy(); } }); }); it('useClosable with defaultCloseIcon', () => { const App = () => { const [closable, closeIcon] = useClosable( { closable: true, }, null, { closeIcon: , }, ); useEffect(() => { expect(closable).toBe(true); }, [closable]); return
hooks test {closeIcon}
; }; const { container } = render(); expect(container.querySelector('.custom-close-icon')).toBeTruthy(); }); it('useClosable without defaultCloseIcon', () => { const App = () => { const [closable, closeIcon] = useClosable( { closable: true, }, null, ); useEffect(() => { expect(closable).toBe(true); }, [closable]); return
hooks test {closeIcon}
; }; const { container } = render(); expect(container.querySelector('.anticon-close')).toBeTruthy(); }); it('useClosable with customCloseIconRender', () => { const App = () => { const customCloseIconRender = (icon: React.ReactNode) => ( {icon} ); const [closable, closeIcon] = useClosable( { closable: true, }, null, { closeIconRender: customCloseIconRender, }, ); useEffect(() => { expect(closable).toBe(true); }, [closable]); return
hooks test {closeIcon}
; }; const { container } = render(); expect(container.querySelector('.custom-close-wrapper')).toBeTruthy(); }); });