@@ -58,6 +58,7 @@ jest.mock('../../utils/v2OrderToast', () => ({
5858jest . mock ( '../../headless/sessionRegistry' , ( ) => ( {
5959 getSession : jest . fn ( ) ,
6060 closeSession : jest . fn ( ) ,
61+ failSession : jest . fn ( ) ,
6162} ) ) ;
6263
6364jest . mock ( '../../../../../util/Logger' , ( ) => ( {
@@ -618,6 +619,8 @@ describe('Checkout', () => {
618619 . getSession as jest . Mock ;
619620 const mockCloseSession = jest . requireMock ( '../../headless/sessionRegistry' )
620621 . closeSession as jest . Mock ;
622+ const mockFailSession = jest . requireMock ( '../../headless/sessionRegistry' )
623+ . failSession as jest . Mock ;
621624 const showV2OrderToastMock = jest . requireMock ( '../../utils/v2OrderToast' )
622625 . showV2OrderToast as jest . Mock ;
623626
@@ -641,6 +644,7 @@ describe('Checkout', () => {
641644 beforeEach ( ( ) => {
642645 mockGetSession . mockReset ( ) ;
643646 mockCloseSession . mockReset ( ) ;
647+ mockFailSession . mockReset ( ) ;
644648 mockParentPop = jest . fn ( ) ;
645649 mockNavigation . getParent . mockReturnValue ( { pop : mockParentPop } ) ;
646650 mockGetOrderFromCallback . mockResolvedValue ( mockOrder ) ;
@@ -740,6 +744,52 @@ describe('Checkout', () => {
740744 expect ( mockParentPop ) . toHaveBeenCalled ( ) ;
741745 } ) ;
742746
747+ it ( 'surfaces callback processing failures through onError and skips the ErrorView' , async ( ) => {
748+ mockUseParams . mockReturnValue ( callbackFlowParams ) ;
749+ mockGetOrderFromCallback . mockRejectedValueOnce (
750+ new Error ( 'callback failed' ) ,
751+ ) ;
752+ mockFailSession . mockReturnValue ( {
753+ code : 'UNKNOWN' ,
754+ message : 'callback failed' ,
755+ } ) ;
756+
757+ const { getByTestId, queryByText } = renderWithProvider (
758+ < Checkout /> ,
759+ { } ,
760+ true ,
761+ false ,
762+ ) ;
763+
764+ await act ( async ( ) => {
765+ fireEvent . press ( getByTestId ( 'trigger-callback-navigation' ) ) ;
766+ } ) ;
767+
768+ await waitFor ( ( ) => {
769+ expect ( mockFailSession ) . toHaveBeenCalledWith ( 'hs-1' , expect . any ( Error ) ) ;
770+ } ) ;
771+ expect ( mockParentPop ) . toHaveBeenCalled ( ) ;
772+ expect ( showV2OrderToastMock ) . not . toHaveBeenCalled ( ) ;
773+ expect ( queryByText ( 'callback failed' ) ) . toBeNull ( ) ;
774+ } ) ;
775+
776+ it ( 'surfaces provider WebView HTTP errors through onError when headless' , async ( ) => {
777+ mockUseParams . mockReturnValue ( callbackFlowParams ) ;
778+ mockFailSession . mockReturnValue ( {
779+ code : 'UNKNOWN' ,
780+ message : 'fiat_on_ramp_aggregator.webview_received_error' ,
781+ } ) ;
782+
783+ const { getByTestId } = renderWithProvider ( < Checkout /> , { } , true , false ) ;
784+
785+ await act ( async ( ) => {
786+ fireEvent . press ( getByTestId ( 'trigger-http-error-main-uri' ) ) ;
787+ } ) ;
788+
789+ expect ( mockFailSession ) . toHaveBeenCalledWith ( 'hs-1' , expect . any ( Error ) ) ;
790+ expect ( mockParentPop ) . toHaveBeenCalled ( ) ;
791+ } ) ;
792+
743793 it ( 'falls back to the regular reset + toast when session id is present but session is missing from registry' , async ( ) => {
744794 mockGetSession . mockReturnValue ( undefined ) ;
745795 mockUseParams . mockReturnValue ( callbackFlowParams ) ;
0 commit comments