/* eslint-disable jest/no-conditional-expect */
import { BigNumber } from '@ethersproject/bignumber';
import { renderHook } from '@testing-library/react-hooks';
import { TransactionType } from '../../shared/constants/transaction';
import { useTokenData } from './useTokenData';

const tests = [
  {
    data: '0xa9059cbb000000000000000000000000ffe5bc4e8f1f969934d773fa67da095d2e491a970000000000000000000000000000000000000000000000000000000000003a98',
    tokenData: {
      name: TransactionType.tokenMethodTransfer,
      args: [
        '0xffe5bc4e8f1f969934d773fa67da095d2e491a97',
        BigNumber.from(15000),
      ],
    },
  },
  {
    data: '0xa9059cbb000000000000000000000000ffe5bc4e8f1f969934d773fa67da095d2e491a9700000000000000000000000000000000000000000000000000000000000061a8',
    tokenData: {
      name: TransactionType.tokenMethodTransfer,
      args: [
        '0xffe5bc4e8f1f969934d773fa67da095d2e491a97',
        BigNumber.from(25000),
      ],
    },
  },
  {
    data: '0xa9059cbb000000000000000000000000ffe5bc4e8f1f969934d773fa67da095d2e491a970000000000000000000000000000000000000000000000000000000000002710',
    tokenData: {
      name: TransactionType.tokenMethodTransfer,
      args: [
        '0xffe5bc4e8f1f969934d773fa67da095d2e491a97',
        BigNumber.from(10000),
      ],
    },
  },
  {
    data: undefined,
    tokenData: null,
  },
];

describe('useTokenData', () => {
  tests.forEach(({ data, tokenData }) => {
    const testTitle =
      // eslint-disable-next-line no-negated-condition
      tokenData !== null
        ? `should return properly decoded data with _value ${tokenData.args[1]}`
        : `should return null when no data provided`;
    it(`${testTitle}`, () => {
      const { result } = renderHook(() => useTokenData(data));
      if (tokenData) {
        expect(result.current.name).toStrictEqual(tokenData.name);
        expect(result.current.args[0].toLowerCase()).toStrictEqual(
          tokenData.args[0],
        );
        expect(tokenData.args[1].toHexString()).toStrictEqual(
          result.current.args[1].toHexString(),
        );
      } else {
        expect(result.current).toStrictEqual(tokenData);
      }
    });
  });
});
