@@ -199,6 +199,7 @@ let mockSelectedProvider: unknown = null;
199199let mockSelectedPaymentMethod : unknown = null ;
200200let mockPaymentMethods : unknown [ ] = [ ] ;
201201let mockPaymentMethodsStatus : 'idle' | 'loading' | 'success' | 'error' = 'idle' ;
202+ let mockPaymentMethodsFetching = false ;
202203let mockSelectedQuote : Record < string , unknown > | null = null ;
203204let mockTokens : {
204205 allTokens : ReturnType < typeof createMockToken > [ ] ;
@@ -225,6 +226,7 @@ jest.mock('../../hooks/useRampsController', () => ({
225226 paymentMethods : mockPaymentMethods ,
226227 getWidgetUrl : mockGetWidgetUrl ,
227228 paymentMethodsLoading : false ,
229+ paymentMethodsFetching : mockPaymentMethodsFetching ,
228230 paymentMethodsStatus : mockPaymentMethodsStatus ,
229231 selectedPaymentMethod : mockSelectedPaymentMethod ,
230232 } ) ,
@@ -307,6 +309,7 @@ describe('BuildQuote', () => {
307309 mockSelectedPaymentMethod = null ;
308310 mockPaymentMethods = [ ] ;
309311 mockPaymentMethodsStatus = 'idle' ;
312+ mockPaymentMethodsFetching = false ;
310313 mockQuotesData = null ;
311314 mockQuotesLoading = false ;
312315 mockQuotesError = null ;
@@ -1550,7 +1553,14 @@ describe('BuildQuote', () => {
15501553 } ) ;
15511554
15521555 describe ( 'Token unavailable for provider' , ( ) => {
1553- it ( 'navigates to token unavailable modal when token is not supported by provider' , async ( ) => {
1556+ beforeEach ( ( ) => {
1557+ jest . useFakeTimers ( ) ;
1558+ } ) ;
1559+
1560+ afterEach ( ( ) => {
1561+ jest . useRealTimers ( ) ;
1562+ } ) ;
1563+ it ( 'navigates to token unavailable modal when token is not supported by provider' , ( ) => {
15541564 mockSelectedProvider = {
15551565 id : '/providers/transak' ,
15561566 name : 'Transak' ,
@@ -1566,8 +1576,8 @@ describe('BuildQuote', () => {
15661576
15671577 renderWithTheme ( < BuildQuote /> ) ;
15681578
1569- await act ( async ( ) => {
1570- await flushPromises ( ) ;
1579+ act ( ( ) => {
1580+ jest . advanceTimersByTime ( 600 ) ;
15711581 } ) ;
15721582
15731583 expect ( mockNavigate ) . toHaveBeenCalledWith (
@@ -1650,7 +1660,7 @@ describe('BuildQuote', () => {
16501660 ) ;
16511661 } ) ;
16521662
1653- it ( 'navigates to token unavailable modal when payment methods query succeeds with empty data' , async ( ) => {
1663+ it ( 'navigates to token unavailable modal when payment methods query succeeds with empty data' , ( ) => {
16541664 mockSelectedProvider = {
16551665 id : '/providers/transak' ,
16561666 name : 'Transak' ,
@@ -1668,8 +1678,8 @@ describe('BuildQuote', () => {
16681678
16691679 renderWithTheme ( < BuildQuote /> ) ;
16701680
1671- await act ( async ( ) => {
1672- await flushPromises ( ) ;
1681+ act ( ( ) => {
1682+ jest . advanceTimersByTime ( 600 ) ;
16731683 } ) ;
16741684
16751685 expect ( mockNavigate ) . toHaveBeenCalledWith (
@@ -1681,7 +1691,7 @@ describe('BuildQuote', () => {
16811691 ) ;
16821692 } ) ;
16831693
1684- it ( 'navigates to token unavailable modal when params.assetId is missing but selectedToken is set' , async ( ) => {
1694+ it ( 'navigates to token unavailable modal when params.assetId is missing but selectedToken is set' , ( ) => {
16851695 mockUseParams . mockImplementation ( ( ) => ( { } ) ) ;
16861696 mockSelectedProvider = {
16871697 id : '/providers/transak' ,
@@ -1700,8 +1710,8 @@ describe('BuildQuote', () => {
17001710
17011711 renderWithTheme ( < BuildQuote /> ) ;
17021712
1703- await act ( async ( ) => {
1704- await flushPromises ( ) ;
1713+ act ( ( ) => {
1714+ jest . advanceTimersByTime ( 600 ) ;
17051715 } ) ;
17061716
17071717 expect ( mockNavigate ) . toHaveBeenCalledWith (
@@ -1726,7 +1736,7 @@ describe('BuildQuote', () => {
17261736 ) ;
17271737 } ) ;
17281738
1729- it ( 'navigates to token unavailable modal via supportedCryptoCurrencies when params.assetId is missing' , async ( ) => {
1739+ it ( 'navigates to token unavailable modal via supportedCryptoCurrencies when params.assetId is missing' , ( ) => {
17301740 mockUseParams . mockImplementation ( ( ) => ( { } ) ) ;
17311741 mockSelectedProvider = {
17321742 id : '/providers/transak' ,
@@ -1743,8 +1753,8 @@ describe('BuildQuote', () => {
17431753
17441754 renderWithTheme ( < BuildQuote /> ) ;
17451755
1746- await act ( async ( ) => {
1747- await flushPromises ( ) ;
1756+ act ( ( ) => {
1757+ jest . advanceTimersByTime ( 600 ) ;
17481758 } ) ;
17491759
17501760 expect ( mockNavigate ) . toHaveBeenCalledWith (
@@ -1756,7 +1766,7 @@ describe('BuildQuote', () => {
17561766 ) ;
17571767 } ) ;
17581768
1759- it ( 'does not re-navigate to token unavailable modal on re-renders' , async ( ) => {
1769+ it ( 'does not re-navigate to token unavailable modal on re-renders' , ( ) => {
17601770 mockSelectedProvider = {
17611771 id : '/providers/transak' ,
17621772 name : 'Transak' ,
@@ -1772,8 +1782,8 @@ describe('BuildQuote', () => {
17721782
17731783 const { rerender } = renderWithTheme ( < BuildQuote /> ) ;
17741784
1775- await act ( async ( ) => {
1776- await flushPromises ( ) ;
1785+ act ( ( ) => {
1786+ jest . advanceTimersByTime ( 600 ) ;
17771787 } ) ;
17781788
17791789 expect ( mockNavigate ) . toHaveBeenCalledWith (
@@ -1800,7 +1810,7 @@ describe('BuildQuote', () => {
18001810 ) ;
18011811 } ) ;
18021812
1803- it ( 're-navigates to token unavailable modal when provider changes to another unsupporting provider' , async ( ) => {
1813+ it ( 're-navigates to token unavailable modal when provider changes to another unsupporting provider' , ( ) => {
18041814 // First provider doesn't support the token
18051815 mockSelectedProvider = {
18061816 id : '/providers/transak' ,
@@ -1817,8 +1827,8 @@ describe('BuildQuote', () => {
18171827
18181828 const { rerender } = renderWithTheme ( < BuildQuote /> ) ;
18191829
1820- await act ( async ( ) => {
1821- await flushPromises ( ) ;
1830+ act ( ( ) => {
1831+ jest . advanceTimersByTime ( 600 ) ;
18221832 } ) ;
18231833
18241834 expect ( mockNavigate ) . toHaveBeenCalledWith (
@@ -1851,8 +1861,8 @@ describe('BuildQuote', () => {
18511861 </ ThemeContext . Provider > ,
18521862 ) ;
18531863
1854- await act ( async ( ) => {
1855- await flushPromises ( ) ;
1864+ act ( ( ) => {
1865+ jest . advanceTimersByTime ( 600 ) ;
18561866 } ) ;
18571867
18581868 // Modal should re-appear for the new provider
@@ -1865,7 +1875,7 @@ describe('BuildQuote', () => {
18651875 ) ;
18661876 } ) ;
18671877
1868- it ( 're-navigates to token unavailable modal when payment methods return empty after provider change' , async ( ) => {
1878+ it ( 're-navigates to token unavailable modal when payment methods return empty after provider change' , ( ) => {
18691879 // First provider: token unavailable via empty payment methods
18701880 mockSelectedProvider = {
18711881 id : '/providers/transak' ,
@@ -1881,8 +1891,8 @@ describe('BuildQuote', () => {
18811891
18821892 const { rerender } = renderWithTheme ( < BuildQuote /> ) ;
18831893
1884- await act ( async ( ) => {
1885- await flushPromises ( ) ;
1894+ act ( ( ) => {
1895+ jest . advanceTimersByTime ( 600 ) ;
18861896 } ) ;
18871897
18881898 expect ( mockNavigate ) . toHaveBeenCalledWith (
@@ -1911,8 +1921,8 @@ describe('BuildQuote', () => {
19111921 </ ThemeContext . Provider > ,
19121922 ) ;
19131923
1914- await act ( async ( ) => {
1915- await flushPromises ( ) ;
1924+ act ( ( ) => {
1925+ jest . advanceTimersByTime ( 600 ) ;
19161926 } ) ;
19171927
19181928 // Modal should re-appear for the new provider
@@ -1923,5 +1933,133 @@ describe('BuildQuote', () => {
19231933 } ) ,
19241934 ) ;
19251935 } ) ;
1936+
1937+ it ( 'does not navigate to token unavailable modal while payment methods are still fetching' , ( ) => {
1938+ mockSelectedProvider = {
1939+ id : '/providers/transak' ,
1940+ name : 'Transak' ,
1941+ environmentType : 'PRODUCTION' ,
1942+ description : 'Test Provider' ,
1943+ hqAddress : '123 Test St' ,
1944+ links : [ ] ,
1945+ logos : { light : '' , dark : '' , height : 24 , width : 79 } ,
1946+ supportedCryptoCurrencies : {
1947+ 'eip155:1/slip44:60' : true ,
1948+ } ,
1949+ } ;
1950+ mockPaymentMethods = [ ] ;
1951+ mockPaymentMethodsStatus = 'success' ;
1952+ mockPaymentMethodsFetching = true ;
1953+
1954+ renderWithTheme ( < BuildQuote /> ) ;
1955+
1956+ expect ( mockNavigate ) . not . toHaveBeenCalledWith (
1957+ 'RampModals' ,
1958+ expect . objectContaining ( {
1959+ screen : 'RampTokenNotAvailableModal' ,
1960+ } ) ,
1961+ ) ;
1962+ } ) ;
1963+
1964+ it ( 'does not show token unavailable when payment methods have results' , ( ) => {
1965+ mockSelectedProvider = {
1966+ id : '/providers/transak' ,
1967+ name : 'Transak' ,
1968+ environmentType : 'PRODUCTION' ,
1969+ description : 'Test Provider' ,
1970+ hqAddress : '123 Test St' ,
1971+ links : [ ] ,
1972+ logos : { light : '' , dark : '' , height : 24 , width : 79 } ,
1973+ supportedCryptoCurrencies : {
1974+ 'eip155:1/slip44:60' : true ,
1975+ } ,
1976+ } ;
1977+ mockPaymentMethods = [
1978+ { id : '/payments/revolut-pay' , name : 'Revolut Pay' } ,
1979+ ] ;
1980+ mockPaymentMethodsStatus = 'success' ;
1981+
1982+ renderWithTheme ( < BuildQuote /> ) ;
1983+
1984+ act ( ( ) => {
1985+ jest . advanceTimersByTime ( 600 ) ;
1986+ } ) ;
1987+
1988+ expect ( mockNavigate ) . not . toHaveBeenCalledWith (
1989+ 'RampModals' ,
1990+ expect . objectContaining ( {
1991+ screen : 'RampTokenNotAvailableModal' ,
1992+ } ) ,
1993+ ) ;
1994+ } ) ;
1995+
1996+ it ( 'passes buyFlowOrigin to the token unavailable modal navigation' , ( ) => {
1997+ mockUseParams . mockImplementation ( ( ) => ( {
1998+ assetId : MOCK_ASSET_ID ,
1999+ buyFlowOrigin : 'tokenInfo' ,
2000+ } ) ) ;
2001+ mockSelectedProvider = {
2002+ id : '/providers/transak' ,
2003+ name : 'Transak' ,
2004+ environmentType : 'PRODUCTION' ,
2005+ description : 'Test Provider' ,
2006+ hqAddress : '123 Test St' ,
2007+ links : [ ] ,
2008+ logos : { light : '' , dark : '' , height : 24 , width : 79 } ,
2009+ supportedCryptoCurrencies : {
2010+ 'eip155:1/slip44:60' : true ,
2011+ } ,
2012+ } ;
2013+
2014+ renderWithTheme ( < BuildQuote /> ) ;
2015+
2016+ act ( ( ) => {
2017+ jest . advanceTimersByTime ( 600 ) ;
2018+ } ) ;
2019+
2020+ expect ( mockNavigate ) . toHaveBeenCalledWith (
2021+ 'RampModals' ,
2022+ expect . objectContaining ( {
2023+ screen : 'RampTokenNotAvailableModal' ,
2024+ params : { assetId : MOCK_ASSET_ID , buyFlowOrigin : 'tokenInfo' } ,
2025+ } ) ,
2026+ ) ;
2027+ } ) ;
2028+
2029+ it ( 'disables payment pill when token is unavailable' , ( ) => {
2030+ mockSelectedProvider = {
2031+ id : '/providers/transak' ,
2032+ name : 'Transak' ,
2033+ environmentType : 'PRODUCTION' ,
2034+ description : 'Test Provider' ,
2035+ hqAddress : '123 Test St' ,
2036+ links : [ ] ,
2037+ logos : { light : '' , dark : '' , height : 24 , width : 79 } ,
2038+ supportedCryptoCurrencies : {
2039+ 'eip155:1/slip44:60' : true ,
2040+ } ,
2041+ } ;
2042+ mockPaymentMethods = [ ] ;
2043+ mockPaymentMethodsStatus = 'success' ;
2044+
2045+ const { getByTestId } = renderWithTheme ( < BuildQuote /> ) ;
2046+
2047+ act ( ( ) => {
2048+ jest . advanceTimersByTime ( 600 ) ;
2049+ } ) ;
2050+
2051+ // Reset navigate calls from the modal navigation
2052+ mockNavigate . mockClear ( ) ;
2053+
2054+ // Try pressing the payment pill — should not trigger navigation
2055+ fireEvent . press ( getByTestId ( 'payment-method-pill' ) ) ;
2056+
2057+ expect ( mockNavigate ) . not . toHaveBeenCalledWith (
2058+ 'RampModals' ,
2059+ expect . objectContaining ( {
2060+ screen : 'RampPaymentSelectionModal' ,
2061+ } ) ,
2062+ ) ;
2063+ } ) ;
19262064 } ) ;
19272065} ) ;
0 commit comments