@@ -58,24 +58,28 @@ describe("Modal", () => {
5858 } ) ;
5959
6060 it ( "opens and closes properly" , async ( ) => {
61- const consoleLog = vi . spyOn ( console , "log" ) ;
6261 const { component } = render ( ModalTest , {
6362 props : {
6463 open : false ,
6564 modalHeading : "Test Modal" ,
6665 } ,
6766 } ) ;
6867
68+ const openHandler = vi . fn ( ) ;
69+ const closeHandler = vi . fn ( ) ;
70+ component . $on ( "open" , openHandler ) ;
71+ component . $on ( "close" , closeHandler ) ;
72+
6973 // Open the modal
7074 component . $set ( { open : true } ) ;
7175 await tick ( ) ;
7276 expect ( screen . getByRole ( "dialog" ) ) . toBeInTheDocument ( ) ;
73- expect ( consoleLog ) . toHaveBeenCalledWith ( "open" ) ;
77+ expect ( openHandler ) . toHaveBeenCalledTimes ( 1 ) ;
7478
7579 // Close the modal
7680 component . $set ( { open : false } ) ;
7781 await tick ( ) ;
78- expect ( consoleLog ) . toHaveBeenCalledWith ( "close" ) ;
82+ expect ( closeHandler ) . toHaveBeenCalledTimes ( 1 ) ;
7983 } ) ;
8084
8185 it ( "handles form submission" , async ( ) => {
@@ -251,34 +255,102 @@ describe("Modal", () => {
251255 ) . toBeInTheDocument ( ) ;
252256 } ) ;
253257
254- it ( "handles closing through various methods" , async ( ) => {
255- const consoleLog = vi . spyOn ( console , "log" ) ;
258+ it ( "dispatches close event with escape-key trigger" , async ( ) => {
256259 const { component } = render ( ModalTest , {
257260 props : {
258261 open : true ,
259- modalHeading : "Close Test Modal " ,
262+ modalHeading : "Escape Key Test " ,
260263 } ,
261264 } ) ;
262265
263- // Close via escape key
266+ const closeHandler = vi . fn ( ) ;
267+ component . $on ( "close" , closeHandler ) ;
268+
264269 await user . keyboard ( "{Escape}" ) ;
265- expect ( consoleLog ) . toHaveBeenCalledWith ( "close" ) ;
270+ await tick ( ) ;
266271
267- component . $set ( { open : true } ) ;
272+ expect ( closeHandler ) . toHaveBeenCalledTimes ( 1 ) ;
273+ expect ( closeHandler . mock . calls [ 0 ] [ 0 ] . detail ) . toEqual ( {
274+ trigger : "escape-key" ,
275+ } ) ;
276+ } ) ;
277+
278+ it ( "dispatches close event with outside-click trigger" , async ( ) => {
279+ const { container, component } = render ( ModalTest , {
280+ props : {
281+ open : true ,
282+ modalHeading : "Outside Click Test" ,
283+ } ,
284+ } ) ;
285+
286+ const closeHandler = vi . fn ( ) ;
287+ component . $on ( "close" , closeHandler ) ;
288+
289+ // Click on the modal overlay
290+ const modalOverlay = container . querySelector ( ".bx--modal" ) ;
291+ assert ( modalOverlay ) ;
292+ await user . click ( modalOverlay ) ;
268293 await tick ( ) ;
269294
270- expect ( consoleLog ) . toHaveBeenCalledWith ( "open" ) ;
295+ expect ( closeHandler ) . toHaveBeenCalledTimes ( 1 ) ;
296+ expect ( closeHandler . mock . calls [ 0 ] [ 0 ] . detail ) . toEqual ( {
297+ trigger : "outside-click" ,
298+ } ) ;
299+ } ) ;
271300
272- // Close via clicking outside
273- await user . click ( document . body ) ;
274- expect ( consoleLog ) . toHaveBeenCalledWith ( "close" ) ;
301+ it ( "dispatches close event with close-button trigger" , async ( ) => {
302+ const { component } = render ( ModalTest , {
303+ props : {
304+ open : true ,
305+ modalHeading : "Close Button Test" ,
306+ } ,
307+ } ) ;
275308
276- component . $set ( { open : true } ) ;
309+ const closeHandler = vi . fn ( ) ;
310+ component . $on ( "close" , closeHandler ) ;
311+
312+ const closeButton = screen . getByLabelText ( "Close the modal" ) ;
313+ await user . click ( closeButton ) ;
314+ await tick ( ) ;
315+
316+ expect ( closeHandler ) . toHaveBeenCalledTimes ( 1 ) ;
317+ expect ( closeHandler . mock . calls [ 0 ] [ 0 ] . detail ) . toEqual ( {
318+ trigger : "close-button" ,
319+ } ) ;
320+ } ) ;
321+
322+ it ( "prevents closing when preventDefault is called on close event" , async ( ) => {
323+ const { container, component } = render ( ModalTest , {
324+ props : {
325+ open : true ,
326+ modalHeading : "Prevent Close Test" ,
327+ } ,
328+ } ) ;
329+
330+ const closeHandler = vi . fn ( ( e ) => {
331+ e . preventDefault ( ) ;
332+ } ) ;
333+ component . $on ( "close" , closeHandler ) ;
334+
335+ // Close via escape key.
336+ await user . keyboard ( "{Escape}" ) ;
277337 await tick ( ) ;
338+ expect ( closeHandler ) . toHaveBeenCalledTimes ( 1 ) ;
339+ expect ( screen . getByRole ( "dialog" ) ) . toBeInTheDocument ( ) ;
278340
279- // Close via close button
341+ // Close via outside click.
342+ const modalOverlay = container . querySelector ( ".bx--modal" ) ;
343+ assert ( modalOverlay ) ;
344+ await user . click ( modalOverlay ) ;
345+ await tick ( ) ;
346+ expect ( closeHandler ) . toHaveBeenCalledTimes ( 2 ) ;
347+ expect ( screen . getByRole ( "dialog" ) ) . toBeInTheDocument ( ) ;
348+
349+ // Close via close button.
280350 const closeButton = screen . getByLabelText ( "Close the modal" ) ;
281351 await user . click ( closeButton ) ;
282- expect ( consoleLog ) . toHaveBeenCalledWith ( "close" ) ;
352+ await tick ( ) ;
353+ expect ( closeHandler ) . toHaveBeenCalledTimes ( 3 ) ;
354+ expect ( screen . getByRole ( "dialog" ) ) . toBeInTheDocument ( ) ;
283355 } ) ;
284356} ) ;
0 commit comments