mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
Setup network controller mocks per-test (#17250)
The network controller unit test network mocks are now setup for each test. This makes modifying network behavior on a per-test basis easier, and makes it more clear which test relies upon which mocks.
This commit is contained in:
parent
180eabea06
commit
d6cf809bcc
@ -75,6 +75,8 @@ export const NETWORK_EVENTS = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default class NetworkController extends EventEmitter {
|
export default class NetworkController extends EventEmitter {
|
||||||
|
static defaultProviderConfig = defaultProviderConfig;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a NetworkController.
|
* Construct a NetworkController.
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import nock from 'nock';
|
import nock from 'nock';
|
||||||
import { deferredPromise } from '../../lib/util';
|
import { deferredPromise } from '../../lib/util';
|
||||||
|
import { NETWORK_TYPES } from '../../../../shared/constants/network';
|
||||||
import NetworkController, { NETWORK_EVENTS } from './network-controller';
|
import NetworkController, { NETWORK_EVENTS } from './network-controller';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -80,26 +81,51 @@ async function withController(...args) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup Nock mocks for the block tracker.
|
||||||
|
*
|
||||||
|
* @param {object} options - Options.
|
||||||
|
* @param {NETWORK_TYPES} options.networkType - The network type to mock.
|
||||||
|
* @param {object} options.block - The mock block to return.
|
||||||
|
* @param {Record<string, number>} options.requests - A set of methods to setup
|
||||||
|
* mocks for, mapped to the number of times to expect each request.
|
||||||
|
*/
|
||||||
|
function setupMockRpcBlockResponses({
|
||||||
|
networkType = NetworkController.defaultProviderConfig.type,
|
||||||
|
block = BLOCK,
|
||||||
|
requests = { eth_getBlockByNumber: 1, eth_blockNumber: 1 },
|
||||||
|
} = {}) {
|
||||||
|
const rpcUrl =
|
||||||
|
networkType === NETWORK_TYPES.RPC
|
||||||
|
? 'http://localhost:8545/'
|
||||||
|
: `https://${networkType}.infura.io/v3/${defaultControllerOptions.infuraProjectId}`;
|
||||||
|
const { origin, pathname } = new URL(rpcUrl);
|
||||||
|
|
||||||
|
const scope = nock(origin);
|
||||||
|
|
||||||
|
if (requests.eth_getBlockByNumber) {
|
||||||
|
scope
|
||||||
|
.post(
|
||||||
|
pathname,
|
||||||
|
(body) =>
|
||||||
|
body.method === 'eth_getBlockByNumber' &&
|
||||||
|
body.params[0] === block.number,
|
||||||
|
)
|
||||||
|
.times(requests.eth_getBlockByNumber)
|
||||||
|
.reply(200, () => JSON.stringify(constructSuccessfulRpcResponse(block)));
|
||||||
|
}
|
||||||
|
if (requests.eth_blockNumber) {
|
||||||
|
scope
|
||||||
|
.post(pathname, (body) => body.method === 'eth_blockNumber')
|
||||||
|
.times(requests.eth_blockNumber)
|
||||||
|
.reply(200, () =>
|
||||||
|
JSON.stringify(constructSuccessfulRpcResponse(block.number)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
describe('NetworkController', () => {
|
describe('NetworkController', () => {
|
||||||
describe('controller', () => {
|
describe('controller', () => {
|
||||||
let latestBlock;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
latestBlock = BLOCK;
|
|
||||||
nock('http://localhost:8545')
|
|
||||||
.persist()
|
|
||||||
.post(/.*/u)
|
|
||||||
.reply(200, () =>
|
|
||||||
JSON.stringify(constructSuccessfulRpcResponse(latestBlock)),
|
|
||||||
);
|
|
||||||
nock('https://mainnet.infura.io')
|
|
||||||
.persist()
|
|
||||||
.post('/v3/foo')
|
|
||||||
.reply(200, () =>
|
|
||||||
JSON.stringify(constructSuccessfulRpcResponse(latestBlock)),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
nock.cleanAll();
|
nock.cleanAll();
|
||||||
});
|
});
|
||||||
@ -107,6 +133,7 @@ describe('NetworkController', () => {
|
|||||||
describe('#provider', () => {
|
describe('#provider', () => {
|
||||||
it('provider should be updatable without reassignment', async () => {
|
it('provider should be updatable without reassignment', async () => {
|
||||||
await withController(async ({ controller }) => {
|
await withController(async ({ controller }) => {
|
||||||
|
setupMockRpcBlockResponses();
|
||||||
await controller.initializeProvider();
|
await controller.initializeProvider();
|
||||||
const providerProxy =
|
const providerProxy =
|
||||||
controller.getProviderAndBlockTracker().provider;
|
controller.getProviderAndBlockTracker().provider;
|
||||||
@ -127,6 +154,7 @@ describe('NetworkController', () => {
|
|||||||
|
|
||||||
it('should stop the block tracker for the current selected network', async () => {
|
it('should stop the block tracker for the current selected network', async () => {
|
||||||
await withController(async ({ controller }) => {
|
await withController(async ({ controller }) => {
|
||||||
|
setupMockRpcBlockResponses();
|
||||||
await controller.initializeProvider();
|
await controller.initializeProvider();
|
||||||
const { blockTracker } = controller.getProviderAndBlockTracker();
|
const { blockTracker } = controller.getProviderAndBlockTracker();
|
||||||
// The block tracker starts running after a listener is attached
|
// The block tracker starts running after a listener is attached
|
||||||
@ -154,6 +182,8 @@ describe('NetworkController', () => {
|
|||||||
describe('#setProviderType', () => {
|
describe('#setProviderType', () => {
|
||||||
it('should update provider.type', async () => {
|
it('should update provider.type', async () => {
|
||||||
await withController(async ({ controller }) => {
|
await withController(async ({ controller }) => {
|
||||||
|
setupMockRpcBlockResponses({ networkType: NETWORK_TYPES.RPC });
|
||||||
|
setupMockRpcBlockResponses({ networkType: NETWORK_TYPES.MAINNET });
|
||||||
await controller.initializeProvider();
|
await controller.initializeProvider();
|
||||||
controller.setProviderType('mainnet');
|
controller.setProviderType('mainnet');
|
||||||
const { type } = controller.getProviderConfig();
|
const { type } = controller.getProviderConfig();
|
||||||
@ -163,6 +193,8 @@ describe('NetworkController', () => {
|
|||||||
|
|
||||||
it('should set the network to loading', async () => {
|
it('should set the network to loading', async () => {
|
||||||
await withController(async ({ controller }) => {
|
await withController(async ({ controller }) => {
|
||||||
|
setupMockRpcBlockResponses({ networkType: NETWORK_TYPES.RPC });
|
||||||
|
setupMockRpcBlockResponses({ networkType: NETWORK_TYPES.MAINNET });
|
||||||
await controller.initializeProvider();
|
await controller.initializeProvider();
|
||||||
|
|
||||||
controller.setProviderType('mainnet');
|
controller.setProviderType('mainnet');
|
||||||
@ -179,7 +211,7 @@ describe('NetworkController', () => {
|
|||||||
describe('#getEIP1559Compatibility', () => {
|
describe('#getEIP1559Compatibility', () => {
|
||||||
it('should return false when baseFeePerGas is not in the block header', async () => {
|
it('should return false when baseFeePerGas is not in the block header', async () => {
|
||||||
await withController(async ({ controller }) => {
|
await withController(async ({ controller }) => {
|
||||||
latestBlock = PRE_1559_BLOCK;
|
setupMockRpcBlockResponses({ block: PRE_1559_BLOCK });
|
||||||
await controller.initializeProvider();
|
await controller.initializeProvider();
|
||||||
const supportsEIP1559 = await controller.getEIP1559Compatibility();
|
const supportsEIP1559 = await controller.getEIP1559Compatibility();
|
||||||
expect(supportsEIP1559).toStrictEqual(false);
|
expect(supportsEIP1559).toStrictEqual(false);
|
||||||
@ -188,6 +220,7 @@ describe('NetworkController', () => {
|
|||||||
|
|
||||||
it('should return true when baseFeePerGas is in block header', async () => {
|
it('should return true when baseFeePerGas is in block header', async () => {
|
||||||
await withController(async ({ controller }) => {
|
await withController(async ({ controller }) => {
|
||||||
|
setupMockRpcBlockResponses();
|
||||||
await controller.initializeProvider();
|
await controller.initializeProvider();
|
||||||
const supportsEIP1559 = await controller.getEIP1559Compatibility();
|
const supportsEIP1559 = await controller.getEIP1559Compatibility();
|
||||||
expect(supportsEIP1559).toStrictEqual(true);
|
expect(supportsEIP1559).toStrictEqual(true);
|
||||||
@ -196,6 +229,7 @@ describe('NetworkController', () => {
|
|||||||
|
|
||||||
it('should store EIP1559 support in state to reduce calls to _getLatestBlock', async () => {
|
it('should store EIP1559 support in state to reduce calls to _getLatestBlock', async () => {
|
||||||
await withController(async ({ controller }) => {
|
await withController(async ({ controller }) => {
|
||||||
|
setupMockRpcBlockResponses();
|
||||||
await controller.initializeProvider();
|
await controller.initializeProvider();
|
||||||
await controller.getEIP1559Compatibility();
|
await controller.getEIP1559Compatibility();
|
||||||
const supportsEIP1559 = await controller.getEIP1559Compatibility();
|
const supportsEIP1559 = await controller.getEIP1559Compatibility();
|
||||||
@ -205,12 +239,20 @@ describe('NetworkController', () => {
|
|||||||
|
|
||||||
it('should clear stored EIP1559 support when changing networks', async () => {
|
it('should clear stored EIP1559 support when changing networks', async () => {
|
||||||
await withController(async ({ controller }) => {
|
await withController(async ({ controller }) => {
|
||||||
|
setupMockRpcBlockResponses({ networkType: NETWORK_TYPES.RPC });
|
||||||
|
setupMockRpcBlockResponses({
|
||||||
|
networkType: NETWORK_TYPES.MAINNET,
|
||||||
|
block: PRE_1559_BLOCK,
|
||||||
|
requests: {
|
||||||
|
eth_blockNumber: 2,
|
||||||
|
eth_getBlockByNumber: 1,
|
||||||
|
},
|
||||||
|
});
|
||||||
await controller.initializeProvider();
|
await controller.initializeProvider();
|
||||||
await controller.getEIP1559Compatibility();
|
await controller.getEIP1559Compatibility();
|
||||||
expect(controller.networkDetails.getState().EIPS[1559]).toStrictEqual(
|
expect(controller.networkDetails.getState().EIPS[1559]).toStrictEqual(
|
||||||
true,
|
true,
|
||||||
);
|
);
|
||||||
latestBlock = PRE_1559_BLOCK;
|
|
||||||
await new Promise((resolve) => {
|
await new Promise((resolve) => {
|
||||||
controller.on(NETWORK_EVENTS.NETWORK_DID_CHANGE, () => {
|
controller.on(NETWORK_EVENTS.NETWORK_DID_CHANGE, () => {
|
||||||
resolve();
|
resolve();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user