From f4a37ca9ac7ea944c0a11454834d226428fc6474 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Guti=C3=A9rrez?= Date: Mon, 13 May 2019 12:51:44 +0200 Subject: [PATCH] Fix error when method parameter is null. --- .../src/proxies/MethodsProxy.js | 2 +- .../tests/src/proxies/MethodsProxyTest.js | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/packages/web3-eth-contract/src/proxies/MethodsProxy.js b/packages/web3-eth-contract/src/proxies/MethodsProxy.js index ecc9d2b8a17..c4c41b1ba9e 100644 --- a/packages/web3-eth-contract/src/proxies/MethodsProxy.js +++ b/packages/web3-eth-contract/src/proxies/MethodsProxy.js @@ -191,7 +191,7 @@ export default class MethodsProxy { method.setArguments(methodArguments); // If no parameters are given for the eth_call or eth_send* methods then it will set a empty options object. - if (typeof method.parameters[0] === 'undefined') { + if (!method.parameters[0]) { method.parameters[0] = {}; } diff --git a/packages/web3-eth-contract/tests/src/proxies/MethodsProxyTest.js b/packages/web3-eth-contract/tests/src/proxies/MethodsProxyTest.js index a2f07995295..ee9084943d4 100644 --- a/packages/web3-eth-contract/tests/src/proxies/MethodsProxyTest.js +++ b/packages/web3-eth-contract/tests/src/proxies/MethodsProxyTest.js @@ -115,6 +115,47 @@ describe('MethodsProxyTest', () => { expect(methodOptionsValidatorMock.validate).toHaveBeenCalledWith(abiItemModelMock, callMethodMock); }); + it('calls a call method over the proxy should allow null parameters', async () => { + abiModelMock.hasMethod.mockReturnValueOnce(true); + + abiModelMock.getMethod.mockReturnValueOnce(abiItemModelMock); + + const callMethodMock = {}; + callMethodMock.parameters = [null]; + callMethodMock.setArguments = jest.fn(); + callMethodMock.execute = jest.fn(() => { + return Promise.resolve(true); + }); + + methodFactoryMock.createMethodByRequestType.mockReturnValueOnce(callMethodMock); + + methodEncoderMock.encode.mockReturnValueOnce('0x0'); + + methodOptionsMapperMock.map.mockReturnValueOnce({options: true}); + + await expect(methodsProxy.myMethod(true).call({options: false})).resolves.toEqual(true); + + expect(abiModelMock.hasMethod).toHaveBeenCalledWith('myMethod'); + + expect(abiModelMock.getMethod).toHaveBeenCalledWith('myMethod'); + + expect(abiItemModelMock.contractMethodParameters[0]).toEqual(true); + + expect(methodFactoryMock.createMethodByRequestType).toHaveBeenCalledWith( + abiItemModelMock, + contractMock, + 'call' + ); + + expect(callMethodMock.parameters[0]).toEqual({options: true}); + + expect(methodEncoderMock.encode).toHaveBeenCalledWith(abiItemModelMock, contractMock.data); + + expect(methodOptionsMapperMock.map).toHaveBeenCalledWith(contractMock, {data: '0x0'}); + + expect(methodOptionsValidatorMock.validate).toHaveBeenCalledWith(abiItemModelMock, callMethodMock); + }); + it('calls the constructor method over the proxy', async () => { abiModelMock.hasMethod.mockReturnValueOnce(true);