import assert from 'assert'; import * as reactRedux from 'react-redux'; import { renderHook } from '@testing-library/react-hooks'; import sinon from 'sinon'; import transactions from '../../../../test/data/transaction-data.json'; import { getConversionRate, getSelectedAccount } from '../../selectors'; import { useCancelTransaction } from '../useCancelTransaction'; import { showModal } from '../../store/actions'; import { increaseLastGasPrice } from '../../helpers/utils/confirm-tx.util'; describe('useCancelTransaction', function () { let useSelector; const dispatch = sinon.spy(); before(function () { sinon.stub(reactRedux, 'useDispatch').returns(dispatch); }); afterEach(function () { dispatch.resetHistory(); }); describe('when account has insufficient balance to cover gas', function () { before(function () { useSelector = sinon.stub(reactRedux, 'useSelector'); useSelector.callsFake((selector) => { if (selector === getConversionRate) { return 280.46; } else if (selector === getSelectedAccount) { return { balance: '0x3', }; } return undefined; }); }); transactions.forEach((transactionGroup) => { const originalGasPrice = transactionGroup.primaryTransaction.txParams?.gasPrice; const gasPrice = originalGasPrice && increaseLastGasPrice(originalGasPrice); const transactionId = transactionGroup.initialTransaction.id; it(`should indicate account has insufficient funds to cover ${gasPrice} gas price`, function () { const { result } = renderHook(() => useCancelTransaction(transactionGroup), ); assert.strictEqual(result.current[0], false); }); it(`should return a function that kicks off cancellation for id ${transactionId}`, function () { const { result } = renderHook(() => useCancelTransaction(transactionGroup), ); assert.strictEqual(typeof result.current[1], 'function'); result.current[1]({ preventDefault: () => undefined, stopPropagation: () => undefined, }); assert.strictEqual( dispatch.calledWith( showModal({ name: 'CANCEL_TRANSACTION', transactionId, originalGasPrice, }), ), true, ); }); }); after(function () { useSelector.restore(); }); }); describe('when account has sufficient balance to cover gas', function () { before(function () { useSelector = sinon.stub(reactRedux, 'useSelector'); useSelector.callsFake((selector) => { if (selector === getConversionRate) { return 280.46; } else if (selector === getSelectedAccount) { return { balance: '0x9C2007651B2500000', }; } return undefined; }); }); transactions.forEach((transactionGroup) => { const originalGasPrice = transactionGroup.primaryTransaction.txParams?.gasPrice; const gasPrice = originalGasPrice && increaseLastGasPrice(originalGasPrice); const transactionId = transactionGroup.initialTransaction.id; it(`should indicate account has funds to cover ${gasPrice} gas price`, function () { const { result } = renderHook(() => useCancelTransaction(transactionGroup), ); assert.strictEqual(result.current[0], true); }); it(`should return a function that kicks off cancellation for id ${transactionId}`, function () { const { result } = renderHook(() => useCancelTransaction(transactionGroup), ); assert.strictEqual(typeof result.current[1], 'function'); result.current[1]({ preventDefault: () => undefined, stopPropagation: () => undefined, }); assert.strictEqual( dispatch.calledWith( showModal({ name: 'CANCEL_TRANSACTION', transactionId, originalGasPrice, }), ), true, ); }); }); after(function () { useSelector.restore(); }); }); after(function () { sinon.restore(); }); });