From 7a9fe77c99ab0722535055c57ea8b4cd37042786 Mon Sep 17 00:00:00 2001
From: Holger Nahrstaedt <holger@nahrstaedt.de>
Date: Tue, 5 Jun 2018 12:55:34 +0200
Subject: [PATCH] Use fullnodeupdate for updating the node score in all unit
 tests

CLI
* updatenodes added, this command can be used to update the nodes list
NodeList
* update_nodes added, this command reads the metadata from fullnodeupdate, which contain newest nodes information
* add option wss and https fo get_nodes
Unit tests
* use updatenodes in all tests
---
 beem/cli.py                             |  41 ++++++++
 beem/nodelist.py                        |  47 ++++++++-
 beemapi/graphenerpc.py                  |   2 +-
 beemapi/steemnoderpc.py                 |   2 +
 tests/beem/test_account.py              |   6 +-
 tests/beem/test_amount.py               |   1 +
 tests/beem/test_asset.py                |   1 +
 tests/beem/test_base_objects.py         |   1 +
 tests/beem/test_block.py                |   1 +
 tests/beem/test_blockchain.py           |   1 +
 tests/beem/test_blockchain_batch.py     |   1 +
 tests/beem/test_blockchain_threading.py |   1 +
 tests/beem/test_cli.py                  | 134 ++++++++++--------------
 tests/beem/test_comment.py              |   1 +
 tests/beem/test_connection.py           |   2 +
 tests/beem/test_constants.py            |   1 +
 tests/beem/test_discussions.py          |   1 +
 tests/beem/test_instance.py             |  10 +-
 tests/beem/test_market.py               |   1 +
 tests/beem/test_message.py              |   8 +-
 tests/beem/test_nodelist.py             |  36 +++++++
 tests/beem/test_notify.py               |   1 +
 tests/beem/test_price.py                |   1 +
 tests/beem/test_steem.py                |  30 +++---
 tests/beem/test_steemconnect.py         |   1 +
 tests/beem/test_storage.py              |   1 +
 tests/beem/test_txbuffers.py            |   1 +
 tests/beem/test_vote.py                 |   3 +-
 tests/beem/test_wallet.py               |   1 +
 tests/beem/test_witness.py              |   1 +
 tests/beemapi/test_steemnoderpc.py      |  43 ++++----
 tests/beemapi/test_websocket.py         |   1 +
 32 files changed, 249 insertions(+), 134 deletions(-)
 create mode 100644 tests/beem/test_nodelist.py

diff --git a/beem/cli.py b/beem/cli.py
index 5bd0d58f..999a27eb 100644
--- a/beem/cli.py
+++ b/beem/cli.py
@@ -40,6 +40,7 @@ from timeit import default_timer as timer
 from beembase import operations
 from beemgraphenebase.account import PrivateKey, PublicKey
 from beemgraphenebase.base58 import Base58
+from beem.nodelist import NodeList
 
 
 click.disable_unicode_literals_warning = True
@@ -388,6 +389,46 @@ def currentnode(version, url):
     print(t)
 
 
+@cli.command()
+@click.option(
+    '--show', '-s', is_flag=True, default=False,
+    help="Prints the updated nodes")
+@click.option(
+    '--test', '-t', is_flag=True, default=False,
+    help="Do change the node list, only print the newest nodes setup.")
+@click.option(
+    '--only-https', '-h', is_flag=True, default=False,
+    help="Use only https nodes.")
+@click.option(
+    '--only-wss', '-w', is_flag=True, default=False,
+    help="Use only websocket nodes.")
+@click.option(
+    '--only-appbase', '-a', is_flag=True, default=False,
+    help="Use only appbase nodes")
+@click.option(
+    '--only-non-appbase', '-n', is_flag=True, default=False,
+    help="Use only non-appbase nodes")
+def updatenodes(show, test, only_https, only_wss, only_appbase, only_non_appbase):
+    """ Update the nodelist from @fullnodeupdate
+    """
+    stm = shared_steem_instance()
+    if stm.rpc is not None:
+        stm.rpc.rpcconnect()
+    t = PrettyTable(["node", "Version", "score"])
+    t.align = "l"
+    nodelist = NodeList()
+    nodelist.update_nodes(steem_instance=stm)
+    nodes = nodelist.get_nodes(normal=not only_appbase, appbase=not only_non_appbase, wss=not only_https, https=not only_wss)
+    if show or test:
+        sorted_nodes = sorted(nodelist, key=lambda node: node["score"], reverse=True)
+        for node in sorted_nodes:
+            score = float("{0:.1f}".format(node["score"]))
+            t.add_row([node["url"], node["version"], score])
+        print(t)
+    if not test:
+        stm.set_default_nodes(nodes)
+
+
 @cli.command()
 def config():
     """ Shows local configuration
diff --git a/beem/nodelist.py b/beem/nodelist.py
index 7b206439..e260caed 100644
--- a/beem/nodelist.py
+++ b/beem/nodelist.py
@@ -7,6 +7,11 @@ from builtins import next
 import re
 import time
 import math
+import json
+from beem.instance import shared_steem_instance
+from beem.account import Account
+import logging
+log = logging.getLogger(__name__)
 
 
 class NodeList(list):
@@ -226,7 +231,40 @@ class NodeList(list):
             }]
         super(NodeList, self).__init__(nodes)
 
-    def get_nodes(self, normal=True, appbase=True, dev=False, testnet=False):
+    def update_nodes(self, steem_instance=None):
+        """ Reads metadata from fullnodeupdate"""
+        steem = steem_instance or shared_steem_instance()
+        account = Account("fullnodeupdate", steem_instance=steem)
+        metadata = json.loads(account["json_metadata"])
+        report = metadata["report"]
+        failing_nodes = metadata["failing_nodes"]
+        parameter = metadata["parameter"]
+        benchmarks = parameter["benchmarks"]
+        max_score = len(report) + 1
+        new_nodes = []
+        for node in self:
+            new_node = node.copy()
+            for report_node in report:
+                if node["url"] == report_node["node"]:
+                    new_node["version"] = report_node["version"]
+                    ranks = []
+                    for benchmark in benchmarks:
+                        result = report_node[benchmark]
+                        rank = result["rank"]
+                        if not result["ok"]:
+                            rank = max_score + 1
+                        ranks.append(rank)
+                    sum_rank = 0
+                    for rank in ranks:
+                        sum_rank += rank
+                    new_node["score"] = ((3 * max_score) - sum_rank) / len(ranks) * 10
+            for node_failing in failing_nodes:
+                if node["url"] == node_failing:
+                    new_node["score"] = -1
+            new_nodes.append(new_node)
+        super(NodeList, self).__init__(new_nodes)
+
+    def get_nodes(self, normal=True, appbase=True, dev=False, testnet=False, wss=True, https=True):
         """ Returns nodes as list
 
             :param bool normal: when True, nodes with version 0.19.2 or 0.19.3 are included
@@ -246,8 +284,13 @@ class NodeList(list):
         if testnet:
             node_type_list.append("testnet")
         for node in self:
-            if node["type"] in node_type_list:
+            if node["type"] in node_type_list and node["score"] >= 0:
+                if not https and node["url"][:5] == 'https':
+                    continue
+                if not wss and node["url"][:3] == 'wss':
+                    continue
                 node_list.append(node)
+
         return [node["url"] for node in sorted(node_list, key=lambda self: self['score'], reverse=True)]
 
     def get_testnet(self):
diff --git a/beemapi/graphenerpc.py b/beemapi/graphenerpc.py
index bf8a7012..8d9328a7 100644
--- a/beemapi/graphenerpc.py
+++ b/beemapi/graphenerpc.py
@@ -328,7 +328,7 @@ class GrapheneRPC(object):
         if self.nodes.working_nodes_count == 0:
             raise WorkingNodeMissing
         if self.url is None:
-            self.rpcconnect()
+            raise RPCConnection("RPC is not connected!")
         reply = {}
         while True:
             self.nodes.increase_error_cnt_call()
diff --git a/beemapi/steemnoderpc.py b/beemapi/steemnoderpc.py
index 59b5265d..f1b2d5eb 100644
--- a/beemapi/steemnoderpc.py
+++ b/beemapi/steemnoderpc.py
@@ -54,6 +54,8 @@ class SteemNodeRPC(GrapheneRPC):
             :raises ValueError: if the server does not respond in proper JSON format
             :raises RPCError: if the server returns an error
         """
+        if self.url is None:
+            raise exceptions.RPCConnection("RPC is not connected!")
         doRetry = True
         maxRetryCountReached = False
         while doRetry and not maxRetryCountReached:
diff --git a/tests/beem/test_account.py b/tests/beem/test_account.py
index 22964e39..c0ca6e7f 100644
--- a/tests/beem/test_account.py
+++ b/tests/beem/test_account.py
@@ -27,6 +27,7 @@ class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         cls.bts = Steem(
             node=nodelist.get_nodes(normal=True, appbase=False),
             nobroadcast=True,
@@ -277,11 +278,12 @@ class Testcases(unittest.TestCase):
     ])
     def test_history_block_num(self, node_param):
         if node_param == "non_appbase":
-            account = self.account
+            stm = self.bts
             zero_element = 0
         else:
-            account = self.account_appbase
+            stm = self.appbase
             zero_element = 0  # bug in steem
+        account = Account("fullnodeupdate", steem_instance=stm)
         h_all_raw = []
         for h in account.history_reverse(raw_output=True):
             h_all_raw.append(h)
diff --git a/tests/beem/test_amount.py b/tests/beem/test_amount.py
index 05b4aa32..abde3a11 100644
--- a/tests/beem/test_amount.py
+++ b/tests/beem/test_amount.py
@@ -16,6 +16,7 @@ class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         cls.bts = Steem(
             node=nodelist.get_nodes(appbase=False),
             nobroadcast=True,
diff --git a/tests/beem/test_asset.py b/tests/beem/test_asset.py
index e41f2426..7be22de4 100644
--- a/tests/beem/test_asset.py
+++ b/tests/beem/test_asset.py
@@ -17,6 +17,7 @@ class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         cls.bts = Steem(
             node=nodelist.get_nodes(appbase=False),
             nobroadcast=True,
diff --git a/tests/beem/test_base_objects.py b/tests/beem/test_base_objects.py
index f5de5526..3ffb6a24 100644
--- a/tests/beem/test_base_objects.py
+++ b/tests/beem/test_base_objects.py
@@ -15,6 +15,7 @@ class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         cls.bts = Steem(
             node=nodelist.get_nodes(appbase=False),
             nobroadcast=True,
diff --git a/tests/beem/test_block.py b/tests/beem/test_block.py
index 5456f1fa..6b354c29 100644
--- a/tests/beem/test_block.py
+++ b/tests/beem/test_block.py
@@ -20,6 +20,7 @@ class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         cls.bts = Steem(
             node=nodelist.get_nodes(appbase=False),
             nobroadcast=True,
diff --git a/tests/beem/test_blockchain.py b/tests/beem/test_blockchain.py
index 3b9ad761..82bd2ca8 100644
--- a/tests/beem/test_blockchain.py
+++ b/tests/beem/test_blockchain.py
@@ -23,6 +23,7 @@ class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         cls.bts = Steem(
             node=nodelist.get_nodes(appbase=False),
             nobroadcast=True,
diff --git a/tests/beem/test_blockchain_batch.py b/tests/beem/test_blockchain_batch.py
index 5eab0900..b376068a 100644
--- a/tests/beem/test_blockchain_batch.py
+++ b/tests/beem/test_blockchain_batch.py
@@ -23,6 +23,7 @@ class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         cls.bts = Steem(
             node=nodelist.get_nodes(normal=False, appbase=True, dev=True),
             nobroadcast=True,
diff --git a/tests/beem/test_blockchain_threading.py b/tests/beem/test_blockchain_threading.py
index e234d91c..83256f45 100644
--- a/tests/beem/test_blockchain_threading.py
+++ b/tests/beem/test_blockchain_threading.py
@@ -22,6 +22,7 @@ class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         cls.bts = Steem(
             node=nodelist.get_nodes(appbase=False),
             nobroadcast=True,
diff --git a/tests/beem/test_cli.py b/tests/beem/test_cli.py
index 0c9d5644..35d39444 100644
--- a/tests/beem/test_cli.py
+++ b/tests/beem/test_cli.py
@@ -27,7 +27,8 @@ pub_key = "STX52xMqKegLk4tdpNcUXU9Rw5DtdM9fxf3f12Gp55v1UjLX3ELZf"
 class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
-        nodelist = NodeList()
+        cls.nodelist = NodeList()
+        cls.nodelist.update_nodes(steem_instance=Steem(node=cls.nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         stm = shared_steem_instance()
         stm.config.refreshBackup()
         runner = CliRunner()
@@ -37,7 +38,7 @@ class Testcases(unittest.TestCase):
         result = runner.invoke(cli, ['-o', 'set', 'default_account', 'beem'])
         if result.exit_code != 0:
             raise AssertionError(str(result))
-        result = runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        result = runner.invoke(cli, ['-o', 'set', 'nodes', str(cls.nodelist.get_testnet())])
         if result.exit_code != 0:
             raise AssertionError(str(result))
         result = runner.invoke(cli, ['createwallet', '--wipe'], input="test\ntest\n")
@@ -60,15 +61,13 @@ class Testcases(unittest.TestCase):
 
     def test_balance(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['set', 'nodes', str(self.nodelist.get_testnet())])
         result = runner.invoke(cli, ['balance', 'beem', 'beem1'])
         self.assertEqual(result.exit_code, 0)
 
     def test_interest(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['set', 'nodes', str(self.nodelist.get_testnet())])
         result = runner.invoke(cli, ['interest', 'beem', 'beem1'])
         self.assertEqual(result.exit_code, 0)
 
@@ -112,8 +111,7 @@ class Testcases(unittest.TestCase):
 
     def test_info(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         result = runner.invoke(cli, ['info'])
         self.assertEqual(result.exit_code, 0)
         result = runner.invoke(cli, ['info', 'beem'])
@@ -127,15 +125,14 @@ class Testcases(unittest.TestCase):
 
     def test_info2(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', ''])
+        runner.invoke(cli, ['-o', 'set', 'nodes', self.nodelist.get_nodes()])
         result = runner.invoke(cli, ['info', '--', '-1:1'])
         self.assertEqual(result.exit_code, 0)
         result = runner.invoke(cli, ['info', 'gtg'])
         self.assertEqual(result.exit_code, 0)
         result = runner.invoke(cli, ['info', "@gtg/witness-gtg-log"])
         self.assertEqual(result.exit_code, 0)
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
 
     def test_changepassword(self):
         runner = CliRunner()
@@ -172,22 +169,19 @@ class Testcases(unittest.TestCase):
 
     def test_transfer(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         result = runner.invoke(cli, ['transfer', 'beem1', '1', 'SBD', 'test'], input="test\n")
         self.assertEqual(result.exit_code, 0)
 
     def test_powerdownroute(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         result = runner.invoke(cli, ['powerdownroute', 'beem1'], input="test\n")
         self.assertEqual(result.exit_code, 0)
 
     def test_convert(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         result = runner.invoke(cli, ['convert', '1'], input="test\n")
         self.assertEqual(result.exit_code, 0)
 
@@ -198,8 +192,7 @@ class Testcases(unittest.TestCase):
 
     def test_powerdown(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         result = runner.invoke(cli, ['powerdown', '1e3'], input="test\n")
         self.assertEqual(result.exit_code, 0)
         result = runner.invoke(cli, ['powerdown', '0'], input="test\n")
@@ -207,8 +200,7 @@ class Testcases(unittest.TestCase):
 
     def test_updatememokey(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         result = runner.invoke(cli, ['-d', 'updatememokey'], input="test\ntest\ntest\n")
         self.assertEqual(result.exit_code, 0)
 
@@ -219,36 +211,31 @@ class Testcases(unittest.TestCase):
 
     def test_follower(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         result = runner.invoke(cli, ['follower', 'beem2'])
         self.assertEqual(result.exit_code, 0)
 
     def test_following(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         result = runner.invoke(cli, ['following', 'beem'])
         self.assertEqual(result.exit_code, 0)
 
     def test_muter(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         result = runner.invoke(cli, ['muter', 'beem2'])
         self.assertEqual(result.exit_code, 0)
 
     def test_muting(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         result = runner.invoke(cli, ['muting', 'beem'])
         self.assertEqual(result.exit_code, 0)
 
     def test_allow_disallow(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         result = runner.invoke(cli, ['-d', 'allow', '--account', 'beem', '--permission', 'posting', 'beem1'], input="test\n")
         self.assertEqual(result.exit_code, 0)
         result = runner.invoke(cli, ['-d', 'disallow', '--account', 'beem', '--permission', 'posting', 'beem1'], input="test\n")
@@ -261,32 +248,28 @@ class Testcases(unittest.TestCase):
 
     def test_votes(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', ''])
+        runner.invoke(cli, ['-o', 'set', 'nodes', self.nodelist.get_nodes()])
         result = runner.invoke(cli, ['votes', '--direction', 'out', 'test'])
         self.assertEqual(result.exit_code, 0)
         result = runner.invoke(cli, ['votes', '--direction', 'in', 'test'])
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         self.assertEqual(result.exit_code, 0)
 
     def test_approvewitness(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         result = runner.invoke(cli, ['-o', 'approvewitness', 'beem1'], input="test\n")
         self.assertEqual(result.exit_code, 0)
 
     def test_disapprovewitness(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         result = runner.invoke(cli, ['-o', 'disapprovewitness', 'beem1'], input="test\n")
         self.assertEqual(result.exit_code, 0)
 
     def test_newaccount(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         result = runner.invoke(cli, ['-d', 'newaccount', 'beem3'], input="test\ntest\ntest\n")
         self.assertEqual(result.exit_code, 0)
         result = runner.invoke(cli, ['-d', 'newaccount', '--fee', '6 STEEM', 'beem3'], input="test\ntest\ntest\n")
@@ -294,8 +277,7 @@ class Testcases(unittest.TestCase):
 
     def test_importaccount(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         result = runner.invoke(cli, ['importaccount', '--roles', '["owner", "active", "posting", "memo"]', 'beem2'], input="test\ntest\n")
         self.assertEqual(result.exit_code, 0)
         result = runner.invoke(cli, ['delkey', '--confirm', 'STX7mLs2hns87f7kbf3o2HBqNoEaXiTeeU89eVF6iUCrMQJFzBsPo'], input="test\n")
@@ -309,14 +291,13 @@ class Testcases(unittest.TestCase):
 
     def test_orderbook(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', ''])
+        runner.invoke(cli, ['-o', 'set', 'nodes', self.nodelist.get_nodes()])
         result = runner.invoke(cli, ['orderbook'])
         self.assertEqual(result.exit_code, 0)
         result = runner.invoke(cli, ['orderbook', '--show-date'])
         self.assertEqual(result.exit_code, 0)
         result = runner.invoke(cli, ['orderbook', '--chart'])
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         self.assertEqual(result.exit_code, 0)
 
     def test_buy(self):
@@ -358,8 +339,7 @@ class Testcases(unittest.TestCase):
 
     def test_follow_unfollow(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         result = runner.invoke(cli, ['follow', 'beem1'], input="test\n")
         self.assertEqual(result.exit_code, 0)
         result = runner.invoke(cli, ['unfollow', 'beem1'], input="test\n")
@@ -367,8 +347,7 @@ class Testcases(unittest.TestCase):
 
     def test_mute_unmute(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         result = runner.invoke(cli, ['mute', 'beem1'], input="test\n")
         self.assertEqual(result.exit_code, 0)
         result = runner.invoke(cli, ['unfollow', 'beem1'], input="test\n")
@@ -376,14 +355,13 @@ class Testcases(unittest.TestCase):
 
     def test_witnesscreate(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         result = runner.invoke(cli, ['-d', 'witnesscreate', 'beem', pub_key], input="test\n")
         self.assertEqual(result.exit_code, 0)
 
     def test_witnessupdate(self):
         runner = CliRunner()
-        runner.invoke(cli, ['-o', 'set', 'nodes', ''])
+        runner.invoke(cli, ['-o', 'set', 'nodes', self.nodelist.get_nodes()])
         result = runner.invoke(cli, ['-o', 'nextnode'])
         runner.invoke(cli, ['-o', 'witnessupdate', 'gtg', '--maximum_block_size', 65000, '--account_creation_fee', 0.1, '--sbd_interest_rate', 0, '--url', 'https://google.de', '--signing_key', wif])
         self.assertEqual(result.exit_code, 0)
@@ -407,11 +385,10 @@ class Testcases(unittest.TestCase):
 
     def test_nextnode(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', ''])
+        runner.invoke(cli, ['-o', 'set', 'nodes', self.nodelist.get_nodes()])
         result = runner.invoke(cli, ['-o', 'nextnode'])
         self.assertEqual(result.exit_code, 0)
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
 
     def test_pingnode(self):
         runner = CliRunner()
@@ -420,38 +397,41 @@ class Testcases(unittest.TestCase):
         result = runner.invoke(cli, ['pingnode', '--raw'])
         self.assertEqual(result.exit_code, 0)
 
+    def test_updatenodes(self):
+        runner = CliRunner()
+        runner.invoke(cli, ['-o', 'set', 'nodes', self.nodelist.get_nodes()])
+        result = runner.invoke(cli, ['updatenodes', '--test'])
+        self.assertEqual(result.exit_code, 0)
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
+
     def test_currentnode(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', ''])
+        runner.invoke(cli, ['-o', 'set', 'nodes', self.nodelist.get_nodes()])
         result = runner.invoke(cli, ['currentnode'])
         self.assertEqual(result.exit_code, 0)
         result = runner.invoke(cli, ['currentnode', '--url'])
         self.assertEqual(result.exit_code, 0)
         result = runner.invoke(cli, ['currentnode', '--version'])
         self.assertEqual(result.exit_code, 0)
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
 
     def test_ticker(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', ''])
+        runner.invoke(cli, ['-o', 'set', 'nodes', self.nodelist.get_nodes()])
         result = runner.invoke(cli, ['ticker'])
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         self.assertEqual(result.exit_code, 0)
 
     def test_pricehistory(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', ''])
+        runner.invoke(cli, ['-o', 'set', 'nodes', self.nodelist.get_nodes()])
         result = runner.invoke(cli, ['pricehistory'])
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         self.assertEqual(result.exit_code, 0)
 
     def test_pending(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', ''])
+        runner.invoke(cli, ['-o', 'set', 'nodes', self.nodelist.get_nodes()])
         result = runner.invoke(cli, ['pending', 'test'])
         self.assertEqual(result.exit_code, 0)
         result = runner.invoke(cli, ['pending', '--post', '--comment', '--curation', 'test'])
@@ -464,12 +444,11 @@ class Testcases(unittest.TestCase):
         self.assertEqual(result.exit_code, 0)
         result = runner.invoke(cli, ['pending', '--post', '--comment', '--curation', '--author', '--permlink', '--length', '30', 'test'])
         self.assertEqual(result.exit_code, 0)
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
 
     def test_rewards(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', ''])
+        runner.invoke(cli, ['-o', 'set', 'nodes', self.nodelist.get_nodes()])
         result = runner.invoke(cli, ['rewards', 'test'])
         self.assertEqual(result.exit_code, 0)
         result = runner.invoke(cli, ['rewards', '--post', '--comment', '--curation', 'test'])
@@ -482,28 +461,25 @@ class Testcases(unittest.TestCase):
         self.assertEqual(result.exit_code, 0)
         result = runner.invoke(cli, ['rewards', '--post', '--comment', '--curation', '--author', '--permlink', '--length', '30', 'test'])
         self.assertEqual(result.exit_code, 0)
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
 
     def test_curation(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', ''])
+        runner.invoke(cli, ['-o', 'set', 'nodes', self.nodelist.get_nodes()])
         result = runner.invoke(cli, ['curation', "@gtg/witness-gtg-log"])
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         self.assertEqual(result.exit_code, 0)
 
     def test_verify(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', ''])
+        runner.invoke(cli, ['-o', 'set', 'nodes', self.nodelist.get_nodes()])
         result = runner.invoke(cli, ['verify', '--trx', '0'])
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         self.assertEqual(result.exit_code, 0)
 
     def test_tradehistory(self):
         runner = CliRunner()
-        nodelist = NodeList()
-        runner.invoke(cli, ['-o', 'set', 'nodes', ''])
+        runner.invoke(cli, ['-o', 'set', 'nodes', self.nodelist.get_nodes()])
         result = runner.invoke(cli, ['tradehistory'])
-        runner.invoke(cli, ['-o', 'set', 'nodes', str(nodelist.get_testnet())])
+        runner.invoke(cli, ['-o', 'set', 'nodes', str(self.nodelist.get_testnet())])
         self.assertEqual(result.exit_code, 0)
diff --git a/tests/beem/test_comment.py b/tests/beem/test_comment.py
index f5767a7f..2b8c4255 100644
--- a/tests/beem/test_comment.py
+++ b/tests/beem/test_comment.py
@@ -20,6 +20,7 @@ class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         cls.bts = Steem(
             node=nodelist.get_nodes(appbase=False),
             use_condenser=True,
diff --git a/tests/beem/test_connection.py b/tests/beem/test_connection.py
index 1e9c04aa..6356ad8c 100644
--- a/tests/beem/test_connection.py
+++ b/tests/beem/test_connection.py
@@ -13,6 +13,7 @@ class Testcases(unittest.TestCase):
 
     def test_stm1stm2(self):
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         b1 = Steem(
             node=nodelist.get_testnet(),
             nobroadcast=True,
@@ -29,6 +30,7 @@ class Testcases(unittest.TestCase):
 
     def test_default_connection(self):
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         b1 = Steem(
             node=nodelist.get_testnet(),
             nobroadcast=True,
diff --git a/tests/beem/test_constants.py b/tests/beem/test_constants.py
index 99f3ecd1..9e2f5638 100644
--- a/tests/beem/test_constants.py
+++ b/tests/beem/test_constants.py
@@ -21,6 +21,7 @@ class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         cls.bts = Steem(
             node=nodelist.get_nodes(appbase=False),
             nobroadcast=True,
diff --git a/tests/beem/test_discussions.py b/tests/beem/test_discussions.py
index ba8419ce..742673dc 100644
--- a/tests/beem/test_discussions.py
+++ b/tests/beem/test_discussions.py
@@ -25,6 +25,7 @@ class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         cls.bts = Steem(
             node=nodelist.get_nodes(appbase=False),
             use_condenser=True,
diff --git a/tests/beem/test_instance.py b/tests/beem/test_instance.py
index eec91a37..5f82d9cd 100644
--- a/tests/beem/test_instance.py
+++ b/tests/beem/test_instance.py
@@ -38,13 +38,14 @@ core_unit = "STM"
 class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
-        nodelist = NodeList()
-        stm = Steem(node=nodelist.get_nodes())
+        cls.nodelist = NodeList()
+        cls.nodelist.update_nodes(steem_instance=Steem(node=cls.nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
+        stm = Steem(node=cls.nodelist.get_nodes())
         stm.config.refreshBackup()
         stm.set_default_nodes(["xyz"])
         del stm
 
-        cls.urls = nodelist.get_nodes()
+        cls.urls = cls.nodelist.get_nodes()
         cls.bts = Steem(
             node=cls.urls,
             nobroadcast=True,
@@ -54,8 +55,7 @@ class Testcases(unittest.TestCase):
 
     @classmethod
     def tearDownClass(cls):
-        nodelist = NodeList()
-        stm = Steem(node=nodelist.get_nodes())
+        stm = Steem(node=cls.nodelist.get_nodes())
         stm.config.recover_with_latest_backup()
 
     @parameterized.expand([
diff --git a/tests/beem/test_market.py b/tests/beem/test_market.py
index 306983b1..49165625 100644
--- a/tests/beem/test_market.py
+++ b/tests/beem/test_market.py
@@ -22,6 +22,7 @@ class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         cls.bts = Steem(
             node=nodelist.get_nodes(appbase=False),
             nobroadcast=True,
diff --git a/tests/beem/test_message.py b/tests/beem/test_message.py
index a9ab4e8f..53dae03b 100644
--- a/tests/beem/test_message.py
+++ b/tests/beem/test_message.py
@@ -5,20 +5,20 @@ from beem import Steem
 from beem.message import Message
 from beem.account import Account
 from beem.instance import set_shared_steem_instance
+from beem.nodelist import NodeList
 
 wif = "5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"
 core_unit = "STM"
-nodes = ["wss://steemd.pevo.science", "wss://gtg.steem.house:8090", "wss://rpc.steemliberator.com", "wss://rpc.buildteam.io",
-         "wss://rpc.steemviz.com", "wss://seed.bitcoiner.me", "wss://node.steem.ws", "wss://steemd.steemgigs.org", "wss://steemd.steemit.com",
-         "wss://steemd.minnowsupportproject.org"]
 
 
 class Testcases(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
+        nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         cls.bts = Steem(
-            node=nodes,
+            node=nodelist.get_nodes(),
             nobroadcast=True,
             keys=[wif],
             num_retries=10
diff --git a/tests/beem/test_nodelist.py b/tests/beem/test_nodelist.py
new file mode 100644
index 00000000..c318f19a
--- /dev/null
+++ b/tests/beem/test_nodelist.py
@@ -0,0 +1,36 @@
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+from builtins import super
+import unittest
+from beem import Steem, exceptions
+from beem.instance import set_shared_steem_instance
+from beem.account import Account
+from beem.nodelist import NodeList
+
+
+class Testcases(unittest.TestCase):
+    @classmethod
+    def setUpClass(cls):
+        nodelist = NodeList()
+        cls.bts = Steem(
+            node=nodelist.get_nodes(appbase=False),
+            nobroadcast=True,
+            num_retries=10
+        )
+        set_shared_steem_instance(cls.bts)
+
+    def test_get_nodes(self):
+        nodelist = NodeList()
+        all_nodes = nodelist.get_nodes(normal=True, appbase=True, dev=True, testnet=True)
+        self.assertEqual(len(nodelist), len(all_nodes))
+        https_nodes = nodelist.get_nodes(wss=False)
+        self.assertEqual(https_nodes[0][:5], 'https')
+
+    def test_nodes_update(self):
+        nodelist = NodeList()
+        all_nodes = nodelist.get_nodes(normal=True, appbase=True, dev=True, testnet=True)
+        nodelist.update_nodes(steem_instance=self.bts)
+        nodes = nodelist.get_nodes()
+        self.assertIn(nodes[0], all_nodes)
diff --git a/tests/beem/test_notify.py b/tests/beem/test_notify.py
index 1a483a33..39c7f8ad 100644
--- a/tests/beem/test_notify.py
+++ b/tests/beem/test_notify.py
@@ -39,6 +39,7 @@ class Testcases(unittest.TestCase):
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         self.bts = Steem(
             node=nodelist.get_nodes(),
             nobroadcast=True,
diff --git a/tests/beem/test_price.py b/tests/beem/test_price.py
index 1cf88da4..14beb82f 100644
--- a/tests/beem/test_price.py
+++ b/tests/beem/test_price.py
@@ -15,6 +15,7 @@ class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         steem = Steem(
             node=nodelist.get_nodes(appbase=False),
             nobroadcast=True,
diff --git a/tests/beem/test_steem.py b/tests/beem/test_steem.py
index f8f8621d..43c9a8f9 100644
--- a/tests/beem/test_steem.py
+++ b/tests/beem/test_steem.py
@@ -31,16 +31,17 @@ class Testcases(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        nodelist = NodeList()
+        cls.nodelist = NodeList()
+        cls.nodelist.update_nodes(steem_instance=Steem(node=cls.nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         cls.bts = Steem(
-            node=nodelist.get_nodes(appbase=False),
+            node=cls.nodelist.get_nodes(appbase=False),
             nobroadcast=True,
             unsigned=True,
             data_refresh_time_seconds=900,
             keys={"active": wif, "owner": wif, "memo": wif},
             num_retries=10)
         cls.appbase = Steem(
-            node=nodelist.get_nodes(normal=False, appbase=True),
+            node=cls.nodelist.get_nodes(normal=False, appbase=True),
             nobroadcast=True,
             unsigned=True,
             data_refresh_time_seconds=900,
@@ -82,16 +83,15 @@ class Testcases(unittest.TestCase):
         ("appbase"),
     ])
     def test_create_account(self, node_param):
-        nodelist = NodeList()
         if node_param == "non_appbase":
-            bts = Steem(node=nodelist.get_nodes(appbase=False),
+            bts = Steem(node=self.nodelist.get_nodes(appbase=False),
                         nobroadcast=True,
                         unsigned=True,
                         data_refresh_time_seconds=900,
                         keys={"active": wif, "owner": wif, "memo": wif},
                         num_retries=10)
         elif node_param == "appbase":
-            bts = Steem(node=nodelist.get_nodes(normal=False, appbase=True),
+            bts = Steem(node=self.nodelist.get_nodes(normal=False, appbase=True),
                         nobroadcast=True,
                         unsigned=True,
                         data_refresh_time_seconds=900,
@@ -163,16 +163,15 @@ class Testcases(unittest.TestCase):
         ("appbase"),
     ])
     def test_create_account_password(self, node_param):
-        nodelist = NodeList()
         if node_param == "non_appbase":
-            bts = Steem(node=nodelist.get_nodes(appbase=False),
+            bts = Steem(node=self.nodelist.get_nodes(appbase=False),
                         nobroadcast=True,
                         unsigned=True,
                         data_refresh_time_seconds=900,
                         keys={"active": wif, "owner": wif, "memo": wif},
                         num_retries=10)
         elif node_param == "appbase":
-            bts = Steem(node=nodelist.get_nodes(normal=False, appbase=True),
+            bts = Steem(node=self.nodelist.get_nodes(normal=False, appbase=True),
                         nobroadcast=True,
                         unsigned=True,
                         data_refresh_time_seconds=900,
@@ -227,16 +226,15 @@ class Testcases(unittest.TestCase):
         ("appbase"),
     ])
     def test_create_account_with_delegation(self, node_param):
-        nodelist = NodeList()
         if node_param == "non_appbase":
-            bts = Steem(node=nodelist.get_nodes(appbase=False),
+            bts = Steem(node=self.nodelist.get_nodes(appbase=False),
                         nobroadcast=True,
                         unsigned=True,
                         data_refresh_time_seconds=900,
                         keys={"active": wif, "owner": wif, "memo": wif},
                         num_retries=10)
         elif node_param == "appbase":
-            bts = Steem(node=nodelist.get_nodes(normal=False, appbase=True),
+            bts = Steem(node=self.nodelist.get_nodes(normal=False, appbase=True),
                         nobroadcast=True,
                         unsigned=True,
                         data_refresh_time_seconds=900,
@@ -521,8 +519,7 @@ class Testcases(unittest.TestCase):
         self.assertFalse(bts.get_blockchain_version() == '0.0.0')
 
     def test_offline(self):
-        nodelist = NodeList()
-        bts = Steem(node=nodelist.get_nodes(appbase=False),
+        bts = Steem(node=self.nodelist.get_nodes(appbase=False),
                     offline=True,
                     data_refresh_time_seconds=900,
                     keys={"active": wif, "owner": wif, "memo": wif})
@@ -551,15 +548,14 @@ class Testcases(unittest.TestCase):
         ("appbase"),
     ])
     def test_properties(self, node_param):
-        nodelist = NodeList()
         if node_param == "non_appbase":
-            bts = Steem(node=nodelist.get_nodes(appbase=False),
+            bts = Steem(node=self.nodelist.get_nodes(appbase=False),
                         nobroadcast=True,
                         data_refresh_time_seconds=900,
                         keys={"active": wif, "owner": wif, "memo": wif},
                         num_retries=10)
         elif node_param == "appbase":
-            bts = Steem(node=nodelist.get_nodes(normal=False, appbase=True),
+            bts = Steem(node=self.nodelist.get_nodes(normal=False, appbase=True),
                         nobroadcast=True,
                         data_refresh_time_seconds=900,
                         keys={"active": wif, "owner": wif, "memo": wif},
diff --git a/tests/beem/test_steemconnect.py b/tests/beem/test_steemconnect.py
index 818ae1ec..e5cdb03a 100644
--- a/tests/beem/test_steemconnect.py
+++ b/tests/beem/test_steemconnect.py
@@ -32,6 +32,7 @@ class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         cls.bts = Steem(
             node=nodelist.get_nodes(appbase=False),
             nobroadcast=True,
diff --git a/tests/beem/test_storage.py b/tests/beem/test_storage.py
index e68cd7e8..314da3aa 100644
--- a/tests/beem/test_storage.py
+++ b/tests/beem/test_storage.py
@@ -33,6 +33,7 @@ class Testcases(unittest.TestCase):
         stm = shared_steem_instance()
         stm.config.refreshBackup()
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
 
         cls.stm = Steem(
             node=nodelist.get_nodes(appbase=False),
diff --git a/tests/beem/test_txbuffers.py b/tests/beem/test_txbuffers.py
index 458ac61d..7763cc1a 100644
--- a/tests/beem/test_txbuffers.py
+++ b/tests/beem/test_txbuffers.py
@@ -32,6 +32,7 @@ class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         cls.stm = Steem(
             node=nodelist.get_nodes(appbase=False),
             keys={"active": wif, "owner": wif, "memo": wif},
diff --git a/tests/beem/test_vote.py b/tests/beem/test_vote.py
index 259298b2..8bae9f54 100644
--- a/tests/beem/test_vote.py
+++ b/tests/beem/test_vote.py
@@ -21,6 +21,7 @@ class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         cls.bts = Steem(
             node=nodelist.get_nodes(appbase=False),
             nobroadcast=True,
@@ -40,7 +41,7 @@ class Testcases(unittest.TestCase):
 
         acc = Account("holger80", steem_instance=cls.bts)
         votes = acc.get_account_votes()
-        last_vote = votes[0]
+        last_vote = votes[-1]
 
         cls.authorpermvoter = '@' + last_vote['authorperm'] + '|' + acc["name"]
         [author, permlink, voter] = resolve_authorpermvoter(cls.authorpermvoter)
diff --git a/tests/beem/test_wallet.py b/tests/beem/test_wallet.py
index 8bb5b0df..a3213b79 100644
--- a/tests/beem/test_wallet.py
+++ b/tests/beem/test_wallet.py
@@ -24,6 +24,7 @@ class Testcases(unittest.TestCase):
         stm = shared_steem_instance()
         stm.config.refreshBackup()
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
 
         cls.stm = Steem(
             node=nodelist.get_nodes(appbase=False),
diff --git a/tests/beem/test_witness.py b/tests/beem/test_witness.py
index 9ad9958a..5eb482a7 100644
--- a/tests/beem/test_witness.py
+++ b/tests/beem/test_witness.py
@@ -18,6 +18,7 @@ class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         cls.bts = Steem(
             node=nodelist.get_nodes(appbase=False),
             nobroadcast=True,
diff --git a/tests/beemapi/test_steemnoderpc.py b/tests/beemapi/test_steemnoderpc.py
index d9c4df99..3ea0d22f 100644
--- a/tests/beemapi/test_steemnoderpc.py
+++ b/tests/beemapi/test_steemnoderpc.py
@@ -17,40 +17,37 @@ from beemapi.websocket import SteemWebsocket
 from beemapi import exceptions
 from beemapi.exceptions import NumRetriesReached, CallRetriesReached
 from beem.instance import set_shared_steem_instance
+from beem.nodelist import NodeList
 # Py3 compatibility
 import sys
 
 wif = "5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"
 core_unit = "STM"
-nodes = ["wss://steemd.pevo.science", "wss://gtg.steem.house:8090", "wss://rpc.steemliberator.com", "wss://rpc.buildteam.io",
-         "wss://rpc.steemviz.com", "wss://seed.bitcoiner.me", "wss://node.steem.ws", "wss://steemd.steemgigs.org", "wss://steemd.steemit.com",
-         "wss://steemd.minnowsupportproject.org"]
-nodes_https = ['https://api.steemit.com', 'https://steemd.privex.io', 'https://steemd.pevo.science', 'https://rpc.steemliberator.com',
-               'https://rpc.buildteam.io', 'https://steemd.minnowsupportproject.org', 'https://gtg.steem.house:8090', 'https://seed.bitcoiner.me']
-nodes_appbase = ["https://api.steemit.com", "wss://appbasetest.timcliff.com"]
-test_list = ["wss://steemd.doesnot.exists", "wss://api.steemit.com", "wss://steemd.pevo.science", "wss://gtg.steem.house:8090",
-             "https://api.steemit.com", "wss://appbasetest.timcliff.com", 'https://steemd.privex.io',
-             'https://steemd.pevo.science', 'https://rpc.steemliberator.com',
-             'https://rpc.buildteam.io', 'https://steemd.minnowsupportproject.org', 'https://gtg.steem.house:8090', 'https://seed.bitcoiner.me']
 
 
 class Testcases(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
+        nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
+        cls.nodes = nodelist.get_nodes(https=False, appbase=False)
+        cls.nodes_https = nodelist.get_nodes(wss=False, appbase=False)
+        cls.nodes_appbase = nodelist.get_nodes(normal=False)
+        cls.test_list = nodelist.get_nodes()
         cls.bts = Steem(
-            node=nodes,
+            node=cls.nodes,
             nobroadcast=True,
             keys={"active": wif, "owner": wif, "memo": wif},
             num_retries=10
         )
         cls.appbase = Steem(
-            node=nodes_appbase,
+            node=cls.nodes_appbase,
             nobroadcast=True,
             keys={"active": wif, "owner": wif, "memo": wif},
             num_retries=10
         )
-        cls.rpc = SteemNodeRPC(urls=test_list)
+        cls.rpc = SteemNodeRPC(urls=cls.test_list)
         # from getpass import getpass
         # self.bts.wallet.unlock(getpass())
         set_shared_steem_instance(cls.bts)
@@ -87,30 +84,30 @@ class Testcases(unittest.TestCase):
 
     def test_connect_test_node(self):
         rpc = self.rpc
-        self.assertIn(rpc.url, nodes + nodes_appbase + nodes_https)
+        self.assertIn(rpc.url, self.nodes + self.nodes_appbase + self.nodes_https)
         rpc.rpcclose()
         rpc.rpcconnect()
-        self.assertIn(rpc.url, nodes + nodes_appbase + nodes_https)
+        self.assertIn(rpc.url, self.nodes + self.nodes_appbase + self.nodes_https)
 
     def test_connect_test_node2(self):
         rpc = self.rpc
-        self.assertIn(rpc.url, nodes + nodes_appbase + nodes_https)
+        self.assertIn(rpc.url, self.nodes + self.nodes_appbase + self.nodes_https)
         rpc.next()
-        self.assertIn(rpc.url, nodes + nodes_appbase + nodes_https)
+        self.assertIn(rpc.url, self.nodes + self.nodes_appbase + self.nodes_https)
 
     def test_connect_test_str_list(self):
         str_list = "wss://steemd.pevo.science;wss://gtg.steem.house:8090;wss://rpc.steemliberator.com;wss://rpc.buildteam.io"
         rpc = SteemNodeRPC(urls=str_list)
-        self.assertIn(rpc.url, nodes + nodes_appbase + nodes_https)
+        self.assertIn(rpc.url, self.nodes + self.nodes_appbase + self.nodes_https)
         rpc.next()
-        self.assertIn(rpc.url, nodes + nodes_appbase + nodes_https)
+        self.assertIn(rpc.url, self.nodes + self.nodes_appbase + self.nodes_https)
 
     def test_connect_test_str_list2(self):
         str_list = "wss://steemd.pevo.science, wss://gtg.steem.house:8090, wss://rpc.steemliberator.com, wss://rpc.buildteam.io"
         rpc = SteemNodeRPC(urls=str_list)
-        self.assertIn(rpc.url, nodes + nodes_appbase + nodes_https)
+        self.assertIn(rpc.url, self.nodes + self.nodes_appbase + self.nodes_https)
         rpc.next()
-        self.assertIn(rpc.url, nodes + nodes_appbase + nodes_https)
+        self.assertIn(rpc.url, self.nodes + self.nodes_appbase + self.nodes_https)
 
     def test_server_error(self):
         rpc = self.rpc
@@ -189,7 +186,7 @@ class Testcases(unittest.TestCase):
             SteemNodeRPC(urls=nodes, num_retries=0, num_retries_call=0, timeout=1)
 
     def test_error_handling(self):
-        rpc = SteemNodeRPC(urls=nodes, num_retries=2, num_retries_call=3)
+        rpc = SteemNodeRPC(urls=self.nodes, num_retries=2, num_retries_call=3)
         with self.assertRaises(
             exceptions.NoMethodWithName
         ):
@@ -200,7 +197,7 @@ class Testcases(unittest.TestCase):
             rpc.get_accounts("test")
 
     def test_error_handling_appbase(self):
-        rpc = SteemNodeRPC(urls=nodes_appbase, num_retries=2, num_retries_call=3)
+        rpc = SteemNodeRPC(urls=self.nodes_appbase, num_retries=2, num_retries_call=3)
         with self.assertRaises(
             exceptions.NoMethodWithName
         ):
diff --git a/tests/beemapi/test_websocket.py b/tests/beemapi/test_websocket.py
index 9b314bf5..0b2bb21c 100644
--- a/tests/beemapi/test_websocket.py
+++ b/tests/beemapi/test_websocket.py
@@ -26,6 +26,7 @@ class Testcases(unittest.TestCase):
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
         nodelist = NodeList()
+        nodelist.update_nodes(steem_instance=Steem(node=nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
         stm = Steem(node=nodelist.get_nodes(appbase=False))
 
         self.ws = SteemWebsocket(
-- 
GitLab