1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00
metamask-extension/ui/selectors/custom-gas.test.js
Mark Stacey ba54a3d83b
Update ESLint config to v8 (#12886)
The ESLint config has been updated to v8. The breaking changes are:

* The Prettier rule `quoteProps` has been changed from `consistent` to
`as-needed`, meaning that if one key requires quoting, only that key is
quoted rather than all keys.
* The ESLint rule `no-shadow` has been made more strict. It now
prevents globals from being shadowed as well.

Most of these changes were applied with `yarn lint:fix`. Only the
shadowing changes required manual fixing (shadowing variable names were
either replaced with destructuring or renamed).

The dependency `globalThis` was added to the list of dynamic
dependencies in the build system, where it should have been already.
This was causing `depcheck` to fail because the new lint rules required
removing the one place where `globalThis` had been erroneously imported
previously.

A rule requiring a newline between multiline blocks and expressions has
been disabled temporarily to make this PR smaller and to avoid
introducing conflicts with other PRs.
2021-12-09 15:36:24 -03:30

758 lines
20 KiB
JavaScript

import { GAS_ESTIMATE_TYPES, GAS_LIMITS } from '../../shared/constants/gas';
import {
getCustomGasLimit,
getCustomGasPrice,
getRenderableBasicEstimateData,
getRenderableEstimateDataForSmallButtonsFromGWEI,
isCustomPriceSafe,
isCustomPriceExcessive,
} from './custom-gas';
describe('custom-gas selectors', () => {
describe('getCustomGasPrice()', () => {
it('should return gas.customData.price', () => {
const mockState = { gas: { customData: { price: 'mockPrice' } } };
expect(getCustomGasPrice(mockState)).toStrictEqual('mockPrice');
});
});
describe('isCustomGasPriceSafe()', () => {
it('should return true for gas.customData.price 0x77359400', () => {
const mockState = {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
low: '1',
},
networkDetails: {
EIPS: {},
},
},
gas: {
customData: { price: '0x77359400' },
},
};
expect(isCustomPriceSafe(mockState)).toStrictEqual(true);
});
it('should return true for gas.customData.price null', () => {
const mockState = {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
low: '1',
},
networkDetails: {
EIPS: {},
},
},
gas: {
customData: { price: null },
},
};
expect(isCustomPriceSafe(mockState)).toStrictEqual(true);
});
it('should return true gas.customData.price undefined', () => {
const mockState = {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
low: '1',
},
networkDetails: {
EIPS: {},
},
},
gas: {
customData: { price: undefined },
},
};
expect(isCustomPriceSafe(mockState)).toStrictEqual(true);
});
it('should return false gas.basicEstimates.safeLow undefined', () => {
const mockState = {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.NONE,
gasFeeEstimates: {
low: undefined,
},
networkDetails: {
EIPS: {},
},
},
gas: {
customData: { price: '0x77359400' },
},
};
expect(isCustomPriceSafe(mockState)).toStrictEqual(false);
});
});
describe('isCustomPriceExcessive()', () => {
it('should return false for gas.customData.price null', () => {
const mockState = {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
high: '150',
},
networkDetails: {
EIPS: {},
},
},
gas: {
customData: { price: null },
},
};
expect(isCustomPriceExcessive(mockState)).toStrictEqual(false);
});
it('should return false gas.basicEstimates.fast undefined', () => {
const mockState = {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
high: undefined,
},
networkDetails: {
EIPS: {},
},
},
gas: {
customData: { price: '0x77359400' },
},
};
expect(isCustomPriceExcessive(mockState)).toStrictEqual(false);
});
it('should return false gas.basicEstimates.price 0x205d0bae00 (139)', () => {
const mockState = {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
high: '139',
},
networkDetails: {
EIPS: {},
},
},
gas: {
customData: { price: '0x205d0bae00' },
},
};
expect(isCustomPriceExcessive(mockState)).toStrictEqual(false);
});
it('should return false gas.basicEstimates.price 0x1bf08eb000 (120)', () => {
const mockState = {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
high: '139',
},
networkDetails: {
EIPS: {},
},
},
gas: {
customData: { price: '0x1bf08eb000' },
},
};
expect(isCustomPriceExcessive(mockState)).toStrictEqual(false);
});
it('should return false gas.basicEstimates.price 0x28bed01600 (175)', () => {
const mockState = {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
high: '139',
},
networkDetails: {
EIPS: {},
},
},
gas: {
customData: { price: '0x28bed01600' },
},
};
expect(isCustomPriceExcessive(mockState)).toStrictEqual(false);
});
it('should return true gas.basicEstimates.price 0x30e4f9b400 (210)', () => {
const mockState = {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
high: '139',
},
networkDetails: {
EIPS: {},
},
},
gas: {
customData: { price: '0x30e4f9b400' },
},
};
expect(isCustomPriceExcessive(mockState)).toStrictEqual(true);
});
it('should return false gas.basicEstimates.price 0x28bed01600 (175) (checkSend=true)', () => {
const mockState = {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
high: '139',
},
networkDetails: {
EIPS: {},
},
},
send: {
gas: {
gasPrice: '0x28bed0160',
},
},
gas: {
customData: { price: null },
},
};
expect(isCustomPriceExcessive(mockState, true)).toStrictEqual(false);
});
it('should return true gas.basicEstimates.price 0x30e4f9b400 (210) (checkSend=true)', () => {
const mockState = {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
high: '139',
},
networkDetails: {
EIPS: {},
},
},
send: {
gas: {
gasPrice: '0x30e4f9b400',
},
},
gas: {
customData: { price: null },
},
};
expect(isCustomPriceExcessive(mockState, true)).toStrictEqual(true);
});
});
describe('getCustomGasLimit()', () => {
it('should return gas.customData.limit', () => {
const mockState = { gas: { customData: { limit: 'mockLimit' } } };
expect(getCustomGasLimit(mockState)).toStrictEqual('mockLimit');
});
});
describe('getRenderableBasicEstimateData()', () => {
const tests = [
{
expectedResult: [
{
gasEstimateType: 'SLOW',
feeInSecondaryCurrency: '$0.01',
feeInPrimaryCurrency: '0.0000525 ETH',
priceInHexWei: '0x9502f900',
},
{
gasEstimateType: 'AVERAGE',
feeInPrimaryCurrency: '0.000084 ETH',
feeInSecondaryCurrency: '$0.02',
priceInHexWei: '0xee6b2800',
},
{
gasEstimateType: 'FAST',
feeInSecondaryCurrency: '$0.03',
feeInPrimaryCurrency: '0.000105 ETH',
priceInHexWei: '0x12a05f200',
},
],
mockState: {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
low: '2.5',
medium: '4',
high: '5',
},
networkDetails: {
EIPS: {},
},
conversionRate: 255.71,
currentCurrency: 'usd',
preferences: {
showFiatInTestnets: false,
},
provider: {
type: 'mainnet',
chainId: '0x1',
},
},
},
},
{
expectedResult: [
{
gasEstimateType: 'SLOW',
feeInSecondaryCurrency: '$0.27',
feeInPrimaryCurrency: '0.000105 ETH',
priceInHexWei: '0x12a05f200',
},
{
feeInPrimaryCurrency: '0.000147 ETH',
feeInSecondaryCurrency: '$0.38',
gasEstimateType: 'AVERAGE',
priceInHexWei: '0x1a13b8600',
},
{
gasEstimateType: 'FAST',
feeInSecondaryCurrency: '$0.54',
feeInPrimaryCurrency: '0.00021 ETH',
priceInHexWei: '0x2540be400',
},
],
mockState: {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
low: '5',
medium: '7',
high: '10',
},
networkDetails: {
EIPS: {},
},
conversionRate: 2557.1,
currentCurrency: 'usd',
preferences: {
showFiatInTestnets: false,
},
provider: {
type: 'mainnet',
chainId: '0x1',
},
},
send: {
gas: {
gasLimit: GAS_LIMITS.SIMPLE,
},
},
},
},
{
expectedResult: [
{
gasEstimateType: 'SLOW',
feeInSecondaryCurrency: '',
feeInPrimaryCurrency: '0.000105 ETH',
priceInHexWei: '0x12a05f200',
},
{
gasEstimateType: 'AVERAGE',
feeInPrimaryCurrency: '0.000147 ETH',
feeInSecondaryCurrency: '',
priceInHexWei: '0x1a13b8600',
},
{
gasEstimateType: 'FAST',
feeInSecondaryCurrency: '',
feeInPrimaryCurrency: '0.00021 ETH',
priceInHexWei: '0x2540be400',
},
],
mockState: {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
low: '5',
medium: '7',
high: '10',
},
networkDetails: {
EIPS: {},
},
conversionRate: 2557.1,
currentCurrency: 'usd',
preferences: {
showFiatInTestnets: false,
},
provider: {
type: 'rinkeby',
chainId: '0x4',
},
},
send: {
gas: {
gasLimit: GAS_LIMITS.SIMPLE,
},
},
},
},
{
expectedResult: [
{
gasEstimateType: 'SLOW',
feeInSecondaryCurrency: '$0.27',
feeInPrimaryCurrency: '0.000105 ETH',
priceInHexWei: '0x12a05f200',
},
{
gasEstimateType: 'AVERAGE',
feeInPrimaryCurrency: '0.000147 ETH',
feeInSecondaryCurrency: '$0.38',
priceInHexWei: '0x1a13b8600',
},
{
gasEstimateType: 'FAST',
feeInSecondaryCurrency: '$0.54',
feeInPrimaryCurrency: '0.00021 ETH',
priceInHexWei: '0x2540be400',
},
],
mockState: {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
low: '5',
medium: '7',
high: '10',
},
networkDetails: {
EIPS: {},
},
conversionRate: 2557.1,
currentCurrency: 'usd',
preferences: {
showFiatInTestnets: true,
},
provider: {
type: 'rinkeby',
chainId: '0x4',
},
},
send: {
gas: {
gasLimit: GAS_LIMITS.SIMPLE,
},
},
},
},
{
expectedResult: [
{
gasEstimateType: 'SLOW',
feeInSecondaryCurrency: '$0.27',
feeInPrimaryCurrency: '0.000105 ETH',
priceInHexWei: '0x12a05f200',
},
{
gasEstimateType: 'AVERAGE',
feeInPrimaryCurrency: '0.000147 ETH',
feeInSecondaryCurrency: '$0.38',
priceInHexWei: '0x1a13b8600',
},
{
gasEstimateType: 'FAST',
feeInSecondaryCurrency: '$0.54',
feeInPrimaryCurrency: '0.00021 ETH',
priceInHexWei: '0x2540be400',
},
],
mockState: {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
low: '5',
medium: '7',
high: '10',
},
networkDetails: {
EIPS: {},
},
conversionRate: 2557.1,
currentCurrency: 'usd',
preferences: {
showFiatInTestnets: true,
},
provider: {
type: 'mainnet',
chainId: '0x1',
},
},
send: {
gas: {
gasLimit: GAS_LIMITS.SIMPLE,
},
},
},
},
];
it('should return renderable data about basic estimates', () => {
tests.forEach(({ expectedResult, mockState, useFastestButtons }) => {
expect(
getRenderableBasicEstimateData(
mockState,
GAS_LIMITS.SIMPLE,
useFastestButtons,
),
).toStrictEqual(expectedResult);
});
});
});
describe('getRenderableEstimateDataForSmallButtonsFromGWEI()', () => {
const tests = [
{
expectedResult: [
{
feeInSecondaryCurrency: '$0.13',
feeInPrimaryCurrency: '0.00052 ETH',
gasEstimateType: 'SLOW',
priceInHexWei: '0x5d21dba00',
},
{
feeInSecondaryCurrency: '$0.16',
feeInPrimaryCurrency: '0.00063 ETH',
gasEstimateType: 'AVERAGE',
priceInHexWei: '0x6fc23ac00',
},
{
feeInSecondaryCurrency: '$0.27',
feeInPrimaryCurrency: '0.00105 ETH',
gasEstimateType: 'FAST',
priceInHexWei: '0xba43b7400',
},
],
mockState: {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
low: '25',
medium: '30',
high: '50',
},
networkDetails: {
EIPS: {},
},
conversionRate: 255.71,
currentCurrency: 'usd',
preferences: {
showFiatInTestnets: false,
},
provider: {
type: 'mainnet',
chainId: '0x1',
},
},
send: {
gas: {
gasLimit: GAS_LIMITS.SIMPLE,
},
},
},
},
{
expectedResult: [
{
feeInSecondaryCurrency: '$2.68',
feeInPrimaryCurrency: '0.00105 ETH',
gasEstimateType: 'SLOW',
priceInHexWei: '0xba43b7400',
},
{
feeInSecondaryCurrency: '$4.03',
feeInPrimaryCurrency: '0.00157 ETH',
gasEstimateType: 'AVERAGE',
priceInHexWei: '0x1176592e00',
},
{
feeInSecondaryCurrency: '$5.37',
feeInPrimaryCurrency: '0.0021 ETH',
gasEstimateType: 'FAST',
priceInHexWei: '0x174876e800',
},
],
mockState: {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
low: '50',
medium: '75',
high: '100',
},
networkDetails: {
EIPS: {},
},
conversionRate: 2557.1,
currentCurrency: 'usd',
preferences: {
showFiatInTestnets: false,
},
provider: {
type: 'mainnet',
chainId: '0x1',
},
},
send: {
gas: {
gasLimit: GAS_LIMITS.SIMPLE,
},
},
},
},
{
expectedResult: [
{
feeInSecondaryCurrency: '',
feeInPrimaryCurrency: '0.00105 ETH',
gasEstimateType: 'SLOW',
priceInHexWei: '0xba43b7400',
},
{
feeInSecondaryCurrency: '',
feeInPrimaryCurrency: '0.00157 ETH',
gasEstimateType: 'AVERAGE',
priceInHexWei: '0x1176592e00',
},
{
feeInSecondaryCurrency: '',
feeInPrimaryCurrency: '0.0021 ETH',
gasEstimateType: 'FAST',
priceInHexWei: '0x174876e800',
},
],
mockState: {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
low: '50',
medium: '75',
high: '100',
},
networkDetails: {
EIPS: {},
},
conversionRate: 2557.1,
currentCurrency: 'usd',
preferences: {
showFiatInTestnets: false,
},
provider: {
type: 'rinkeby',
chainId: '0x4',
},
},
send: {
gas: {
gasLimit: GAS_LIMITS.SIMPLE,
},
},
},
},
{
expectedResult: [
{
feeInSecondaryCurrency: '$2.68',
feeInPrimaryCurrency: '0.00105 ETH',
gasEstimateType: 'SLOW',
priceInHexWei: '0xba43b7400',
},
{
feeInSecondaryCurrency: '$4.03',
feeInPrimaryCurrency: '0.00157 ETH',
gasEstimateType: 'AVERAGE',
priceInHexWei: '0x1176592e00',
},
{
feeInSecondaryCurrency: '$5.37',
feeInPrimaryCurrency: '0.0021 ETH',
gasEstimateType: 'FAST',
priceInHexWei: '0x174876e800',
},
],
mockState: {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
low: '50',
medium: '75',
high: '100',
},
networkDetails: {
EIPS: {},
},
conversionRate: 2557.1,
currentCurrency: 'usd',
preferences: {
showFiatInTestnets: true,
},
provider: {
type: 'rinkeby',
chainId: '0x4',
},
},
send: {
gas: {
gasLimit: GAS_LIMITS.SIMPLE,
},
},
},
},
{
expectedResult: [
{
feeInSecondaryCurrency: '$2.68',
feeInPrimaryCurrency: '0.00105 ETH',
gasEstimateType: 'SLOW',
priceInHexWei: '0xba43b7400',
},
{
feeInSecondaryCurrency: '$4.03',
feeInPrimaryCurrency: '0.00157 ETH',
gasEstimateType: 'AVERAGE',
priceInHexWei: '0x1176592e00',
},
{
feeInSecondaryCurrency: '$5.37',
feeInPrimaryCurrency: '0.0021 ETH',
gasEstimateType: 'FAST',
priceInHexWei: '0x174876e800',
},
],
mockState: {
metamask: {
gasEstimateType: GAS_ESTIMATE_TYPES.LEGACY,
gasFeeEstimates: {
low: '50',
medium: '75',
high: '100',
},
networkDetails: {
EIPS: {},
},
conversionRate: 2557.1,
currentCurrency: 'usd',
preferences: {
showFiatInTestnets: true,
},
provider: {
type: 'mainnet',
chainId: '0x1',
},
},
send: {
gas: {
gasLimit: GAS_LIMITS.SIMPLE,
},
},
},
},
];
it('should return renderable data about basic estimates appropriate for buttons with less info', () => {
tests.forEach(({ expectedResult, mockState }) => {
expect(
getRenderableEstimateDataForSmallButtonsFromGWEI(mockState),
).toStrictEqual(expectedResult);
});
});
});
});