@@ -25,7 +25,7 @@ global.context = {
2525global . github = {
2626 rest : {
2727 actions : {
28- createWorkflowDispatch : vi . fn ( ) . mockResolvedValue ( { } ) ,
28+ createWorkflowDispatch : vi . fn ( ) . mockResolvedValue ( { data : { workflow_run_id : 123456 } } ) ,
2929 } ,
3030 repos : {
3131 get : vi . fn ( ) . mockResolvedValue ( {
@@ -72,6 +72,7 @@ describe("dispatch_workflow handler factory", () => {
7272
7373 expect ( result . success ) . toBe ( true ) ;
7474 expect ( result . workflow_name ) . toBe ( "test-workflow" ) ;
75+ expect ( result . run_id ) . toBe ( 123456 ) ;
7576 // Should use the extension from config
7677 expect ( github . rest . actions . createWorkflowDispatch ) . toHaveBeenCalledWith ( {
7778 owner : "test-owner" ,
@@ -82,6 +83,7 @@ describe("dispatch_workflow handler factory", () => {
8283 param1 : "value1" ,
8384 param2 : "42" ,
8485 } ,
86+ return_run_details : true ,
8587 } ) ;
8688 } ) ;
8789
@@ -232,6 +234,7 @@ describe("dispatch_workflow handler factory", () => {
232234 workflow_id : "no-inputs-workflow.lock.yml" ,
233235 ref : expect . any ( String ) ,
234236 inputs : { } , // Should pass empty object even when inputs property is missing
237+ return_run_details : true ,
235238 } ) ;
236239 } ) ;
237240
@@ -304,6 +307,7 @@ describe("dispatch_workflow handler factory", () => {
304307 workflow_id : "test-workflow.lock.yml" ,
305308 ref : "refs/heads/feature-branch" ,
306309 inputs : { } ,
310+ return_run_details : true ,
307311 } ) ;
308312 } ) ;
309313
@@ -334,6 +338,7 @@ describe("dispatch_workflow handler factory", () => {
334338 workflow_id : "test-workflow.lock.yml" ,
335339 ref : "refs/heads/main" ,
336340 inputs : { } ,
341+ return_run_details : true ,
337342 } ) ;
338343 } ) ;
339344
@@ -364,6 +369,7 @@ describe("dispatch_workflow handler factory", () => {
364369 workflow_id : "test-workflow.lock.yml" ,
365370 ref : "refs/heads/feature/add-new-feature" ,
366371 inputs : { } ,
372+ return_run_details : true ,
367373 } ) ;
368374 } ) ;
369375
@@ -396,6 +402,7 @@ describe("dispatch_workflow handler factory", () => {
396402 workflow_id : "test-workflow.lock.yml" ,
397403 ref : "refs/heads/develop" ,
398404 inputs : { } ,
405+ return_run_details : true ,
399406 } ) ;
400407 } ) ;
401408
@@ -439,6 +446,103 @@ describe("dispatch_workflow handler factory", () => {
439446 workflow_id : "test-workflow.lock.yml" ,
440447 ref : "refs/heads/staging" ,
441448 inputs : { } ,
449+ return_run_details : true ,
442450 } ) ;
443451 } ) ;
452+
453+ it ( "should return run_id when API returns workflow_run_id" , async ( ) => {
454+ github . rest . actions . createWorkflowDispatch . mockResolvedValueOnce ( {
455+ data : { workflow_run_id : 987654 } ,
456+ } ) ;
457+
458+ const config = {
459+ workflows : [ "test-workflow" ] ,
460+ workflow_files : { "test-workflow" : ".lock.yml" } ,
461+ } ;
462+ const handler = await main ( config ) ;
463+
464+ const result = await handler ( { type : "dispatch_workflow" , workflow_name : "test-workflow" , inputs : { } } , { } ) ;
465+
466+ expect ( result . success ) . toBe ( true ) ;
467+ expect ( result . run_id ) . toBe ( 987654 ) ;
468+ expect ( core . info ) . toHaveBeenCalledWith ( expect . stringContaining ( "run ID: 987654" ) ) ;
469+ } ) ;
470+
471+ it ( "should succeed without run_id when API returns no workflow_run_id" , async ( ) => {
472+ github . rest . actions . createWorkflowDispatch . mockResolvedValueOnce ( { data : { } } ) ;
473+
474+ const config = {
475+ workflows : [ "test-workflow" ] ,
476+ workflow_files : { "test-workflow" : ".lock.yml" } ,
477+ } ;
478+ const handler = await main ( config ) ;
479+
480+ const result = await handler ( { type : "dispatch_workflow" , workflow_name : "test-workflow" , inputs : { } } , { } ) ;
481+
482+ expect ( result . success ) . toBe ( true ) ;
483+ expect ( result . run_id ) . toBeUndefined ( ) ;
484+ } ) ;
485+
486+ it ( "should retry without return_run_details when API rejects with 422 mentioning it, and still succeed" , async ( ) => {
487+ const error = new Error ( "Unprocessable Entity" ) ;
488+ // @ts -ignore
489+ error . status = 422 ;
490+ // @ts -ignore
491+ error . response = { data : { message : "Unknown field 'return_run_details'" } } ;
492+
493+ github . rest . actions . createWorkflowDispatch . mockRejectedValueOnce ( error ) . mockResolvedValueOnce ( { data : { } } ) ;
494+
495+ const config = {
496+ workflows : [ "test-workflow" ] ,
497+ workflow_files : { "test-workflow" : ".lock.yml" } ,
498+ } ;
499+ const handler = await main ( config ) ;
500+
501+ const result = await handler ( { type : "dispatch_workflow" , workflow_name : "test-workflow" , inputs : { } } , { } ) ;
502+
503+ expect ( result . success ) . toBe ( true ) ;
504+ expect ( result . run_id ) . toBeUndefined ( ) ;
505+
506+ // First call should include return_run_details: true
507+ expect ( github . rest . actions . createWorkflowDispatch ) . toHaveBeenNthCalledWith ( 1 , {
508+ owner : "test-owner" ,
509+ repo : "test-repo" ,
510+ workflow_id : "test-workflow.lock.yml" ,
511+ ref : "refs/heads/main" ,
512+ inputs : { } ,
513+ return_run_details : true ,
514+ } ) ;
515+
516+ // Second call should retry without return_run_details
517+ expect ( github . rest . actions . createWorkflowDispatch ) . toHaveBeenNthCalledWith ( 2 , {
518+ owner : "test-owner" ,
519+ repo : "test-repo" ,
520+ workflow_id : "test-workflow.lock.yml" ,
521+ ref : "refs/heads/main" ,
522+ inputs : { } ,
523+ } ) ;
524+
525+ expect ( github . rest . actions . createWorkflowDispatch ) . toHaveBeenCalledTimes ( 2 ) ;
526+ } ) ;
527+
528+ it ( "should not retry when API rejects with 422 for an unrelated reason" , async ( ) => {
529+ const error = new Error ( "Unprocessable Entity" ) ;
530+ // @ts -ignore
531+ error . status = 422 ;
532+ // @ts -ignore
533+ error . response = { data : { message : "Workflow does not exist" } } ;
534+
535+ github . rest . actions . createWorkflowDispatch . mockRejectedValueOnce ( error ) ;
536+
537+ const config = {
538+ workflows : [ "test-workflow" ] ,
539+ workflow_files : { "test-workflow" : ".lock.yml" } ,
540+ } ;
541+ const handler = await main ( config ) ;
542+
543+ const result = await handler ( { type : "dispatch_workflow" , workflow_name : "test-workflow" , inputs : { } } , { } ) ;
544+
545+ expect ( result . success ) . toBe ( false ) ;
546+ expect ( github . rest . actions . createWorkflowDispatch ) . toHaveBeenCalledTimes ( 1 ) ;
547+ } ) ;
444548} ) ;
0 commit comments