import { fireEvent, render } from '@testing-library/react-native'
import React from 'react'
import { Provider } from 'react-redux'
import AppAnalytics from 'src/analytics/AppAnalytics'
import { AssetsEvents } from 'src/analytics/Events'
import { navigate } from 'src/navigator/NavigationService'
import { Screens } from 'src/navigator/Screens'
import { AppTokenPosition } from 'src/positions/types'
import { PositionItem } from 'src/tokens/PositionItem'
import { createMockStore } from 'test/utils'
import { mockEarnPositions, mockPositions } from 'test/values'
beforeEach(() => {
jest.clearAllMocks()
})
describe('PositionItem', () => {
it('tracks data about the asset when tapped', () => {
const { getByText } = render(
)
fireEvent.press(getByText('MOO / CELO'))
expect(AppAnalytics.track).toHaveBeenCalledTimes(1)
expect(AppAnalytics.track).toHaveBeenCalledWith(AssetsEvents.tap_asset, {
address: '0x19a75250c5a3ab22a8662e55a2b90ff9d3334b00',
appId: 'ubeswap',
assetType: 'position',
balanceUsd: 2.509873993477929,
description: 'Pool',
network: 'celo-mainnet',
title: 'MOO / CELO',
})
})
it('navigates to internal browser manageUrl when tapped and manageUrl exists, not an earnPosition', () => {
const { getByText } = render(
)
fireEvent.press(getByText('MOO / CELO'))
expect(navigate).toHaveBeenCalledWith(Screens.WebViewScreen, { uri: 'mock-position.com' })
})
it('does not call navigate when tapped and manageUrl does not, not an earnPosition', () => {
const { getByText } = render(
)
fireEvent.press(getByText('G$ / cUSD'))
expect(navigate).not.toHaveBeenCalled()
})
it('navigates to EarnPoolInfoScreen when tapped if position is an earnPosition', () => {
const { getByText } = render(
)
fireEvent.press(getByText('USDC'))
expect(navigate).toHaveBeenCalledWith(Screens.EarnPoolInfoScreen, {
pool: mockEarnPositions[0],
})
})
it('shows the correct info for a position', () => {
const { getByText } = render(
)
expect(getByText('MOO / CELO')).toBeTruthy()
expect(getByText('Pool')).toBeTruthy()
expect(getByText('₱3.34')).toBeTruthy()
expect(getByText('11.90')).toBeTruthy()
})
it('shows the correct info for a position with balance hidden', () => {
const { getByText, queryByText } = render(
)
expect(getByText('MOO / CELO')).toBeTruthy()
expect(getByText('Pool')).toBeTruthy()
expect(queryByText('₱3.34')).toBeFalsy()
expect(queryByText('11.90')).toBeFalsy()
})
it('shows the correct info for a position with a negative balance', () => {
const mockPosition = mockPositions[0] as AppTokenPosition
const { getByText } = render(
)
expect(getByText('MOO / CELO')).toBeTruthy()
expect(getByText('Pool')).toBeTruthy()
expect(getByText('-₱3.34')).toBeTruthy()
expect(getByText('-11.90')).toBeTruthy()
})
it('shows the correct info for a position with a 0 price', () => {
const mockPosition = mockPositions[0] as AppTokenPosition
const { getByText } = render(
)
expect(getByText('MOO / CELO')).toBeTruthy()
expect(getByText('Pool')).toBeTruthy()
expect(getByText('-')).toBeTruthy()
expect(getByText('11.90')).toBeTruthy()
})
})