Skip to content

Commit 3eb36e7

Browse files
committed
unit tests
1 parent 5ff421a commit 3eb36e7

File tree

3 files changed

+244
-25
lines changed

3 files changed

+244
-25
lines changed

app/components/UI/Ramp/Views/BuildQuote/BuildQuote.test.tsx

Lines changed: 163 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ let mockSelectedProvider: unknown = null;
199199
let mockSelectedPaymentMethod: unknown = null;
200200
let mockPaymentMethods: unknown[] = [];
201201
let mockPaymentMethodsStatus: 'idle' | 'loading' | 'success' | 'error' = 'idle';
202+
let mockPaymentMethodsFetching = false;
202203
let mockSelectedQuote: Record<string, unknown> | null = null;
203204
let 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
});

app/components/UI/Ramp/Views/Modals/TokenNotAvailableModal/TokenNotAvailableModal.test.tsx

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,4 +244,57 @@ describe('TokenNotAvailableModal', () => {
244244
});
245245
expect(mockTrackEvent).toHaveBeenCalledTimes(1);
246246
});
247+
248+
describe('buyFlowOrigin: tokenInfo', () => {
249+
beforeEach(() => {
250+
mockUseParams.mockReturnValue({
251+
assetId: MOCK_ASSET_ID,
252+
buyFlowOrigin: 'tokenInfo',
253+
});
254+
});
255+
256+
it('navigates to Tokens Full View when Change token is pressed', () => {
257+
const { getByText } = render(TokenNotAvailableModal);
258+
259+
fireEvent.press(getByText('Change token'));
260+
261+
expect(mockOnCloseBottomSheet).toHaveBeenCalledWith(expect.any(Function));
262+
expect(mockNavigate).toHaveBeenCalledWith(Routes.WALLET.TOKENS_FULL_VIEW);
263+
});
264+
265+
it('calls goBack twice when modal is dismissed without a pending action', () => {
266+
render(TokenNotAvailableModal);
267+
268+
capturedOnClose?.(false);
269+
270+
expect(mockGoBack).toHaveBeenCalledTimes(2);
271+
expect(mockNavigate).not.toHaveBeenCalled();
272+
});
273+
});
274+
275+
describe('buyFlowOrigin: homeTokenList', () => {
276+
beforeEach(() => {
277+
mockUseParams.mockReturnValue({
278+
assetId: MOCK_ASSET_ID,
279+
buyFlowOrigin: 'homeTokenList',
280+
});
281+
});
282+
283+
it('navigates to Home when Change token is pressed', () => {
284+
const { getByText } = render(TokenNotAvailableModal);
285+
286+
fireEvent.press(getByText('Change token'));
287+
288+
expect(mockOnCloseBottomSheet).toHaveBeenCalledWith(expect.any(Function));
289+
expect(mockNavigate).toHaveBeenCalledWith(Routes.WALLET.HOME);
290+
});
291+
292+
it('navigates to Home when modal is dismissed without a pending action', () => {
293+
render(TokenNotAvailableModal);
294+
295+
capturedOnClose?.(false);
296+
297+
expect(mockNavigate).toHaveBeenCalledWith(Routes.WALLET.HOME);
298+
});
299+
});
247300
});

0 commit comments

Comments
 (0)