@@ -234,6 +234,80 @@ func TestFacilitatorClient_Verify_WithoutAuthorization(t *testing.T) {
234234 }
235235}
236236
237+ func TestFacilitatorClient_Verify_Hooks (t * testing.T ) {
238+ mockServer := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
239+ response := facilitator.VerifyResponse {IsValid : true }
240+ w .Header ().Set ("Content-Type" , "application/json" )
241+ if err := json .NewEncoder (w ).Encode (response ); err != nil {
242+ t .Errorf ("Failed to encode response: %v" , err )
243+ }
244+ }))
245+ defer mockServer .Close ()
246+
247+ var beforeCalled , afterCalled bool
248+ var capturedPayload x402.PaymentPayload
249+
250+ client := & FacilitatorClient {
251+ BaseURL : mockServer .URL ,
252+ Client : & http.Client {},
253+ Timeouts : x402 .DefaultTimeouts ,
254+ OnBeforeVerify : func (ctx context.Context , p x402.PaymentPayload , r x402.PaymentRequirement ) error {
255+ beforeCalled = true
256+ capturedPayload = p
257+ return nil
258+ },
259+ OnAfterVerify : func (ctx context.Context , p x402.PaymentPayload , r x402.PaymentRequirement , resp * facilitator.VerifyResponse , err error ) {
260+ afterCalled = true
261+ if err != nil {
262+ t .Errorf ("OnAfterVerify received unexpected error: %v" , err )
263+ }
264+ if resp == nil || ! resp .IsValid {
265+ t .Error ("OnAfterVerify did not receive valid response" )
266+ }
267+ },
268+ }
269+
270+ payload := x402.PaymentPayload {X402Version : 1 , Scheme : "exact" }
271+ requirement := x402.PaymentRequirement {Scheme : "exact" }
272+
273+ _ , err := client .Verify (context .Background (), payload , requirement )
274+ if err != nil {
275+ t .Fatalf ("Verify failed: %v" , err )
276+ }
277+
278+ if ! beforeCalled {
279+ t .Error ("OnBeforeVerify was not called" )
280+ }
281+ if ! afterCalled {
282+ t .Error ("OnAfterVerify was not called" )
283+ }
284+ if capturedPayload .Scheme != "exact" {
285+ t .Error ("OnBeforeVerify did not receive correct payload" )
286+ }
287+ }
288+
289+ func TestFacilitatorClient_Verify_OnBeforeAbort (t * testing.T ) {
290+ mockServer := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
291+ t .Error ("Server was reached despite OnBeforeVerify error" )
292+ }))
293+ defer mockServer .Close ()
294+
295+ expectedErr := x402 .ErrVerificationFailed
296+
297+ client := & FacilitatorClient {
298+ BaseURL : mockServer .URL ,
299+ Client : & http.Client {},
300+ OnBeforeVerify : func (ctx context.Context , pp x402.PaymentPayload , pr x402.PaymentRequirement ) error {
301+ return expectedErr
302+ },
303+ }
304+
305+ _ , err := client .Verify (context .Background (), x402.PaymentPayload {}, x402.PaymentRequirement {})
306+ if err != expectedErr {
307+ t .Errorf ("Expected error %v, got %v" , expectedErr , err )
308+ }
309+ }
310+
237311func TestFacilitatorClient_Settle_WithStaticAuthorization (t * testing.T ) {
238312 expectedAuth := "Bearer settle-api-key"
239313
@@ -396,3 +470,66 @@ func TestFacilitatorClient_Settle(t *testing.T) {
396470 t .Error ("Expected transaction hash" )
397471 }
398472}
473+
474+ func TestFacilitatorClient_Settle_Hooks (t * testing.T ) {
475+ mockServer := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
476+ response := x402.SettlementResponse {Success : true , Transaction : "0x123" }
477+ w .Header ().Set ("Content-Type" , "application/json" )
478+ if err := json .NewEncoder (w ).Encode (response ); err != nil {
479+ t .Errorf ("Failed to encode response: %v" , err )
480+ }
481+ }))
482+ defer mockServer .Close ()
483+
484+ var beforeCalled , afterCalled bool
485+
486+ client := & FacilitatorClient {
487+ BaseURL : mockServer .URL ,
488+ Client : & http.Client {},
489+ Timeouts : x402 .DefaultTimeouts ,
490+ OnBeforeSettle : func (ctx context.Context , p x402.PaymentPayload , r x402.PaymentRequirement ) error {
491+ beforeCalled = true
492+ return nil
493+ },
494+ OnAfterSettle : func (ctx context.Context , p x402.PaymentPayload , r x402.PaymentRequirement , resp * x402.SettlementResponse , err error ) {
495+ afterCalled = true
496+ if resp == nil || resp .Transaction != "0x123" {
497+ t .Error ("OnAfterSettle did not receive correct response" )
498+ }
499+ },
500+ }
501+
502+ _ , err := client .Settle (context .Background (), x402.PaymentPayload {}, x402.PaymentRequirement {})
503+ if err != nil {
504+ t .Fatalf ("Settle failed: %v" , err )
505+ }
506+
507+ if ! beforeCalled {
508+ t .Error ("OnBeforeSettle was not called" )
509+ }
510+ if ! afterCalled {
511+ t .Error ("OnAfterSettle was not called" )
512+ }
513+ }
514+
515+ func TestFacilitatorClient_Settle_OnBeforeAbort (t * testing.T ) {
516+ mockServer := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
517+ t .Error ("Server was reached despite OnBeforeSettle error" )
518+ }))
519+ defer mockServer .Close ()
520+
521+ expectedErr := x402 .ErrSettlementFailed
522+
523+ client := & FacilitatorClient {
524+ BaseURL : mockServer .URL ,
525+ Client : & http.Client {},
526+ OnBeforeSettle : func (ctx context.Context , p x402.PaymentPayload , r x402.PaymentRequirement ) error {
527+ return expectedErr
528+ },
529+ }
530+
531+ _ , err := client .Settle (context .Background (), x402.PaymentPayload {}, x402.PaymentRequirement {})
532+ if err != expectedErr {
533+ t .Errorf ("Expected error %v, got %v" , expectedErr , err )
534+ }
535+ }
0 commit comments