@@ -332,4 +332,198 @@ describe('DesignerApp (V2)', () => {
332332
333333 expect ( mockPostMessage ) . toHaveBeenCalledWith ( { command : 'discardDraft' } ) ;
334334 } ) ;
335+
336+ it ( 'should dispatch setDraftSaving and update draft artifacts when saveDraftWorkflow is called' , ( ) => {
337+ const store = createTestStore ( { isDraftMode : true } ) ;
338+ render (
339+ < Provider store = { store } >
340+ < DesignerApp />
341+ </ Provider >
342+ ) ;
343+
344+ const definition = { triggers : { } , actions : { a1 : { type : 'Http' } } } ;
345+ const params = { p : { type : 'String' } } ;
346+ const conns = { c : { api : { id : '/test' } } } ;
347+ capturedCommandBarProps . saveDraftWorkflow ( definition , params , conns ) ;
348+
349+ // Verify Redux state was updated
350+ const state = store . getState ( ) . designer ;
351+ expect ( state . isDraftSaving ) . toBe ( true ) ;
352+ expect ( state . draftWorkflow ) . toEqual ( definition ) ;
353+ expect ( state . draftConnections ) . toEqual ( conns ) ;
354+ expect ( state . draftParameters ) . toEqual ( params ) ;
355+ } ) ;
356+
357+ it ( 'should clear draft state after discardDraft' , ( ) => {
358+ const store = createTestStore ( {
359+ isDraftMode : true ,
360+ hasDraft : true ,
361+ draftWorkflow : mockWorkflowDefinition ,
362+ } ) ;
363+ render (
364+ < Provider store = { store } >
365+ < DesignerApp />
366+ </ Provider >
367+ ) ;
368+
369+ capturedCommandBarProps . discardDraft ( ) ;
370+
371+ const state = store . getState ( ) . designer ;
372+ expect ( state . hasDraft ) . toBe ( false ) ;
373+ expect ( state . draftWorkflow ) . toBeNull ( ) ;
374+ expect ( state . draftConnections ) . toBeNull ( ) ;
375+ expect ( state . draftParameters ) . toBeNull ( ) ;
376+ } ) ;
377+
378+ it ( 'should dispatch setDraftMode when switchWorkflowMode is called with false' , ( ) => {
379+ const store = createTestStore ( {
380+ isDraftMode : true ,
381+ hasDraft : true ,
382+ draftWorkflow : mockDraftDefinition ,
383+ } ) ;
384+ render (
385+ < Provider store = { store } >
386+ < DesignerApp />
387+ </ Provider >
388+ ) ;
389+
390+ capturedCommandBarProps . switchWorkflowMode ( false ) ;
391+
392+ const state = store . getState ( ) . designer ;
393+ expect ( state . isDraftMode ) . toBe ( false ) ;
394+ } ) ;
395+
396+ it ( 'should dispatch setDraftMode when switchWorkflowMode is called with true' , ( ) => {
397+ const store = createTestStore ( {
398+ isDraftMode : false ,
399+ hasDraft : true ,
400+ draftWorkflow : mockDraftDefinition ,
401+ } ) ;
402+ render (
403+ < Provider store = { store } >
404+ < DesignerApp />
405+ </ Provider >
406+ ) ;
407+
408+ capturedCommandBarProps . switchWorkflowMode ( true ) ;
409+
410+ const state = store . getState ( ) . designer ;
411+ expect ( state . isDraftMode ) . toBe ( true ) ;
412+ } ) ;
413+
414+ it ( 'should pass isMonitoringView to DesignerCommandBar' , ( ) => {
415+ const store = createTestStore ( { isMonitoringView : true } ) ;
416+ render (
417+ < Provider store = { store } >
418+ < DesignerApp />
419+ </ Provider >
420+ ) ;
421+
422+ expect ( capturedCommandBarProps . isMonitoringView ) . toBe ( true ) ;
423+ } ) ;
424+
425+ it ( 'should pass isUnitTest and isLocal to DesignerCommandBar' , ( ) => {
426+ const store = createTestStore ( { isUnitTest : true , isLocal : false } ) ;
427+ render (
428+ < Provider store = { store } >
429+ < DesignerApp />
430+ </ Provider >
431+ ) ;
432+
433+ expect ( capturedCommandBarProps . isUnitTest ) . toBe ( true ) ;
434+ expect ( capturedCommandBarProps . isLocal ) . toBe ( false ) ;
435+ } ) ;
436+
437+ it ( 'should render floating run button' , ( ) => {
438+ const store = createTestStore ( ) ;
439+ render (
440+ < Provider store = { store } >
441+ < DesignerApp />
442+ </ Provider >
443+ ) ;
444+ expect ( screen . getByTestId ( 'floating-run-button' ) ) . toBeDefined ( ) ;
445+ } ) ;
446+
447+ it ( 'should use published connections when hasDraft but draftConnections is null' , ( ) => {
448+ const store = createTestStore ( {
449+ isDraftMode : true ,
450+ hasDraft : true ,
451+ draftConnections : null ,
452+ } ) ;
453+ render (
454+ < Provider store = { store } >
455+ < DesignerApp />
456+ </ Provider >
457+ ) ;
458+
459+ // Falls through to published since draftConnections is null
460+ expect ( mockConvertConnectionsDataToReferences ) . toHaveBeenCalled ( ) ;
461+ } ) ;
462+
463+ it ( 'should use published parameters when hasDraft but draftParameters is null' , ( ) => {
464+ const store = createTestStore ( {
465+ isDraftMode : true ,
466+ hasDraft : true ,
467+ draftParameters : null ,
468+ } ) ;
469+ render (
470+ < Provider store = { store } >
471+ < DesignerApp />
472+ </ Provider >
473+ ) ;
474+
475+ const provider = screen . getByTestId ( 'bjs-workflow-provider' ) ;
476+ const workflowData = JSON . parse ( provider . getAttribute ( 'data-workflow' ) || '{}' ) ;
477+ expect ( workflowData . parameters ) . toEqual ( { publishedParam : { type : 'String' , value : 'pub' } } ) ;
478+ } ) ;
479+
480+ it ( 'should pass saveWorkflow and discard callbacks to command bar' , ( ) => {
481+ const store = createTestStore ( ) ;
482+ render (
483+ < Provider store = { store } >
484+ < DesignerApp />
485+ </ Provider >
486+ ) ;
487+
488+ expect ( typeof capturedCommandBarProps . saveWorkflow ) . toBe ( 'function' ) ;
489+ expect ( typeof capturedCommandBarProps . saveWorkflowFromCode ) . toBe ( 'function' ) ;
490+ expect ( typeof capturedCommandBarProps . discard ) . toBe ( 'function' ) ;
491+ expect ( typeof capturedCommandBarProps . switchToDesignerView ) . toBe ( 'function' ) ;
492+ expect ( typeof capturedCommandBarProps . switchToCodeView ) . toBe ( 'function' ) ;
493+ expect ( typeof capturedCommandBarProps . switchToMonitoringView ) . toBe ( 'function' ) ;
494+ } ) ;
495+
496+ it ( 'should post save command and clear draft when saveWorkflow is called' , async ( ) => {
497+ const store = createTestStore ( {
498+ isDraftMode : true ,
499+ hasDraft : true ,
500+ draftWorkflow : mockWorkflowDefinition ,
501+ } ) ;
502+ render (
503+ < Provider store = { store } >
504+ < DesignerApp />
505+ </ Provider >
506+ ) ;
507+
508+ const workflow = {
509+ definition : { triggers : { } , actions : { } } ,
510+ parameters : { p : { type : 'String' } } ,
511+ connectionReferences : { c : { api : { id : '/test' } } } ,
512+ } ;
513+ const clearDirtyState = vi . fn ( ) ;
514+ await capturedCommandBarProps . saveWorkflow ( workflow , undefined , clearDirtyState ) ;
515+
516+ expect ( mockPostMessage ) . toHaveBeenCalledWith ( {
517+ command : 'save' ,
518+ definition : workflow . definition ,
519+ parameters : workflow . parameters ,
520+ connectionReferences : workflow . connectionReferences ,
521+ customCodeData : undefined ,
522+ } ) ;
523+ expect ( clearDirtyState ) . toHaveBeenCalled ( ) ;
524+ // Draft state should be cleared
525+ const state = store . getState ( ) . designer ;
526+ expect ( state . hasDraft ) . toBe ( false ) ;
527+ expect ( state . draftWorkflow ) . toBeNull ( ) ;
528+ } ) ;
335529} ) ;
0 commit comments