diff --git a/tests/providers/test_provider.py b/tests/providers/test_provider.py index 80aadd6..0d64dbc 100644 --- a/tests/providers/test_provider.py +++ b/tests/providers/test_provider.py @@ -16,3 +16,28 @@ def test_setProvider(disconnected_provider): web3.setProvider(None) assert web3.currentProvider is None assert web3._requestManager.provider is None + + +def test_isConnected(web3): + """ + Web3.isConnected() returns True when connected to a node. + """ + assert web3.isConnected() is True + + +def test_isConnected_no_provider(): + """ + Web3.isConnected() returns False when not configured with a provider. + """ + web3 = Web3(None) + assert web3.isConnected() is False + + +def test_isConnected_disconnected(disconnected_provider): + """ + Web3.isConnected() returns False when configured with a provider + that's not connected to a node. + """ + web3 = Web3(disconnected_provider) + assert web3.isConnected() is False + diff --git a/web3/main.py b/web3/main.py index de5f319..8d876bf 100644 --- a/web3/main.py +++ b/web3/main.py @@ -98,7 +98,7 @@ class Web3(object): return self._requestManager.request_blocking('web3_sha3', [hex_string]) def isConnected(self): - return self.currentProvider and self.currentProvider.isConnected() + return self.currentProvider is not None and self.currentProvider.isConnected() def createBatch(self): raise NotImplementedError("Not Implemented") diff --git a/web3/web3/provider.py b/web3/web3/provider.py index 9d11b66..1e316bf 100644 --- a/web3/web3/provider.py +++ b/web3/web3/provider.py @@ -6,7 +6,7 @@ import itertools from web3.utils.encoding import ( force_bytes, force_obj_to_text, -) + force_text) class BaseProvider(object): @@ -23,3 +23,15 @@ class BaseProvider(object): "params": params or [], "id": next(self.request_counter), }))) + + def isConnected(self): + try: + response_raw = self.make_request('web3_clientVersion', []) + response = json.loads(force_text(response_raw)) + except IOError: + return False + else: + assert response['jsonrpc'] == '2.0' + assert 'error' not in response + return True + assert False