@@ -144,6 +144,35 @@ describe("approve_workflow_run", () => {
144144 expect ( mockApproveWorkflowRun ) . toHaveBeenCalledTimes ( 1 ) ;
145145 } ) ;
146146
147+ it ( "rejects a run when any associated pull request is from a fork by default" , async ( ) => {
148+ mockGetWorkflowRun . mockResolvedValue ( {
149+ data : { ...pendingPullRequestRun , pull_requests : [ { number : 42 } , { number : 43 } ] } ,
150+ } ) ;
151+ mockGetPullRequest . mockImplementation ( async ( { pull_number : pullRequestNumber } ) => ( {
152+ data : { head : { repo : { fork : pullRequestNumber === 43 } } } ,
153+ } ) ) ;
154+ const { main } = require ( "./approve_workflow_run.cjs" ) ;
155+ const handler = await main ( externalTokenConfig ) ;
156+
157+ const result = await handler ( { run_id : 123 } , { } ) ;
158+
159+ expect ( result . success ) . toBe ( false ) ;
160+ expect ( result . error ) . toContain ( "set fork: true" ) ;
161+ expect ( mockApproveWorkflowRun ) . not . toHaveBeenCalled ( ) ;
162+ } ) ;
163+
164+ it ( "rejects pull requests with an unavailable fork repository" , async ( ) => {
165+ mockGetPullRequest . mockResolvedValue ( { data : { head : { repo : null } } } ) ;
166+ const { main } = require ( "./approve_workflow_run.cjs" ) ;
167+ const handler = await main ( externalTokenConfig ) ;
168+
169+ const result = await handler ( { run_id : 123 } , { } ) ;
170+
171+ expect ( result . success ) . toBe ( false ) ;
172+ expect ( result . error ) . toContain ( "fork repository is unavailable" ) ;
173+ expect ( mockApproveWorkflowRun ) . not . toHaveBeenCalled ( ) ;
174+ } ) ;
175+
147176 it ( "rejects pull_request_target events before accessing GitHub" , async ( ) => {
148177 global . context . eventName = "pull_request_target" ;
149178 const { main } = require ( "./approve_workflow_run.cjs" ) ;
@@ -279,4 +308,14 @@ describe("approve_workflow_run", () => {
279308 expect ( ( await handler ( { run_id : 123 } , { } ) ) . success ) . toBe ( true ) ;
280309 expect ( mockApproveWorkflowRun ) . toHaveBeenCalledTimes ( 1 ) ;
281310 } ) ;
311+
312+ it ( "does not consume the maximum when approval fails" , async ( ) => {
313+ mockApproveWorkflowRun . mockRejectedValueOnce ( new Error ( "temporary API failure" ) ) . mockResolvedValueOnce ( { status : 201 } ) ;
314+ const { main } = require ( "./approve_workflow_run.cjs" ) ;
315+ const handler = await main ( { ...externalTokenConfig , max : 1 } ) ;
316+
317+ expect ( ( await handler ( { run_id : 122 } , { } ) ) . success ) . toBe ( false ) ;
318+ expect ( ( await handler ( { run_id : 123 } , { } ) ) . success ) . toBe ( true ) ;
319+ expect ( mockApproveWorkflowRun ) . toHaveBeenCalledTimes ( 2 ) ;
320+ } ) ;
282321} ) ;
0 commit comments