From 9d42b823daae5d0d567010ef5d8132d41ab75c89 Mon Sep 17 00:00:00 2001 From: Samuel Furter Date: Tue, 26 Feb 2019 21:36:42 +0100 Subject: [PATCH 1/6] POC CustomProvider --- .../src/providers/CustomProvider.js | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 packages/web3-providers/src/providers/CustomProvider.js diff --git a/packages/web3-providers/src/providers/CustomProvider.js b/packages/web3-providers/src/providers/CustomProvider.js new file mode 100644 index 00000000000..81b7bf02546 --- /dev/null +++ b/packages/web3-providers/src/providers/CustomProvider.js @@ -0,0 +1,111 @@ +/* + This file is part of web3.js. + web3.js is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + web3.js is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + You should have received a copy of the GNU Lesser General Public License + along with web3.js. If not, see . +*/ +import JsonRpcMapper from '../mappers/JsonRpcMapper'; +import JsonRpcResponseValidator from '../validators/JsonRpcResponseValidator'; + +/** + * @file CustomProvider.js + * @author Samuel Furter + * @date 2019 + */ + +export default class CustomProvider { + + constructor(connection) { + this.host = 'CustomProvider'; + this.connection = connection; + } + + /** + * Added this method to have a better error message if someone is trying to create a subscription with this provider. + */ + subscribe() { + throw new Error('Subscriptions are not supported with the HttpProvider.'); + } + + /** + * Added this method to have a better error message if someone is trying to unsubscribe with this provider. + */ + unsubscribe() { + throw new Error('Subscriptions are not supported with the HttpProvider.'); + } + + /** + * This method has to exists to have the same interface as the socket providers. + * + * @method disconnect + * + * @returns {Boolean} + */ + disconnect() { + return true; + } + + /** + * Creates the JSON-RPC payload and sends it to the node. + * + * @method send + * + * @param {String} method + * @param {Array} parameters + * + * @returns {Promise} + */ + send(method, parameters) { + return this.sendPayload(JsonRpcMapper.toPayload(method, parameters)).then((response) => { + const validationResult = JsonRpcResponseValidator.validate(response); + + if (validationResult instanceof Error) { + throw validationResult; + } + + return response.result; + }); + } + + /** + * + * @param payload + * @returns {Promise} + */ + sendPayload(payload) { + return new Promise((resolve, reject) => { + if (this.connection.sendAsync) { + this.connection.sendAsync(payload, (error, response) => { + if (!error) { + resolve(response); + } + + reject(error); + }); + + return; + } + + if (this.connection.send) { + this.connection.send(payload, (error, response) => { + if (!error) { + resolve(response); + } + + reject(error); + }); + + return; + } + + reject(new Error('Invalid provider injected!')); + }); + } +} From 242133c33b1e473846add2e71c397c6a9849cfff Mon Sep 17 00:00:00 2001 From: Samuel Furter Date: Wed, 27 Feb 2019 15:31:14 +0100 Subject: [PATCH 2/6] CustomProvider, ProviderResolver and ProvidersModuleFactory updated --- .../src/factories/ProvidersModuleFactory.js | 13 +++++ .../src/providers/CustomProvider.js | 47 ++++++++++++------- .../src/resolvers/ProviderResolver.js | 2 +- 3 files changed, 44 insertions(+), 18 deletions(-) diff --git a/packages/web3-providers/src/factories/ProvidersModuleFactory.js b/packages/web3-providers/src/factories/ProvidersModuleFactory.js index 4bebec42b64..fdaa2cbd1bd 100644 --- a/packages/web3-providers/src/factories/ProvidersModuleFactory.js +++ b/packages/web3-providers/src/factories/ProvidersModuleFactory.js @@ -203,4 +203,17 @@ export default class ProvidersModuleFactory { createMistEthereumProvider(mistEthereumProvider) { return new MistEthereumProvider(mistEthereumProvider); } + + /** + * Returns an CustomProvider object + * + * @method createCustomProvider + * + * @param {Object} connection + * + * @returns {CustomProvider} + */ + createCustomProvider(connection) { + return new CustomProvider(connection); + } } diff --git a/packages/web3-providers/src/providers/CustomProvider.js b/packages/web3-providers/src/providers/CustomProvider.js index 81b7bf02546..faa35f5998e 100644 --- a/packages/web3-providers/src/providers/CustomProvider.js +++ b/packages/web3-providers/src/providers/CustomProvider.js @@ -11,17 +11,20 @@ You should have received a copy of the GNU Lesser General Public License along with web3.js. If not, see . */ -import JsonRpcMapper from '../mappers/JsonRpcMapper'; -import JsonRpcResponseValidator from '../validators/JsonRpcResponseValidator'; - /** * @file CustomProvider.js * @author Samuel Furter * @date 2019 */ +import JsonRpcMapper from '../mappers/JsonRpcMapper'; +import JsonRpcResponseValidator from '../validators/JsonRpcResponseValidator'; export default class CustomProvider { - + /** + * @param {Object} connection + * + * @constructor + */ constructor(connection) { this.host = 'CustomProvider'; this.connection = connection; @@ -31,25 +34,14 @@ export default class CustomProvider { * Added this method to have a better error message if someone is trying to create a subscription with this provider. */ subscribe() { - throw new Error('Subscriptions are not supported with the HttpProvider.'); + throw new Error('Subscriptions are not supported with the CustomProvider.'); } /** * Added this method to have a better error message if someone is trying to unsubscribe with this provider. */ unsubscribe() { - throw new Error('Subscriptions are not supported with the HttpProvider.'); - } - - /** - * This method has to exists to have the same interface as the socket providers. - * - * @method disconnect - * - * @returns {Boolean} - */ - disconnect() { - return true; + throw new Error('Subscriptions are not supported with the CustomProvider.'); } /** @@ -74,6 +66,27 @@ export default class CustomProvider { }); } + /** + * Creates the JSON-RPC batch payload and sends it to the node. + * + * @method sendBatch + * + * @param {AbstractMethod[]} methods + * @param {AbstractWeb3Module} moduleInstance + * + * @returns Promise + */ + sendBatch(methods, moduleInstance) { + let payload = []; + + methods.forEach((method) => { + method.beforeExecution(moduleInstance); + payload.push(JsonRpcMapper.toPayload(method.rpcMethod, method.parameters)); + }); + + return this.sendPayload(payload); + } + /** * * @param payload diff --git a/packages/web3-providers/src/resolvers/ProviderResolver.js b/packages/web3-providers/src/resolvers/ProviderResolver.js index e3c59523543..c73a000097b 100644 --- a/packages/web3-providers/src/resolvers/ProviderResolver.js +++ b/packages/web3-providers/src/resolvers/ProviderResolver.js @@ -78,6 +78,6 @@ export default class ProviderResolver { return this.providersModuleFactory.createEthereumProvider(provider); } - return provider; + return this.providersModuleFactory.createCustomProvider(provider); } } From b78e0a3bffa5851ac68bc227711ebfcc51ed09f1 Mon Sep 17 00:00:00 2001 From: Samuel Furter Date: Wed, 27 Feb 2019 15:39:13 +0100 Subject: [PATCH 3/6] sendPayload method and code style improved in CustomProvider --- .../src/providers/CustomProvider.js | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/packages/web3-providers/src/providers/CustomProvider.js b/packages/web3-providers/src/providers/CustomProvider.js index faa35f5998e..5c5aaeafb79 100644 --- a/packages/web3-providers/src/providers/CustomProvider.js +++ b/packages/web3-providers/src/providers/CustomProvider.js @@ -28,6 +28,20 @@ export default class CustomProvider { constructor(connection) { this.host = 'CustomProvider'; this.connection = connection; + this.checkConnectionMethods(); + } + + /** + * Checks if the given custom provider does have the required methods + * + * @method checkConnectionMethods + */ + checkConnectionMethods() { + if (this.connection.send || this.connection.sendAsync) { + return true; + } + + throw new Error('Invalid provider injected!'); } /** @@ -88,9 +102,13 @@ export default class CustomProvider { } /** + * Sends the JSON-RPC payload to the node. + * + * @method sendPayload * - * @param payload - * @returns {Promise} + * @param {Object} payload + * + * @returns {Promise} */ sendPayload(payload) { return new Promise((resolve, reject) => { @@ -106,19 +124,14 @@ export default class CustomProvider { return; } - if (this.connection.send) { - this.connection.send(payload, (error, response) => { - if (!error) { - resolve(response); - } - - reject(error); - }); + this.connection.send(payload, (error, response) => { + if (!error) { + resolve(response); + } - return; - } + reject(error); + }); - reject(new Error('Invalid provider injected!')); }); } } From b920dea541f0fb54765f5aac4ea882cb93f1637a Mon Sep 17 00:00:00 2001 From: Samuel Furter Date: Wed, 27 Feb 2019 16:06:07 +0100 Subject: [PATCH 4/6] CustomProviderTest created --- .../src/providers/CustomProvider.js | 2 + .../tests/src/providers/CustomProviderTest.js | 141 ++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 packages/web3-providers/tests/src/providers/CustomProviderTest.js diff --git a/packages/web3-providers/src/providers/CustomProvider.js b/packages/web3-providers/src/providers/CustomProvider.js index 5c5aaeafb79..fda005c2d6d 100644 --- a/packages/web3-providers/src/providers/CustomProvider.js +++ b/packages/web3-providers/src/providers/CustomProvider.js @@ -35,6 +35,8 @@ export default class CustomProvider { * Checks if the given custom provider does have the required methods * * @method checkConnectionMethods + * + * @returns {Boolean} */ checkConnectionMethods() { if (this.connection.send || this.connection.sendAsync) { diff --git a/packages/web3-providers/tests/src/providers/CustomProviderTest.js b/packages/web3-providers/tests/src/providers/CustomProviderTest.js new file mode 100644 index 00000000000..be8dc490b97 --- /dev/null +++ b/packages/web3-providers/tests/src/providers/CustomProviderTest.js @@ -0,0 +1,141 @@ +import ProvidersModuleFactory from '../../../src/factories/ProvidersModuleFactory'; +import JsonRpcMapper from '../../../src/mappers/JsonRpcMapper'; +import JsonRpcResponseValidator from '../../../src/validators/JsonRpcResponseValidator'; +import AbstractWeb3Module from '../../__mocks__/AbstractWeb3Module'; +import AbstractMethod from '../../__mocks__/AbstractMethod'; +import CustomProvider from '../../../src/providers/CustomProvider'; + +// Mocks +jest.mock('../../../src/factories/ProvidersModuleFactory'); + +/** + * CustomProvider test + */ +describe('CustomProviderTest', () => { + let customProvider, providersModuleFactoryMock, connectionMock; + + beforeEach(() => { + new ProvidersModuleFactory(); + providersModuleFactoryMock = ProvidersModuleFactory.mock.instances[0]; + + connectionMock = {send: jest.fn(), sendAsync: jest.fn()}; + + customProvider = new CustomProvider(connectionMock); + }); + + it('constructor check', () => { + expect(customProvider.connection).toEqual(connectionMock); + }); + + it('calls subscribe and throws error', () => { + expect(() => { + customProvider.subscribe(); + }).toThrow('Subscriptions are not supported with the CustomProvider.'); + }); + + it('calls unsubscribe and throws error', () => { + expect(() => { + customProvider.unsubscribe(); + }).toThrow('Subscriptions are not supported with the CustomProvider.'); + }); + + it('calls send and returns with a resolved promise', async () => { + JsonRpcMapper.toPayload = jest.fn(); + JsonRpcMapper.toPayload.mockReturnValueOnce({id: '0x0'}); + + JsonRpcResponseValidator.validate = jest.fn(); + JsonRpcResponseValidator.validate.mockReturnValueOnce(true); + + connectionMock.sendAsync = jest.fn((payload, callback) => { + expect(payload).toEqual({id: '0x0'}); + + callback(false, {result: true}); + }); + + const response = await customProvider.send('rpc_method', []); + + expect(response).toEqual(true); + + expect(JsonRpcMapper.toPayload).toHaveBeenCalledWith('rpc_method', []); + + expect(JsonRpcResponseValidator.validate).toHaveBeenCalledWith({result: true}); + + expect(connectionMock.sendAsync).toHaveBeenCalled(); + }); + + it('calls send without the sendAsync method and returns with a resolved promise', async () => { + JsonRpcMapper.toPayload = jest.fn(); + JsonRpcMapper.toPayload.mockReturnValueOnce({id: '0x0'}); + + JsonRpcResponseValidator.validate = jest.fn(); + JsonRpcResponseValidator.validate.mockReturnValueOnce(true); + + connectionMock.sendAsync = false; + connectionMock.send = jest.fn((payload, callback) => { + expect(payload).toEqual({id: '0x0'}); + + callback(false, {result: true}); + }); + + const response = await customProvider.send('rpc_method', []); + + expect(response).toEqual(true); + + expect(JsonRpcMapper.toPayload).toHaveBeenCalledWith('rpc_method', []); + + expect(JsonRpcResponseValidator.validate).toHaveBeenCalledWith({result: true}); + + expect(connectionMock.send).toHaveBeenCalled(); + }); + + it('calls send and returns with a rejected promise because of an invalid JSON-RPC response', async () => { + JsonRpcMapper.toPayload = jest.fn(); + JsonRpcMapper.toPayload.mockReturnValueOnce({id: '0x0'}); + + JsonRpcResponseValidator.validate = jest.fn(); + JsonRpcResponseValidator.validate.mockReturnValueOnce(new Error('invalid')); + + connectionMock.sendAsync = jest.fn((payload, callback) => { + expect(payload).toEqual({id: '0x0'}); + + callback(false, true); + }); + + await expect(customProvider.send('rpc_method', [])).rejects.toThrow('invalid'); + + expect(JsonRpcResponseValidator.validate).toHaveBeenCalledWith(true); + + expect(JsonRpcMapper.toPayload).toHaveBeenCalledWith('rpc_method', []); + + expect(connectionMock.sendAsync).toHaveBeenCalled(); + }); + + it('calls sendBatch and returns with a resolved promise', async () => { + const abstractMethodMock = new AbstractMethod(); + + const moduleInstanceMock = new AbstractWeb3Module(); + + abstractMethodMock.beforeExecution = jest.fn(); + abstractMethodMock.rpcMethod = 'rpc_method'; + abstractMethodMock.parameters = []; + + JsonRpcMapper.toPayload = jest.fn(); + JsonRpcMapper.toPayload.mockReturnValueOnce({id: '0x0'}); + + connectionMock.sendAsync = jest.fn((payload, callback) => { + expect(payload).toEqual([{id: '0x0'}]); + + callback(false, true); + }); + + const response = await customProvider.sendBatch([abstractMethodMock], moduleInstanceMock); + + expect(response).toEqual(true); + + expect(JsonRpcMapper.toPayload).toHaveBeenCalledWith('rpc_method', []); + + expect(connectionMock.sendAsync).toHaveBeenCalled(); + + expect(abstractMethodMock.beforeExecution).toHaveBeenCalled(); + }); +}); From 96eb82808e20952434edbe03171b26be70e8d229 Mon Sep 17 00:00:00 2001 From: Samuel Furter Date: Wed, 27 Feb 2019 16:21:39 +0100 Subject: [PATCH 5/6] ProviderResolver and ProviderResolverTest updated --- .../src/factories/ProvidersModuleFactory.js | 1 + .../src/resolvers/ProviderResolver.js | 15 ++++++---- .../src/resolvers/ProviderResolverTest.js | 30 +++++++++++++------ 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/packages/web3-providers/src/factories/ProvidersModuleFactory.js b/packages/web3-providers/src/factories/ProvidersModuleFactory.js index fdaa2cbd1bd..7be9334b95d 100644 --- a/packages/web3-providers/src/factories/ProvidersModuleFactory.js +++ b/packages/web3-providers/src/factories/ProvidersModuleFactory.js @@ -32,6 +32,7 @@ import BatchRequest from '../batch-request/BatchRequest'; import EthereumProvider from '../providers/EthereumProvider'; import MetamaskProvider from '../providers/MetamaskProvider'; import MistEthereumProvider from '../providers/MistEthereumProvider'; +import CustomProvider from '../providers/CustomProvider'; export default class ProvidersModuleFactory { /** diff --git a/packages/web3-providers/src/resolvers/ProviderResolver.js b/packages/web3-providers/src/resolvers/ProviderResolver.js index c73a000097b..7c5759ac477 100644 --- a/packages/web3-providers/src/resolvers/ProviderResolver.js +++ b/packages/web3-providers/src/resolvers/ProviderResolver.js @@ -70,14 +70,19 @@ export default class ProviderResolver { return this.providersModuleFactory.createMistEthereumProvider(provider); } - if (provider.constructor.name === 'MetamaskInpageProvider') { - return this.providersModuleFactory.createMetamaskProvider(provider); - } - if (provider.isEIP1193) { return this.providersModuleFactory.createEthereumProvider(provider); } - return this.providersModuleFactory.createCustomProvider(provider); + switch(provider.constructor.name) { + case 'MetamaskInpageProvider': + return this.providersModuleFactory.createMetamaskProvider(provider); + case 'HttpProvider': + case 'IpcProvider': + case 'WebsocketProvider': + return provider; + default: + return this.providersModuleFactory.createCustomProvider(provider); + } } } diff --git a/packages/web3-providers/tests/src/resolvers/ProviderResolverTest.js b/packages/web3-providers/tests/src/resolvers/ProviderResolverTest.js index 2feadfd0430..7ec68a75f03 100644 --- a/packages/web3-providers/tests/src/resolvers/ProviderResolverTest.js +++ b/packages/web3-providers/tests/src/resolvers/ProviderResolverTest.js @@ -5,6 +5,7 @@ import WebsocketProvider from '../../../src/providers/WebsocketProvider'; import IpcProvider from '../../../src/providers/IpcProvider'; import EthereumProvider from '../../../src/providers/EthereumProvider'; import MetamaskProvider from '../../../src/providers/MetamaskProvider'; +import CustomProvider from '../../../src/providers/CustomProvider'; // Mocks jest.mock('../../../src/factories/ProvidersModuleFactory'); @@ -13,25 +14,26 @@ jest.mock('../../../src/providers/WebsocketProvider'); jest.mock('../../../src/providers/IpcProvider'); jest.mock('../../../src/providers/EthereumProvider'); jest.mock('../../../src/providers/MetamaskProvider'); +jest.mock('../../../src/providers/CustomProvider'); /** * ProviderResolver test */ describe('ProviderResolverTest', () => { - let providerResolver, providersModuleFactory, providersModuleFactoryMock; + let providerResolver, providersModuleFactoryMock; beforeEach(() => { - providersModuleFactory = new ProvidersModuleFactory(); + new ProvidersModuleFactory(); providersModuleFactoryMock = ProvidersModuleFactory.mock.instances[0]; - providerResolver = new ProviderResolver(providersModuleFactory); + providerResolver = new ProviderResolver(providersModuleFactoryMock); }); it('calls resolve with HTTP url', () => { - new HttpProvider('host', {}, providersModuleFactoryMock); + new HttpProvider(); const httpProviderMock = HttpProvider.mock.instances[0]; - providersModuleFactory.createHttpProvider.mockReturnValueOnce(httpProviderMock); + providersModuleFactoryMock.createHttpProvider.mockReturnValueOnce(httpProviderMock); expect(providerResolver.resolve('http://localhost:8545')).toBeInstanceOf(HttpProvider); @@ -42,7 +44,7 @@ describe('ProviderResolverTest', () => { new WebsocketProvider({}, 1); const websocketProviderMock = WebsocketProvider.mock.instances[0]; - providersModuleFactory.createWebsocketProvider.mockReturnValueOnce(websocketProviderMock); + providersModuleFactoryMock.createWebsocketProvider.mockReturnValueOnce(websocketProviderMock); expect(providerResolver.resolve('ws://127.0.0.1:8545')).toBeInstanceOf(WebsocketProvider); @@ -55,7 +57,7 @@ describe('ProviderResolverTest', () => { const net = {connect: () => {}}; - providersModuleFactory.createIpcProvider.mockReturnValueOnce(ipcProviderMock); + providersModuleFactoryMock.createIpcProvider.mockReturnValueOnce(ipcProviderMock); expect(providerResolver.resolve('/path/to/the/socket', net)).toBeInstanceOf(IpcProvider); @@ -63,7 +65,7 @@ describe('ProviderResolverTest', () => { }); it('calls resolve with the HttpProvider', () => { - new HttpProvider('host', {}, providersModuleFactoryMock); + new HttpProvider(); const httpProviderMock = HttpProvider.mock.instances[0]; expect(providerResolver.resolve(httpProviderMock)).toBeInstanceOf(HttpProvider); @@ -98,9 +100,19 @@ describe('ProviderResolverTest', () => { it('calls resolve with the MetamaskProvider', () => { new MetamaskProvider(); const metamaskProviderMock = MetamaskProvider.mock.instances[0]; + const metamaskInpageProvider = {constructor: {name: 'MetamaskInpageProvider'}}; providersModuleFactoryMock.createMetamaskProvider.mockReturnValueOnce(metamaskProviderMock); - expect(providerResolver.resolve(metamaskProviderMock)).toEqual(metamaskProviderMock); + expect(providerResolver.resolve(metamaskInpageProvider)).toEqual(metamaskProviderMock); + }); + + it('calls resolve with a custom provider', () => { + new CustomProvider(); + const customProviderMock = CustomProvider.mock.instances[0]; + + providersModuleFactoryMock.createCustomProvider.mockReturnValueOnce(customProviderMock); + + expect(providerResolver.resolve({})).toEqual(customProviderMock); }); }); From a09aaa886b59dccc6581b7fab2f905bba1d6b50f Mon Sep 17 00:00:00 2001 From: Samuel Furter Date: Wed, 27 Feb 2019 16:29:57 +0100 Subject: [PATCH 6/6] code style improved and expection added --- .../tests/src/methods/CallContractMethodTest.js | 11 +++++++---- .../web3-providers/src/providers/CustomProvider.js | 1 - .../web3-providers/src/resolvers/ProviderResolver.js | 2 +- .../tests/src/providers/CustomProviderTest.js | 6 +----- .../tests/src/resolvers/ProviderResolverTest.js | 4 ++++ 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/web3-eth-contract/tests/src/methods/CallContractMethodTest.js b/packages/web3-eth-contract/tests/src/methods/CallContractMethodTest.js index 11a163c2411..84f5a560f27 100644 --- a/packages/web3-eth-contract/tests/src/methods/CallContractMethodTest.js +++ b/packages/web3-eth-contract/tests/src/methods/CallContractMethodTest.js @@ -43,14 +43,17 @@ describe('CallContractMethodTest', () => { it('calls afterExecution and returns the result array', () => { abiCoderMock.decodeParameters = jest.fn(); - + abiCoderMock.decodeParameters.mockReturnValueOnce(['0x0', '0x0']); - abiItemModelMock.getOutputs.mockReturnValueOnce([{name: "", type: 'bytes'}, {name: "", type: 'bytes'}]); + abiItemModelMock.getOutputs.mockReturnValueOnce([{name: '', type: 'bytes'}, {name: '', type: 'bytes'}]); expect(callContractMethod.afterExecution('0x0')).toEqual(['0x0', '0x0']); - expect(abiCoderMock.decodeParameters).toHaveBeenCalledWith([{name: "", type: 'bytes'}, {name: "", type: 'bytes'}], '0'); + expect(abiCoderMock.decodeParameters).toHaveBeenCalledWith( + [{name: '', type: 'bytes'}, {name: '', type: 'bytes'}], + '0' + ); }); it('calls afterExecution and returns the first array item as result', () => { @@ -58,7 +61,7 @@ describe('CallContractMethodTest', () => { abiCoderMock.decodeParameter.mockReturnValueOnce('0x0'); - abiItemModelMock.getOutputs.mockReturnValueOnce([{name: "result", type: 'bytes'}]); + abiItemModelMock.getOutputs.mockReturnValueOnce([{name: 'result', type: 'bytes'}]); expect(callContractMethod.afterExecution('0x0')).toEqual('0x0'); diff --git a/packages/web3-providers/src/providers/CustomProvider.js b/packages/web3-providers/src/providers/CustomProvider.js index fda005c2d6d..47c7502c237 100644 --- a/packages/web3-providers/src/providers/CustomProvider.js +++ b/packages/web3-providers/src/providers/CustomProvider.js @@ -133,7 +133,6 @@ export default class CustomProvider { reject(error); }); - }); } } diff --git a/packages/web3-providers/src/resolvers/ProviderResolver.js b/packages/web3-providers/src/resolvers/ProviderResolver.js index 7c5759ac477..d6d8ec52f08 100644 --- a/packages/web3-providers/src/resolvers/ProviderResolver.js +++ b/packages/web3-providers/src/resolvers/ProviderResolver.js @@ -74,7 +74,7 @@ export default class ProviderResolver { return this.providersModuleFactory.createEthereumProvider(provider); } - switch(provider.constructor.name) { + switch (provider.constructor.name) { case 'MetamaskInpageProvider': return this.providersModuleFactory.createMetamaskProvider(provider); case 'HttpProvider': diff --git a/packages/web3-providers/tests/src/providers/CustomProviderTest.js b/packages/web3-providers/tests/src/providers/CustomProviderTest.js index be8dc490b97..53c6c5a0e38 100644 --- a/packages/web3-providers/tests/src/providers/CustomProviderTest.js +++ b/packages/web3-providers/tests/src/providers/CustomProviderTest.js @@ -1,4 +1,3 @@ -import ProvidersModuleFactory from '../../../src/factories/ProvidersModuleFactory'; import JsonRpcMapper from '../../../src/mappers/JsonRpcMapper'; import JsonRpcResponseValidator from '../../../src/validators/JsonRpcResponseValidator'; import AbstractWeb3Module from '../../__mocks__/AbstractWeb3Module'; @@ -12,12 +11,9 @@ jest.mock('../../../src/factories/ProvidersModuleFactory'); * CustomProvider test */ describe('CustomProviderTest', () => { - let customProvider, providersModuleFactoryMock, connectionMock; + let customProvider, connectionMock; beforeEach(() => { - new ProvidersModuleFactory(); - providersModuleFactoryMock = ProvidersModuleFactory.mock.instances[0]; - connectionMock = {send: jest.fn(), sendAsync: jest.fn()}; customProvider = new CustomProvider(connectionMock); diff --git a/packages/web3-providers/tests/src/resolvers/ProviderResolverTest.js b/packages/web3-providers/tests/src/resolvers/ProviderResolverTest.js index 7ec68a75f03..9fa414ffc34 100644 --- a/packages/web3-providers/tests/src/resolvers/ProviderResolverTest.js +++ b/packages/web3-providers/tests/src/resolvers/ProviderResolverTest.js @@ -105,6 +105,8 @@ describe('ProviderResolverTest', () => { providersModuleFactoryMock.createMetamaskProvider.mockReturnValueOnce(metamaskProviderMock); expect(providerResolver.resolve(metamaskInpageProvider)).toEqual(metamaskProviderMock); + + expect(providersModuleFactoryMock.createMetamaskProvider).toHaveBeenCalledWith(metamaskInpageProvider); }); it('calls resolve with a custom provider', () => { @@ -114,5 +116,7 @@ describe('ProviderResolverTest', () => { providersModuleFactoryMock.createCustomProvider.mockReturnValueOnce(customProviderMock); expect(providerResolver.resolve({})).toEqual(customProviderMock); + + expect(providersModuleFactoryMock.createCustomProvider).toHaveBeenCalledWith({}); }); });