MyCrypto/spec/sagas/transaction/sendEverything.spec.ts

186 lines
5.5 KiB
TypeScript

import { apply, put, select } from 'redux-saga/effects';
import {
sendEverythingFailed,
setValueField,
setTokenValue,
sendEverythingSucceeded
} from 'actions/transaction';
import { showNotification } from 'actions/notifications';
import { isEtherTransaction, getTransaction, getDecimal } from 'selectors/transaction';
import { getEtherBalance, getCurrentBalance } from 'selectors/wallet';
import { fromTokenBase, fromWei, Wei } from 'libs/units';
import { handleSendEverything } from 'sagas/transaction/sendEverything';
import { cloneableGenerator } from 'redux-saga/utils';
import { SagaIterator } from 'redux-saga';
import BN from 'bn.js';
describe('handleSendEverything*', () => {
let random: () => number;
beforeAll(() => {
random = Math.random;
Math.random = () => 0.001;
});
afterAll(() => {
Math.random = random;
});
const sharedStart = (gen: SagaIterator, transactionObj: any, currentBalance: BN | null) => {
it('should select getTransaction', () => {
expect(gen.next().value).toEqual(select(getTransaction));
});
it('should select getCurrentBalance', () => {
expect(gen.next(transactionObj).value).toEqual(select(getCurrentBalance));
});
it('should select getEtherBalance', () => {
expect(gen.next(currentBalance).value).toEqual(select(getEtherBalance));
});
};
describe('!etherBalance', () => {
const transactionObj = {
transaction: 'transaction'
};
const currentBalance = Wei('100');
const etherBalance = null;
const gen = handleSendEverything();
sharedStart(gen, transactionObj, currentBalance);
it('should put sendEverythingFailed', () => {
expect(gen.next(etherBalance).value).toEqual(put(sendEverythingFailed()));
});
});
describe('!currentBalance', () => {
const transactionObj = {
transaction: 'transaction'
};
const currentBalance = null;
const etherBalance = Wei('100');
const gen = handleSendEverything();
sharedStart(gen, transactionObj, currentBalance);
it('should put sendEverythingFailed', () => {
expect(gen.next(etherBalance).value).toEqual(put(sendEverythingFailed()));
});
});
describe('etherBalance && currentBalance', () => {
const transaction = {
getUpfrontCost: jest.fn()
};
const transactionObj = { transaction };
const currentBalance = Wei('100');
const etherBalance = Wei('100');
const etherTransaction = true;
const gens: any = {};
gens.gen = cloneableGenerator(handleSendEverything)();
gens.clone1 = {};
gens.clone2 = {};
sharedStart(gens.gen, transactionObj, currentBalance);
it('should select isEtherTransaction', () => {
expect(gens.gen.next(etherBalance).value).toEqual(select(isEtherTransaction));
});
it('should apply transaction.getUpfrontCost', () => {
gens.clone2 = gens.gen.clone();
expect(gens.gen.next(etherTransaction).value).toEqual(
apply(transaction, transaction.getUpfrontCost)
);
gens.clone1 = gens.gen.clone();
});
describe('if totalCost > etherBalance', () => {
const totalCost = Wei('1000');
it('should put showNotification', () => {
expect(gens.clone1.next(totalCost).value).toEqual(
put(
showNotification(
'warning',
`The cost of gas is higher than your balance:
Total cost: ${totalCost} >
Your Ether balance: ${etherBalance}`
)
)
);
});
it('should put sendEverythingFailed', () => {
expect(gens.clone1.next().value).toEqual(put(sendEverythingFailed()));
});
it('should put setValueField', () => {
expect(gens.clone1.next().value).toEqual(put(setValueField({ raw: '0', value: null })));
});
it('should be done', () => {
expect(gens.clone1.next().done).toEqual(true);
});
});
describe('if etherTransaction', () => {
const totalCost = Wei('10');
const remainder = currentBalance.sub(totalCost);
const rawVersion = fromWei(remainder, 'ether');
it('should put setValueField', () => {
expect(gens.gen.next(totalCost).value).toEqual(
put(
setValueField({
raw: rawVersion,
value: remainder
})
)
);
});
it('should put sendEverythingSucceeded', () => {
expect(gens.gen.next().value).toEqual(put(sendEverythingSucceeded()));
});
it('should be done', () => {
expect(gens.gen.next().done).toEqual(true);
});
});
describe('if !etherTransaction (a token tx)', () => {
const totalCostLocal = Wei('1');
const etherTransactionLocal = false;
const decimal = 3;
const rawVersion = fromTokenBase(currentBalance, decimal);
it('should apply transaction.getUpfrontCost', () => {
expect(gens.clone2.next(etherTransactionLocal).value).toEqual(
apply(transaction, transaction.getUpfrontCost)
);
});
it('should select getDecimal', () => {
expect(gens.clone2.next(totalCostLocal).value).toEqual(select(getDecimal));
});
it('should put setTokenValue', () => {
expect(gens.clone2.next(decimal).value).toEqual(
put(setTokenValue({ raw: rawVersion, value: currentBalance }))
);
});
it('should put sendEverythingSucceeded', () => {
expect(gens.clone2.next().value).toEqual(put(sendEverythingSucceeded()));
});
it('should be done', () => {
expect(gens.clone2.next().done).toEqual(true);
});
});
});
});