@@ -109,7 +109,7 @@ describe('createForwardHandler', () => {
109109
110110 it ( 'sends positive ack on successful forward' , async ( ) => {
111111 mockForwarder . forward . mockResolvedValue ( {
112- success : true ,
112+ kind : 'sync_success' ,
113113 statusCode : 200 ,
114114 duration : 50 ,
115115 } ) ;
@@ -126,9 +126,51 @@ describe('createForwardHandler', () => {
126126 expect ( mockClient . sendAck ) . toHaveBeenCalledWith ( 'hook-123' , true ) ;
127127 } ) ;
128128
129+ it ( 'sends async ack when forward target returns 202' , async ( ) => {
130+ mockForwarder . forward . mockResolvedValue ( {
131+ kind : 'async_accepted' ,
132+ asyncTimeout : 600 ,
133+ duration : 50 ,
134+ } ) ;
135+
136+ const handler = createForwardHandler (
137+ ( ) => mockClient as any ,
138+ mockForwarder as any ,
139+ false
140+ ) ;
141+
142+ await handler ( createHook ( { ackUrl : 'https://api.posthook.io/ack' , nackUrl : 'https://api.posthook.io/nack' } ) , emptyQueue ) ;
143+
144+ expect ( mockClient . sendAck ) . toHaveBeenCalledWith ( 'hook-123' , true , null , {
145+ async : true ,
146+ timeout : 600 ,
147+ } ) ;
148+ } ) ;
149+
150+ it ( 'rejects 202 when callback URLs are unavailable' , async ( ) => {
151+ mockForwarder . forward . mockResolvedValue ( {
152+ kind : 'async_accepted' ,
153+ duration : 50 ,
154+ } ) ;
155+
156+ const handler = createForwardHandler (
157+ ( ) => mockClient as any ,
158+ mockForwarder as any ,
159+ false
160+ ) ;
161+
162+ await handler ( createHook ( { ackUrl : undefined , nackUrl : undefined } ) , emptyQueue ) ;
163+
164+ expect ( mockClient . sendAck ) . toHaveBeenCalledWith (
165+ 'hook-123' ,
166+ false ,
167+ 'Forward target returned 202 but async callback URLs are unavailable'
168+ ) ;
169+ } ) ;
170+
129171 it ( 'sends negative ack on failed forward' , async ( ) => {
130172 mockForwarder . forward . mockResolvedValue ( {
131- success : false ,
173+ kind : 'failure' ,
132174 statusCode : 500 ,
133175 error : 'Internal Server Error' ,
134176 duration : 100 ,
@@ -147,8 +189,7 @@ describe('createForwardHandler', () => {
147189
148190 it ( 'does not send ack when request was aborted' , async ( ) => {
149191 mockForwarder . forward . mockResolvedValue ( {
150- success : false ,
151- aborted : true ,
192+ kind : 'aborted' ,
152193 error : 'Request aborted' ,
153194 duration : 5000 ,
154195 } ) ;
@@ -164,11 +205,11 @@ describe('createForwardHandler', () => {
164205 expect ( mockClient . sendAck ) . not . toHaveBeenCalled ( ) ;
165206 } ) ;
166207
167- it ( 'sends negative ack with default message when error is undefined ' , async ( ) => {
208+ it ( 'sends negative ack with returned error message ' , async ( ) => {
168209 mockForwarder . forward . mockResolvedValue ( {
169- success : false ,
210+ kind : 'failure' ,
170211 statusCode : 502 ,
171- error : undefined ,
212+ error : 'Forward failed' ,
172213 duration : 100 ,
173214 } ) ;
174215
@@ -185,7 +226,7 @@ describe('createForwardHandler', () => {
185226
186227 it ( 'logs verbose output when verbose flag is true' , async ( ) => {
187228 mockForwarder . forward . mockResolvedValue ( {
188- success : true ,
229+ kind : 'sync_success' ,
189230 statusCode : 200 ,
190231 duration : 50 ,
191232 } ) ;
@@ -210,7 +251,7 @@ describe('createForwardHandler', () => {
210251
211252 it ( 'logs Posthook-* headers in verbose mode when present' , async ( ) => {
212253 mockForwarder . forward . mockResolvedValue ( {
213- success : true ,
254+ kind : 'sync_success' ,
214255 statusCode : 200 ,
215256 duration : 50 ,
216257 } ) ;
@@ -245,7 +286,7 @@ describe('createForwardHandler', () => {
245286
246287 it ( 'omits Posthook-* headers in verbose mode when absent' , async ( ) => {
247288 mockForwarder . forward . mockResolvedValue ( {
248- success : true ,
289+ kind : 'sync_success' ,
249290 statusCode : 200 ,
250291 duration : 50 ,
251292 } ) ;
@@ -271,7 +312,7 @@ describe('createForwardHandler', () => {
271312
272313 it ( 'handles hook without forwardRequest in verbose mode gracefully' , async ( ) => {
273314 mockForwarder . forward . mockResolvedValue ( {
274- success : true ,
315+ kind : 'sync_success' ,
275316 statusCode : 200 ,
276317 duration : 50 ,
277318 } ) ;
0 commit comments