import { fireEvent, render } from '@testing-library/react-native' import React from 'react' import { Provider } from 'react-redux' import AppAnalytics from 'src/analytics/AppAnalytics' import { EarnEvents } from 'src/analytics/Events' import WithdrawBottomSheet from 'src/earn/poolInfoScreen/WithdrawBottomSheet' import { navigate } from 'src/navigator/NavigationService' import { Screens } from 'src/navigator/Screens' import { getFeatureGate } from 'src/statsig' import { StatsigFeatureGates } from 'src/statsig/types' import { createMockStore } from 'test/utils' import { mockArbUsdcTokenId, mockEarnPositions, mockPositions, mockRewardsPositions, mockTokenBalances, } from 'test/values' jest.mock('src/statsig', () => ({ getMultichainFeatures: jest.fn(), getFeatureGate: jest.fn(), })) const mockPoolTokenId = mockEarnPositions[0].dataProps.depositTokenId const store = createMockStore({ tokens: { tokenBalances: { [mockPoolTokenId]: { ...mockTokenBalances[mockArbUsdcTokenId], isCashInEligible: true, }, }, }, positions: { positions: [...mockPositions, ...mockRewardsPositions], }, }) describe('WithdrawBottomSheet', () => { beforeEach(() => { jest.clearAllMocks() }) it('tapping withdraw on WithdrawBottomSheet navigates to enter amount screen', () => { jest .mocked(getFeatureGate) .mockImplementation((gate) => gate === StatsigFeatureGates.ALLOW_EARN_PARTIAL_WITHDRAWAL) const { getByTestId } = render( ) expect(getByTestId('Earn/ActionCard/withdraw')).toBeTruthy() fireEvent.press(getByTestId('Earn/ActionCard/withdraw')) expect(AppAnalytics.track).toHaveBeenCalledWith(EarnEvents.earn_select_withdraw_type, { type: 'withdraw', providerId: mockEarnPositions[0].appId, poolId: mockEarnPositions[0].positionId, networkId: mockEarnPositions[0].networkId, depositTokenId: mockEarnPositions[0].dataProps.depositTokenId, }) expect(navigate).toHaveBeenCalledWith(Screens.EarnEnterAmount, { pool: { ...mockEarnPositions[0], balance: '100', }, mode: 'withdraw', }) }) it('tapping claim on WithdrawBottomSheet navigates to confirmation screen', () => { jest .mocked(getFeatureGate) .mockImplementation( (gate) => gate === StatsigFeatureGates.ALLOW_EARN_PARTIAL_WITHDRAWAL || gate === StatsigFeatureGates.SHOW_POSITIONS ) const { getByTestId } = render( ) expect(getByTestId('Earn/ActionCard/claim-rewards')).toBeTruthy() fireEvent.press(getByTestId('Earn/ActionCard/claim-rewards')) expect(AppAnalytics.track).toHaveBeenCalledWith(EarnEvents.earn_select_withdraw_type, { type: 'claim-rewards', providerId: mockEarnPositions[0].appId, poolId: mockEarnPositions[0].positionId, networkId: mockEarnPositions[0].networkId, depositTokenId: mockEarnPositions[0].dataProps.depositTokenId, }) expect(navigate).toHaveBeenCalledWith(Screens.EarnConfirmationScreen, { pool: { ...mockEarnPositions[0], balance: '100', }, mode: 'claim-rewards', useMax: true, }) }) it('tapping exit on WithdrawBottomSheet navigates to enter amount screen', () => { jest .mocked(getFeatureGate) .mockImplementation((gate) => gate === StatsigFeatureGates.ALLOW_EARN_PARTIAL_WITHDRAWAL) const { getByTestId } = render( ) expect(getByTestId('Earn/ActionCard/exit')).toBeTruthy() fireEvent.press(getByTestId('Earn/ActionCard/exit')) expect(AppAnalytics.track).toHaveBeenCalledWith(EarnEvents.earn_select_withdraw_type, { type: 'exit', providerId: mockEarnPositions[0].appId, poolId: mockEarnPositions[0].positionId, networkId: mockEarnPositions[0].networkId, depositTokenId: mockEarnPositions[0].dataProps.depositTokenId, }) expect(navigate).toHaveBeenCalledWith(Screens.EarnConfirmationScreen, { pool: { ...mockEarnPositions[0], balance: '100', }, mode: 'exit', useMax: true, }) }) it('shows correct copy when ClaimType is Earnings', () => { jest .mocked(getFeatureGate) .mockImplementation( (gate) => gate === StatsigFeatureGates.ALLOW_EARN_PARTIAL_WITHDRAWAL || gate === StatsigFeatureGates.SHOW_POSITIONS ) const { getByText } = render( ) expect( getByText('earnFlow.poolInfoScreen.withdrawBottomSheet.withdrawDescription') ).toBeTruthy() expect(getByText('earnFlow.poolInfoScreen.withdrawBottomSheet.claimEarnings')).toBeTruthy() expect( getByText('earnFlow.poolInfoScreen.withdrawBottomSheet.claimEarningsDescription') ).toBeTruthy() expect( getByText('earnFlow.poolInfoScreen.withdrawBottomSheet.exitWithEarningsDescription') ).toBeTruthy() }) it('shows correct copy when ClaimType is Rewards', () => { jest .mocked(getFeatureGate) .mockImplementation( (gate) => gate === StatsigFeatureGates.ALLOW_EARN_PARTIAL_WITHDRAWAL || gate === StatsigFeatureGates.SHOW_POSITIONS ) const { getByText } = render( ) expect(getByText('earnFlow.poolInfoScreen.withdrawBottomSheet.claimRewards')).toBeTruthy() expect( getByText('earnFlow.poolInfoScreen.withdrawBottomSheet.claimRewardsDescription') ).toBeTruthy() expect( getByText('earnFlow.poolInfoScreen.withdrawBottomSheet.exitWithRewardsDescription') ).toBeTruthy() }) it('shows correct copy when withdrawalIncludesClaim is true', () => { jest .mocked(getFeatureGate) .mockImplementation( (gate) => gate === StatsigFeatureGates.ALLOW_EARN_PARTIAL_WITHDRAWAL || gate === StatsigFeatureGates.SHOW_POSITIONS ) const { getByText } = render( ) expect(getByText('earnFlow.poolInfoScreen.withdrawBottomSheet.withdrawAndClaim')).toBeTruthy() expect( getByText('earnFlow.poolInfoScreen.withdrawBottomSheet.withdrawAndClaimEarningsDescription') ).toBeTruthy() }) })