@@ -290,49 +290,99 @@ describe('Test component: GenericTree', () => {
290290 selectableWrapper = mountComponent ( { tickeable : true } ) ;
291291 } ) ;
292292
293+ /**
294+ * Helper function to create a mock event object with spied stopPropagation.
295+ * @returns Mock event object.
296+ */
297+ function createMockEvent ( ) {
298+ return {
299+ stopPropagation : vi . fn ( ) ,
300+ } ;
301+ }
302+
303+ it ( 'should call event.stopPropagation() to prevent event bubbling' , ( ) => {
304+ const event = createMockEvent ( ) ;
305+ selectableWrapper . vm . toggleNodeSelection ( 'folder-1' , event ) ;
306+
307+ expect ( event . stopPropagation ) . toHaveBeenCalledOnce ( ) ;
308+ } ) ;
309+
293310 it ( 'should add a node to tickedNodes when not already selected' , ( ) => {
294- selectableWrapper . vm . toggleNodeSelection ( 'folder-1' ) ;
311+ const event = createMockEvent ( ) ;
312+ selectableWrapper . vm . toggleNodeSelection ( 'folder-1' , event ) ;
295313
296314 expect ( selectableWrapper . vm . tickedNodes ) . toContain ( 'folder-1' ) ;
315+ expect ( event . stopPropagation ) . toHaveBeenCalledOnce ( ) ;
297316 } ) ;
298317
299318 it ( 'should remove a node from tickedNodes when already selected' , ( ) => {
300- selectableWrapper . vm . toggleNodeSelection ( 'folder-1' ) ;
301- selectableWrapper . vm . toggleNodeSelection ( 'folder-1' ) ;
319+ const event = createMockEvent ( ) ;
320+ selectableWrapper . vm . toggleNodeSelection ( 'folder-1' , event ) ;
321+ selectableWrapper . vm . toggleNodeSelection ( 'folder-1' , event ) ;
302322
303323 expect ( selectableWrapper . vm . tickedNodes ) . not . toContain ( 'folder-1' ) ;
324+ expect ( event . stopPropagation ) . toHaveBeenCalledTimes ( 2 ) ;
304325 } ) ;
305326
306- it ( 'should handle multiple node selections' , ( ) => {
307- selectableWrapper . vm . toggleNodeSelection ( 'folder-1' ) ;
308- selectableWrapper . vm . toggleNodeSelection ( 'file-1' ) ;
327+ it ( 'should handle multiple node selections with different events' , ( ) => {
328+ const event1 = createMockEvent ( ) ;
329+ const event2 = createMockEvent ( ) ;
330+ selectableWrapper . vm . toggleNodeSelection ( 'folder-1' , event1 ) ;
331+ selectableWrapper . vm . toggleNodeSelection ( 'file-1' , event2 ) ;
309332
310333 expect ( selectableWrapper . vm . tickedNodes ) . toContain ( 'folder-1' ) ;
311334 expect ( selectableWrapper . vm . tickedNodes ) . toContain ( 'file-1' ) ;
312335 expect ( selectableWrapper . vm . tickedNodes ) . toHaveLength ( 2 ) ;
336+ expect ( event1 . stopPropagation ) . toHaveBeenCalledOnce ( ) ;
337+ expect ( event2 . stopPropagation ) . toHaveBeenCalledOnce ( ) ;
313338 } ) ;
314339
315340 it ( 'should maintain other selections when toggling a new node' , ( ) => {
316- selectableWrapper . vm . toggleNodeSelection ( 'folder-1' ) ;
317- selectableWrapper . vm . toggleNodeSelection ( 'file-1' ) ;
318- selectableWrapper . vm . toggleNodeSelection ( 'file-1' ) ;
341+ const event = createMockEvent ( ) ;
342+ selectableWrapper . vm . toggleNodeSelection ( 'folder-1' , event ) ;
343+ selectableWrapper . vm . toggleNodeSelection ( 'file-1' , event ) ;
344+ selectableWrapper . vm . toggleNodeSelection ( 'file-1' , event ) ;
319345
320346 expect ( selectableWrapper . vm . tickedNodes ) . toEqual ( [ 'folder-1' ] ) ;
347+ expect ( event . stopPropagation ) . toHaveBeenCalledTimes ( 3 ) ;
321348 } ) ;
322349
323- it ( 'should not toggle when tickeable is false' , ( ) => {
350+ it ( 'should not toggle and not call stopPropagation when tickeable is false' , ( ) => {
351+ const event = createMockEvent ( ) ;
324352 const nonSelectableWrapper = mountComponent ( { tickeable : false } ) ;
325- nonSelectableWrapper . vm . toggleNodeSelection ( 'folder-1' ) ;
353+ nonSelectableWrapper . vm . toggleNodeSelection ( 'folder-1' , event ) ;
326354
327355 expect ( nonSelectableWrapper . vm . tickedNodes ) . not . toContain ( 'folder-1' ) ;
356+ expect ( event . stopPropagation ) . not . toHaveBeenCalled ( ) ;
328357 } ) ;
329358
330- it ( 'should emit update:ticked even for a single node toggle' , ( ) => {
331- selectableWrapper . vm . toggleNodeSelection ( 'folder-1' ) ;
359+ it ( 'should emit update:ticked with correct payload after adding a node' , ( ) => {
360+ const event = createMockEvent ( ) ;
361+ selectableWrapper . vm . toggleNodeSelection ( 'folder-1' , event ) ;
332362
333363 const emitted = selectableWrapper . emitted ( 'update:ticked' ) ;
334364 expect ( emitted ) . toBeTruthy ( ) ;
335- expect ( emitted . length ) . toBeGreaterThan ( 0 ) ;
365+ expect ( emitted [ 0 ] [ 0 ] ) . toEqual ( [ 'folder-1' ] ) ;
366+ } ) ;
367+
368+ it ( 'should emit update:ticked with empty array when toggling off the last node' , ( ) => {
369+ const event = createMockEvent ( ) ;
370+ selectableWrapper . vm . toggleNodeSelection ( 'folder-1' , event ) ;
371+ selectableWrapper . vm . toggleNodeSelection ( 'folder-1' , event ) ;
372+
373+ const emitted = selectableWrapper . emitted ( 'update:ticked' ) ;
374+ expect ( emitted [ emitted . length - 1 ] [ 0 ] ) . toEqual ( [ ] ) ;
375+ } ) ;
376+
377+ it ( 'should correctly handle sequential toggles with event stopPropagation' , ( ) => {
378+ const event = createMockEvent ( ) ;
379+
380+ selectableWrapper . vm . toggleNodeSelection ( 'folder-1' , event ) ;
381+ selectableWrapper . vm . toggleNodeSelection ( 'file-1' , event ) ;
382+ selectableWrapper . vm . toggleNodeSelection ( 'folder-1' , event ) ;
383+
384+ expect ( event . stopPropagation ) . toHaveBeenCalledTimes ( 3 ) ;
385+ expect ( selectableWrapper . vm . tickedNodes ) . toEqual ( [ 'file-1' ] ) ;
336386 } ) ;
337387 } ) ;
338388
0 commit comments