mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-29 07:16:36 +01:00
3e98758719
The network controller module has been renamed from `network.js` to `network-controller.js`. All of our newer controllers have "controller" in the module names, so this aligns better with that convention. It also brings the test module name into alignment (it's already called "network-controller.test.js").
147 lines
5.2 KiB
JavaScript
147 lines
5.2 KiB
JavaScript
import sinon from 'sinon';
|
|
import { getNetworkDisplayName } from './util';
|
|
import NetworkController, { NETWORK_EVENTS } from './network-controller';
|
|
|
|
describe('NetworkController', () => {
|
|
describe('controller', () => {
|
|
let networkController;
|
|
let getLatestBlockStub;
|
|
let setProviderTypeAndWait;
|
|
const noop = () => undefined;
|
|
const networkControllerProviderConfig = {
|
|
getAccounts: noop,
|
|
};
|
|
|
|
beforeEach(() => {
|
|
networkController = new NetworkController({ infuraProjectId: 'foo' });
|
|
getLatestBlockStub = sinon
|
|
.stub(networkController, '_getLatestBlock')
|
|
.callsFake(() => Promise.resolve({}));
|
|
setProviderTypeAndWait = () =>
|
|
new Promise((resolve) => {
|
|
networkController.on(NETWORK_EVENTS.NETWORK_DID_CHANGE, () => {
|
|
resolve();
|
|
});
|
|
networkController.setProviderType('mainnet');
|
|
});
|
|
});
|
|
|
|
afterEach(() => {
|
|
getLatestBlockStub.reset();
|
|
});
|
|
|
|
describe('#provider', () => {
|
|
it('provider should be updatable without reassignment', () => {
|
|
networkController.initializeProvider(networkControllerProviderConfig);
|
|
const providerProxy =
|
|
networkController.getProviderAndBlockTracker().provider;
|
|
expect(providerProxy.test).toBeUndefined();
|
|
providerProxy.setTarget({ test: true });
|
|
expect(providerProxy.test).toStrictEqual(true);
|
|
});
|
|
});
|
|
|
|
describe('#getNetworkState', () => {
|
|
it('should return "loading" when new', () => {
|
|
const networkState = networkController.getNetworkState();
|
|
expect(networkState).toStrictEqual('loading');
|
|
});
|
|
});
|
|
|
|
describe('#setProviderType', () => {
|
|
it('should update provider.type', () => {
|
|
networkController.initializeProvider(networkControllerProviderConfig);
|
|
networkController.setProviderType('mainnet');
|
|
const { type } = networkController.getProviderConfig();
|
|
expect(type).toStrictEqual('mainnet');
|
|
});
|
|
|
|
it('should set the network to loading', () => {
|
|
networkController.initializeProvider(networkControllerProviderConfig);
|
|
|
|
const spy = sinon.spy(networkController, '_setNetworkState');
|
|
networkController.setProviderType('mainnet');
|
|
|
|
expect(spy.callCount).toStrictEqual(1);
|
|
expect(spy.calledOnceWithExactly('loading')).toStrictEqual(true);
|
|
});
|
|
});
|
|
|
|
describe('#getEIP1559Compatibility', () => {
|
|
it('should return false when baseFeePerGas is not in the block header', async () => {
|
|
networkController.initializeProvider(networkControllerProviderConfig);
|
|
const supportsEIP1559 =
|
|
await networkController.getEIP1559Compatibility();
|
|
expect(supportsEIP1559).toStrictEqual(false);
|
|
});
|
|
|
|
it('should return true when baseFeePerGas is in block header', async () => {
|
|
networkController.initializeProvider(networkControllerProviderConfig);
|
|
getLatestBlockStub.callsFake(() =>
|
|
Promise.resolve({ baseFeePerGas: '0xa ' }),
|
|
);
|
|
const supportsEIP1559 =
|
|
await networkController.getEIP1559Compatibility();
|
|
expect(supportsEIP1559).toStrictEqual(true);
|
|
});
|
|
|
|
it('should store EIP1559 support in state to reduce calls to _getLatestBlock', async () => {
|
|
networkController.initializeProvider(networkControllerProviderConfig);
|
|
getLatestBlockStub.callsFake(() =>
|
|
Promise.resolve({ baseFeePerGas: '0xa ' }),
|
|
);
|
|
await networkController.getEIP1559Compatibility();
|
|
const supportsEIP1559 =
|
|
await networkController.getEIP1559Compatibility();
|
|
expect(getLatestBlockStub.calledOnce).toStrictEqual(true);
|
|
expect(supportsEIP1559).toStrictEqual(true);
|
|
});
|
|
|
|
it('should clear stored EIP1559 support when changing networks', async () => {
|
|
networkController.initializeProvider(networkControllerProviderConfig);
|
|
networkController.consoleThis = true;
|
|
getLatestBlockStub.callsFake(() =>
|
|
Promise.resolve({ baseFeePerGas: '0xa ' }),
|
|
);
|
|
await networkController.getEIP1559Compatibility();
|
|
expect(
|
|
networkController.networkDetails.getState().EIPS[1559],
|
|
).toStrictEqual(true);
|
|
getLatestBlockStub.callsFake(() => Promise.resolve({}));
|
|
await setProviderTypeAndWait('mainnet');
|
|
expect(
|
|
networkController.networkDetails.getState().EIPS[1559],
|
|
).toBeUndefined();
|
|
await networkController.getEIP1559Compatibility();
|
|
expect(
|
|
networkController.networkDetails.getState().EIPS[1559],
|
|
).toStrictEqual(false);
|
|
expect(getLatestBlockStub.calledTwice).toStrictEqual(true);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('utils', () => {
|
|
it('getNetworkDisplayName should return the correct network name', () => {
|
|
const tests = [
|
|
{
|
|
input: 'mainnet',
|
|
expected: 'Ethereum Mainnet',
|
|
},
|
|
{
|
|
input: 'goerli',
|
|
expected: 'Goerli',
|
|
},
|
|
{
|
|
input: 'sepolia',
|
|
expected: 'Sepolia',
|
|
},
|
|
];
|
|
|
|
tests.forEach(({ input, expected }) =>
|
|
expect(getNetworkDisplayName(input)).toStrictEqual(expected),
|
|
);
|
|
});
|
|
});
|
|
});
|