@@ -528,4 +528,92 @@ describe('TableWidget', () => {
528528 expect ( model . save_changes ) . toHaveBeenCalled ( ) ;
529529 } ) ;
530530 } ) ;
531+
532+ describe ( 'Deferred Mode UI' , ( ) => {
533+ it ( 'should show deferred message and hide table when in deferred mode' , ( ) => {
534+ // Mock deferred mode = true
535+ model . get . mockImplementation ( ( property ) => {
536+ if ( property === 'is_deferred_mode' ) return true ;
537+ if ( property === 'table_html' ) return '<table></table>' ;
538+ return null ;
539+ } ) ;
540+
541+ render ( { model, el } ) ;
542+
543+ const deferredContainer = el . querySelector ( '.deferred-message' ) ;
544+ const tableContainer = el . querySelector ( '.table-container' ) ;
545+ const footer = el . querySelector ( '.footer' ) ;
546+
547+ expect ( deferredContainer . style . display ) . toBe ( 'flex' ) ;
548+ expect ( tableContainer . style . display ) . toBe ( 'none' ) ;
549+ expect ( footer . style . display ) . toBe ( 'none' ) ;
550+ expect ( deferredContainer . textContent ) . toContain (
551+ 'This is a preview of the widget' ,
552+ ) ;
553+ } ) ;
554+
555+ it ( 'should show table and hide deferred message when not in deferred mode' , ( ) => {
556+ // Mock deferred mode = false
557+ model . get . mockImplementation ( ( property ) => {
558+ if ( property === 'is_deferred_mode' ) return false ;
559+ if ( property === 'table_html' ) return '<table></table>' ;
560+ return null ;
561+ } ) ;
562+
563+ render ( { model, el } ) ;
564+
565+ const deferredContainer = el . querySelector ( '.deferred-message' ) ;
566+ const tableContainer = el . querySelector ( '.table-container' ) ;
567+ const footer = el . querySelector ( '.footer' ) ;
568+
569+ expect ( deferredContainer . style . display ) . toBe ( 'none' ) ;
570+ expect ( tableContainer . style . display ) . toBe ( 'block' ) ;
571+ expect ( footer . style . display ) . toBe ( 'flex' ) ;
572+ } ) ;
573+
574+ it ( 'should trigger start_execution when run button is clicked' , ( ) => {
575+ model . get . mockImplementation ( ( property ) => {
576+ if ( property === 'is_deferred_mode' ) return true ;
577+ return null ;
578+ } ) ;
579+
580+ render ( { model, el } ) ;
581+
582+ const runButton = el . querySelector ( '.run-button' ) ;
583+ runButton . click ( ) ;
584+
585+ expect ( model . set ) . toHaveBeenCalledWith ( 'start_execution' , true ) ;
586+ expect ( model . save_changes ) . toHaveBeenCalled ( ) ;
587+ expect ( runButton . textContent ) . toBe ( 'Running...' ) ;
588+ expect ( runButton . disabled ) . toBe ( true ) ;
589+ } ) ;
590+
591+ it ( 'should update UI when is_deferred_mode changes' , ( ) => {
592+ // Start in deferred mode
593+ let isDeferred = true ;
594+ model . get . mockImplementation ( ( property ) => {
595+ if ( property === 'is_deferred_mode' ) return isDeferred ;
596+ if ( property === 'table_html' ) return '<table></table>' ;
597+ return null ;
598+ } ) ;
599+
600+ render ( { model, el } ) ;
601+
602+ const deferredContainer = el . querySelector ( '.deferred-message' ) ;
603+ const tableContainer = el . querySelector ( '.table-container' ) ;
604+
605+ expect ( deferredContainer . style . display ) . toBe ( 'flex' ) ;
606+ expect ( tableContainer . style . display ) . toBe ( 'none' ) ;
607+
608+ // Change to non-deferred mode
609+ isDeferred = false ;
610+ const changeHandler = model . on . mock . calls . find (
611+ ( call ) => call [ 0 ] === 'change:is_deferred_mode' ,
612+ ) [ 1 ] ;
613+ changeHandler ( ) ;
614+
615+ expect ( deferredContainer . style . display ) . toBe ( 'none' ) ;
616+ expect ( tableContainer . style . display ) . toBe ( 'block' ) ;
617+ } ) ;
618+ } ) ;
531619} ) ;
0 commit comments