diff --git a/app/components/UI/Tokens/TokenList/TokenListFooter/__snapshots__/index.test.tsx.snap b/app/components/UI/Tokens/TokenList/TokenListFooter/__snapshots__/index.test.tsx.snap
new file mode 100644
index 00000000000..512895904bd
--- /dev/null
+++ b/app/components/UI/Tokens/TokenList/TokenListFooter/__snapshots__/index.test.tsx.snap
@@ -0,0 +1,141 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`TokenListFooter renders correctly 1`] = `
+[
+
+
+ ETH is needed to continue
+
+
+
+ Next
+
+
+ ,
+
+
+
+
+ Don't see your token?
+
+
+
+ Import tokens
+
+
+
+ ,
+]
+`;
diff --git a/app/components/UI/Tokens/TokenList/TokenListFooter/index.test.tsx b/app/components/UI/Tokens/TokenList/TokenListFooter/index.test.tsx
new file mode 100644
index 00000000000..c1e2c2f4caa
--- /dev/null
+++ b/app/components/UI/Tokens/TokenList/TokenListFooter/index.test.tsx
@@ -0,0 +1,165 @@
+import React from 'react';
+import { render, fireEvent, waitFor } from '@testing-library/react-native';
+import { TokenListFooter } from '.';
+import configureMockStore from 'redux-mock-store';
+import { Provider } from 'react-redux';
+import { WalletViewSelectorsIDs } from '../../../../../../e2e/selectors/wallet/WalletView.selectors';
+import { strings } from '../../../../../../locales/i18n';
+import useRampNetwork from '../../../Ramp/hooks/useRampNetwork';
+import { MetaMetricsEvents } from '../../../../../components/hooks/useMetrics';
+import { TokenI } from '../../types';
+import { mockNetworkState } from '../../../../../util/test/network';
+import { backgroundState } from '../../../../../util/test/initial-root-state';
+
+jest.mock('../../../Ramp/hooks/useRampNetwork', () => jest.fn());
+jest.mock('../../../Ramp/routes/utils', () => ({
+ createBuyNavigationDetails: jest.fn(() => ['BuyScreen']),
+}));
+jest.mock('../../../../../components/hooks/useMetrics', () => ({
+ MetaMetricsEvents: { BUY_BUTTON_CLICKED: 'BUY_BUTTON_CLICKED' },
+ useMetrics: jest.fn(() => ({
+ trackEvent: jest.fn(),
+ createEventBuilder: jest.fn(() => ({
+ addProperties: jest.fn().mockReturnThis(),
+ build: jest.fn(),
+ })),
+ })),
+}));
+
+jest.mock('@react-navigation/native', () => {
+ const actualNav = jest.requireActual('@react-navigation/native');
+ return {
+ ...actualNav,
+ useNavigation: () => ({
+ navigate: jest.fn(),
+ }),
+ };
+});
+
+const mockStore = configureMockStore();
+const MOCK_ADDRESS_1 = '0x0';
+
+const initialState = {
+ engine: {
+ backgroundState: {
+ ...backgroundState,
+ TokensController: {
+ tokens: [],
+ detectedTokens: [],
+ },
+ NetworkController: {
+ ...mockNetworkState({
+ chainId: '0x1',
+ id: 'mainnet',
+ nickname: 'Ethereum Mainnet',
+ ticker: 'ETH',
+ }),
+ },
+ AccountsController: {
+ internalAccounts: {
+ selectedAccount: 'id',
+ accounts: {
+ id: {
+ address: MOCK_ADDRESS_1,
+ },
+ },
+ },
+ },
+ PreferencesController: {
+ preferences: {
+ useTokenDetection: true,
+ },
+ tokenNetworkFilter: [
+ {
+ '0x1': true,
+ },
+ ],
+ },
+ },
+ },
+ settings: {
+ primaryCurrency: 'usd',
+ },
+};
+
+const store = mockStore(initialState);
+
+describe('TokenListFooter', () => {
+ const mockTokens = [
+ {
+ isETH: true,
+ symbol: 'ETH',
+ balance: '0',
+ },
+ ] as TokenI[];
+
+ const mockProps = {
+ tokens: mockTokens,
+ goToAddToken: jest.fn(),
+ showDetectedTokens: jest.fn(),
+ isAddTokenEnabled: true,
+ };
+
+ beforeEach(() => {
+ (useRampNetwork as jest.Mock).mockReturnValue([true, true]);
+ });
+
+ afterEach(() => {
+ jest.clearAllMocks();
+ });
+
+ const renderComponent = (props = mockProps) =>
+ render(
+
+
+ ,
+ );
+
+ it('renders correctly', () => {
+ const { toJSON } = renderComponent();
+ expect(toJSON()).toMatchSnapshot();
+ });
+
+ it('renders the buy button for a native token with zero balance', () => {
+ const { getByText } = renderComponent();
+
+ expect(
+ getByText(
+ strings('wallet.token_is_needed_to_continue', { tokenSymbol: 'ETH' }),
+ ),
+ ).toBeDefined();
+ expect(getByText(strings('wallet.next'))).toBeDefined();
+ });
+
+ it('tracks the BUY_BUTTON_CLICKED event when the buy button is pressed', async () => {
+ const { getByText } = renderComponent();
+
+ fireEvent.press(getByText(strings('wallet.next')));
+
+ await waitFor(() => {
+ expect(MetaMetricsEvents.BUY_BUTTON_CLICKED).toBeDefined();
+ });
+ });
+
+ it('renders the add tokens footer link and calls goToAddToken when pressed', () => {
+ const { getByTestId } = renderComponent();
+
+ fireEvent.press(
+ getByTestId(WalletViewSelectorsIDs.IMPORT_TOKEN_FOOTER_LINK),
+ );
+
+ expect(mockProps.goToAddToken).toHaveBeenCalledTimes(1);
+ });
+
+ it('disables the add tokens footer link when isAddTokenEnabled is false', () => {
+ const { getByTestId } = renderComponent({
+ ...mockProps,
+ isAddTokenEnabled: false,
+ });
+
+ expect(
+ getByTestId(WalletViewSelectorsIDs.IMPORT_TOKEN_FOOTER_LINK).props
+ .disabled,
+ ).toBe(true);
+ });
+});