Skip to content

Commit

Permalink
chore(portfolio): added translator
Browse files Browse the repository at this point in the history
  • Loading branch information
stackchain committed May 7, 2024
1 parent 62f1d24 commit a673cf6
Show file tree
Hide file tree
Showing 6 changed files with 181 additions and 10 deletions.
3 changes: 2 additions & 1 deletion packages/portfolio/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,8 @@
"collectCoverageFrom": [
"src/**/*.{js,jsx,ts,tsx}",
"!src/**/*.d.ts",
"!src/**/*.mocks.{js,jsx,ts,tsx}"
"!src/**/*.mocks.{js,jsx,ts,tsx}",
"!src/fixtures/**/*.{js,jsx,ts,tsx}"
],
"coverageReporters": [
"text-summary",
Expand Down
12 changes: 6 additions & 6 deletions packages/portfolio/src/adapters/dullahan-api/api-maker.mocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ import {Api, Portfolio} from '@yoroi/types'

import {tokenMocks} from '../token.mocks'

export const responseTokenDiscoveriesMocks = asyncBehavior.maker<
export const responseTokenDiscoveryMocks = asyncBehavior.maker<
Api.Response<Portfolio.Api.TokenDiscoveryResponse>
>({
data: {
tag: 'right',
value: {status: 200, data: tokenMocks.apiResponse.tokenDiscovery},
value: {status: 200, data: tokenMocks.nftCryptoKitty.discovery},
},
emptyRepresentation: null,
})
Expand All @@ -25,17 +25,17 @@ export const responseTokenInfosMocks = asyncBehavior.maker<
})

const success: Portfolio.Api.Api = {
tokenDiscovery: responseTokenDiscoveriesMocks.success,
tokenDiscovery: responseTokenDiscoveryMocks.success,
tokenInfos: responseTokenInfosMocks.success,
}

const delayed: Portfolio.Api.Api = {
tokenDiscovery: responseTokenDiscoveriesMocks.delayed,
tokenDiscovery: responseTokenDiscoveryMocks.delayed,
tokenInfos: responseTokenInfosMocks.delayed,
}

const loading: Portfolio.Api.Api = {
tokenDiscovery: responseTokenDiscoveriesMocks.loading,
tokenDiscovery: responseTokenDiscoveryMocks.loading,
tokenInfos: responseTokenInfosMocks.loading,
}

Expand All @@ -61,7 +61,7 @@ const error: Portfolio.Api.Api = {
}

const empty: Portfolio.Api.Api = {
tokenDiscovery: responseTokenDiscoveriesMocks.empty,
tokenDiscovery: responseTokenDiscoveryMocks.empty,
tokenInfos: responseTokenInfosMocks.empty,
}

Expand Down
27 changes: 24 additions & 3 deletions packages/portfolio/src/adapters/token-discovery.mocks.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {cacheRecordMaker} from '@yoroi/common'
import {App, Portfolio} from '@yoroi/types'
import {Api, App, Portfolio} from '@yoroi/types'
import {freeze} from 'immer'

import {tokenInfoMocks} from './token-info.mocks'
Expand Down Expand Up @@ -61,8 +61,29 @@ const rnftWhatever: Portfolio.Token.Discovery = {
},
}

const apiResponseTokenDiscovery: Portfolio.Api.TokenDiscoveryResponse = freeze(
nftCryptoKitty,
const apiResponseTokenDiscovery: Readonly<
Record<
'success' | 'error',
Api.Response<Portfolio.Api.TokenDiscoveryResponse>
>
> = freeze(
{
success: {
tag: 'right',
value: {
status: 200,
data: nftCryptoKitty,
},
},
error: {
tag: 'left',
error: {
status: 404,
responseData: null,
message: 'Not found',
},
},
},
true,
)

Expand Down
18 changes: 18 additions & 0 deletions packages/portfolio/src/fixtures/wrapperMaker.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import {ErrorBoundary, SuspenseBoundary} from '@yoroi/common'
import * as React from 'react'
import {QueryClient, QueryClientProvider} from 'react-query'

type Props = {
queryClient: QueryClient
}

export const wrapperMaker =
({queryClient}: Props) =>
({children}: {children: React.ReactNode}) =>
(
<QueryClientProvider client={queryClient}>
<ErrorBoundary>
<SuspenseBoundary>{children}</SuspenseBoundary>
</ErrorBoundary>
</QueryClientProvider>
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
import * as React from 'react'
import {QueryClient} from 'react-query'
import {Text, View} from 'react-native'
import {render, waitFor} from '@testing-library/react-native'
import {queryClientFixture} from '@yoroi/common'
import {Chain} from '@yoroi/types'

import {tokenDiscoveryMocks} from '../../adapters/token-discovery.mocks'
import {usePorfolioTokenDiscovery} from './usePortfolioTokenDiscovery'
import {wrapperMaker} from '../../fixtures/wrapperMaker'

describe('usePortfolioTokenDiscovery', () => {
let queryClient: QueryClient

beforeEach(() => {
jest.clearAllMocks()
queryClient = queryClientFixture()
})

afterEach(() => {
queryClient.clear()
})

it('success', async () => {
const mockedGetTokenDiscovery = jest
.fn()
.mockResolvedValue(tokenDiscoveryMocks.apiResponseResult.success)

const TestComponent = () => {
const {data} = usePorfolioTokenDiscovery(
{
id: tokenDiscoveryMocks.nftCryptoKitty.id,
network: Chain.Network.Mainnet,
getTokenDiscovery: mockedGetTokenDiscovery,
},
{
suspense: true,
},
)
return (
<View>
<Text testID="data">{JSON.stringify(data?.id)}</Text>
</View>
)
}
const wrapper = wrapperMaker({
queryClient,
})
const {getByTestId} = render(<TestComponent />, {wrapper})

await waitFor(() => {
expect(getByTestId('data')).toBeDefined()
})

expect(getByTestId('data').props.children).toEqual(
JSON.stringify(tokenDiscoveryMocks.nftCryptoKitty.id),
)
expect(mockedGetTokenDiscovery).toHaveBeenCalled()
expect(mockedGetTokenDiscovery).toHaveBeenCalledWith(
tokenDiscoveryMocks.nftCryptoKitty.id,
)
})

it('error', async () => {
const mockedGetTokenDiscovery = jest
.fn()
.mockResolvedValue(tokenDiscoveryMocks.apiResponseResult.error)

const TestComponent = () => {
const {data} = usePorfolioTokenDiscovery(
{
id: tokenDiscoveryMocks.nftCryptoKitty.id,
network: Chain.Network.Mainnet,
getTokenDiscovery: mockedGetTokenDiscovery,
},
{
suspense: true,
},
)
return (
<View>
<Text testID="data">{JSON.stringify(data?.id)}</Text>
</View>
)
}
const wrapper = wrapperMaker({
queryClient,
})
const {getByTestId} = render(<TestComponent />, {wrapper})

await waitFor(() => {
expect(getByTestId('hasError')).toBeDefined()
})
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import {isRight} from '@yoroi/common'
import {Chain, Portfolio} from '@yoroi/types'
import {UseQueryOptions, useQuery} from 'react-query'

export function usePorfolioTokenDiscovery(
{
id,
getTokenDiscovery,
network,
}: {
id: Portfolio.Token.Id
getTokenDiscovery: Portfolio.Api.Api['tokenDiscovery']
network: Chain.SupportedNetworks
},
options?: UseQueryOptions<
Portfolio.Token.Discovery,
Error,
Portfolio.Token.Discovery,
[Chain.SupportedNetworks, 'usePorfolioTokenDiscovery', Portfolio.Token.Id]
>,
) {
const query = useQuery({
queryKey: [network, 'usePorfolioTokenDiscovery', id],
...options,
queryFn: async () => {
const response = await getTokenDiscovery(id)
if (isRight(response)) return response.value.data
throw new Error('usePorfolioTokenDiscovery')
},
})

return {
...query,
tokenDiscovery: query.data,
}
}

0 comments on commit a673cf6

Please sign in to comment.