import {QueryClient} from 'react-query'
import {renderHook, act} from '@testing-library/react-hooks'
import {queryClientFixture} from '@yoroi/common'
import {Claim, Scan} from '@yoroi/types'

import {
  claimApiMockResponses,
  claimManagerMockInstances,
} from '../../../manager.mocks'
import {wrapperMaker} from '../../../fixtures/wrapperMaker'
import {useClaimTokens} from './useClaimTokens'

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

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

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

  const scanClaimAction: Scan.ActionClaim = {
    action: 'claim',
    code: 'code',
    params: {},
    url: 'url',
  }

  it('success', async () => {
    const claimManagerMock: Claim.Manager = {
      ...claimManagerMockInstances.processing,
      claimTokens: jest
        .fn()
        .mockResolvedValue(claimApiMockResponses.claimTokens.processing),
    }

    const wrapper = wrapperMaker({
      claimManager: claimManagerMock,
      queryClient,
    })

    const {result, waitFor: waitForHook} = renderHook(() => useClaimTokens(), {
      wrapper,
    })

    await act(async () => result.current.claimTokens(scanClaimAction))

    await waitForHook(() => expect(result.current.isLoading).toBe(false))

    expect(claimManagerMock.claimTokens).toHaveBeenCalledTimes(1)
    expect(claimManagerMock.claimTokens).toHaveBeenCalledWith(scanClaimAction)
    expect(result.current.isError).toBe(false)
  })
})
