From 225cd91877a476b1a8a110c910735446aee24c5d Mon Sep 17 00:00:00 2001
From: Holger Nahrstaedt <holger@nahrstaedt.de>
Date: Thu, 31 May 2018 23:44:12 +0200
Subject: [PATCH] More bug fixes, missing steem_instance fixed

---
 beem/amount.py              |   4 +-
 beem/cli.py                 |   8 +-
 beem/steem.py               |   8 +-
 beemapi/graphenerpc.py      |   1 +
 tests/beem/test_instance.py | 350 ++++++++++++++++++++++++++++++------
 5 files changed, 312 insertions(+), 59 deletions(-)

diff --git a/beem/amount.py b/beem/amount.py
index b96b275d..63f12685 100644
--- a/beem/amount.py
+++ b/beem/amount.py
@@ -223,7 +223,7 @@ class Amount(dict):
             if not other["asset"] == self["asset"]:
                 raise AssertionError()
             from .price import Price
-            return Price(self, other)
+            return Price(self, other, steem_instance=self.steem)
         else:
             a["amount"] //= other
         return a
@@ -234,7 +234,7 @@ class Amount(dict):
             if not other["asset"] == self["asset"]:
                 raise AssertionError()
             from .price import Price
-            return Price(self, other)
+            return Price(self, other, steem_instance=self.steem)
         else:
             a["amount"] /= other
         return a
diff --git a/beem/cli.py b/beem/cli.py
index d49c95f3..a747dea2 100644
--- a/beem/cli.py
+++ b/beem/cli.py
@@ -1149,7 +1149,7 @@ def setprofile(variable, value, account, pair):
     acc["json_metadata"] = Profile(acc["json_metadata"]
                                    if acc["json_metadata"] else {})
     acc["json_metadata"].update(profile)
-    tx = acc.update_account_profile(acc["json_metadata"])
+    tx = acc.update_account_metadata(acc["json_metadata"])
     if stm.unsigned and stm.nobroadcast and stm.steemconnect is not None:
         tx = stm.steemconnect.url_from_tx(tx)
     tx = json.dumps(tx, indent=4)
@@ -1389,8 +1389,8 @@ def pricehistory(width, height, ascii):
     price_history = feed_history["price_history"]
     price = []
     for h in price_history:
-        base = Amount(h["base"])
-        quote = Amount(h["quote"])
+        base = Amount(h["base"], steem_instance=stm)
+        quote = Amount(h["quote"], steem_instance=stm)
         price.append(base.amount / quote.amount)
     if ascii:
         charset = u'ascii'
@@ -2384,7 +2384,7 @@ def pending(accounts, only_sum, post, comment, curation, length, author, permlin
         if curation:
             votes = AccountVotes(account, start=limit_time, steem_instance=stm)
             for vote in votes:
-                c = Comment(vote["authorperm"])
+                c = Comment(vote["authorperm"], steem_instance=stm)
                 rewards = c.get_curation_rewards()
                 if not rewards["pending_rewards"]:
                     continue
diff --git a/beem/steem.py b/beem/steem.py
index c08265b0..68213ec3 100644
--- a/beem/steem.py
+++ b/beem/steem.py
@@ -627,11 +627,13 @@ class Steem(object):
 
     @property
     def chain_params(self):
-        if self.offline:
+        if self.offline or self.rpc is None:
             from beemgraphenebase.chains import known_chains
             return known_chains["STEEM"]
-        else:
+        elif self.rpc.chain_params is not None:
             return self.rpc.chain_params
+        else:
+            return self.rpc.get_network()
 
     @property
     def prefix(self):
@@ -790,7 +792,7 @@ class Steem(object):
         """
         if tx:
             # If tx is provided, we broadcast the tx
-            return TransactionBuilder(tx).broadcast()
+            return TransactionBuilder(tx, steem_instance=self).broadcast()
         else:
             return self.txbuffer.broadcast()
 
diff --git a/beemapi/graphenerpc.py b/beemapi/graphenerpc.py
index 99b5574e..3eb927d0 100644
--- a/beemapi/graphenerpc.py
+++ b/beemapi/graphenerpc.py
@@ -137,6 +137,7 @@ class GrapheneRPC(object):
         self.ws = None
         self.url = None
         self.session = None
+        self.chain_params = None
         self.rpc_queue = []
         if kwargs.get("autoconnect", True):
             self.rpcconnect()
diff --git a/tests/beem/test_instance.py b/tests/beem/test_instance.py
index be907b01..eec91a37 100644
--- a/tests/beem/test_instance.py
+++ b/tests/beem/test_instance.py
@@ -8,6 +8,7 @@ import mock
 import string
 import unittest
 import random
+from parameterized import parameterized
 from pprint import pprint
 from beem import Steem
 from beem.amount import Amount
@@ -20,12 +21,13 @@ from beem.market import Market
 from beem.price import Price
 from beem.comment import Comment
 from beem.vote import Vote
+from beemapi.exceptions import NumRetriesReached
 from beem.wallet import Wallet
 from beem.transactionbuilder import TransactionBuilder
 from beembase.operations import Transfer
 from beemgraphenebase.account import PasswordKey, PrivateKey, PublicKey
 from beem.utils import parse_time, formatTimedelta
-from beemapi.rpcutils import NumRetriesReached
+from beem.nodelist import NodeList
 
 # Py3 compatibility
 import sys
@@ -36,77 +38,325 @@ core_unit = "STM"
 class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
-        stm = shared_steem_instance()
+        nodelist = NodeList()
+        stm = Steem(node=nodelist.get_nodes())
         stm.config.refreshBackup()
-        stm.set_default_nodes("")
+        stm.set_default_nodes(["xyz"])
         del stm
-        cls.url = "https://api.steemitdev.com"
-        bts = Steem(
-            node=[cls.url],
+
+        cls.urls = nodelist.get_nodes()
+        cls.bts = Steem(
+            node=cls.urls,
             nobroadcast=True,
             num_retries=10
         )
-        set_shared_steem_instance(bts)
+        set_shared_steem_instance(cls.bts)
 
     @classmethod
     def tearDownClass(cls):
-        stm = shared_steem_instance()
+        nodelist = NodeList()
+        stm = Steem(node=nodelist.get_nodes())
         stm.config.recover_with_latest_backup()
 
-    def test_account(self):
-        acc = Account("test")
-        self.assertEqual(acc.steem.rpc.url, self.url)
-        self.assertEqual(acc["balance"].steem.rpc.url, self.url)
+    @parameterized.expand([
+        ("instance"),
+        ("steem")
+    ])
+    def test_account(self, node_param):
+        if node_param == "instance":
+            stm = Steem(node="abc", autoconnect=False, num_retries=1)
+            set_shared_steem_instance(self.bts)
+            acc = Account("test")
+            self.assertIn(acc.steem.rpc.url, self.urls)
+            self.assertIn(acc["balance"].steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                Account("test", steem_instance=stm)
+        else:
+            set_shared_steem_instance(Steem(node="abc", autoconnect=False, num_retries=1))
+            stm = self.bts
+            acc = Account("test", steem_instance=stm)
+            self.assertIn(acc.steem.rpc.url, self.urls)
+            self.assertIn(acc["balance"].steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                Account("test")
 
-    def test_amount(self):
-        o = Amount("1 SBD")
-        self.assertEqual(o.steem.rpc.url, self.url)
+    @parameterized.expand([
+        ("instance"),
+        ("steem")
+    ])
+    def test_amount(self, node_param):
+        if node_param == "instance":
+            stm = Steem(node="abc", autoconnect=False, num_retries=1)
+            set_shared_steem_instance(self.bts)
+            o = Amount("1 SBD")
+            self.assertIn(o.steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                Amount("1 SBD", steem_instance=stm)
+        else:
+            set_shared_steem_instance(Steem(node="abc", autoconnect=False, num_retries=1))
+            stm = self.bts
+            o = Amount("1 SBD", steem_instance=stm)
+            self.assertIn(o.steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                Amount("1 SBD")
 
-    def test_block(self):
-        o = Block(1)
-        self.assertEqual(o.steem.rpc.url, self.url)
+    @parameterized.expand([
+        ("instance"),
+        ("steem")
+    ])
+    def test_block(self, node_param):
+        if node_param == "instance":
+            stm = Steem(node="abc", autoconnect=False, num_retries=1)
+            set_shared_steem_instance(self.bts)
+            o = Block(1)
+            self.assertIn(o.steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                Block(1, steem_instance=stm)
+        else:
+            set_shared_steem_instance(Steem(node="abc", autoconnect=False, num_retries=1))
+            stm = self.bts
+            o = Block(1, steem_instance=stm)
+            self.assertIn(o.steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                Block(1)
 
-    def test_blockchain(self):
-        o = Blockchain()
-        self.assertEqual(o.steem.rpc.url, self.url)
+    @parameterized.expand([
+        ("instance"),
+        ("steem")
+    ])
+    def test_blockchain(self, node_param):
+        if node_param == "instance":
+            stm = Steem(node="abc", autoconnect=False, num_retries=1)
+            set_shared_steem_instance(self.bts)
+            o = Blockchain()
+            self.assertIn(o.steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                Blockchain(steem_instance=stm)
+        else:
+            set_shared_steem_instance(Steem(node="abc", autoconnect=False, num_retries=1))
+            stm = self.bts
+            o = Blockchain(steem_instance=stm)
+            self.assertIn(o.steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                Blockchain()
 
-    def test_comment(self):
-        o = Comment("@gtg/witness-gtg-log")
-        self.assertEqual(o.steem.rpc.url, self.url)
+    @parameterized.expand([
+        ("instance"),
+        ("steem")
+    ])
+    def test_comment(self, node_param):
+        if node_param == "instance":
+            stm = Steem(node="abc", autoconnect=False, num_retries=1)
+            set_shared_steem_instance(self.bts)
+            o = Comment("@gtg/witness-gtg-log")
+            self.assertIn(o.steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                Comment("@gtg/witness-gtg-log", steem_instance=stm)
+        else:
+            set_shared_steem_instance(Steem(node="abc", autoconnect=False, num_retries=1))
+            stm = self.bts
+            o = Comment("@gtg/witness-gtg-log", steem_instance=stm)
+            self.assertIn(o.steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                Comment("@gtg/witness-gtg-log")
 
-    def test_market(self):
-        o = Market()
-        self.assertEqual(o.steem.rpc.url, self.url)
+    @parameterized.expand([
+        ("instance"),
+        ("steem")
+    ])
+    def test_market(self, node_param):
+        if node_param == "instance":
+            stm = Steem(node="abc", autoconnect=False, num_retries=1)
+            set_shared_steem_instance(self.bts)
+            o = Market()
+            self.assertIn(o.steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                Market(steem_instance=stm)
+        else:
+            set_shared_steem_instance(Steem(node="abc", autoconnect=False, num_retries=1))
+            stm = self.bts
+            o = Market(steem_instance=stm)
+            self.assertIn(o.steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                Market()
 
-    def test_price(self):
-        o = Price(10.0, "STEEM/SBD")
-        self.assertEqual(o.steem.rpc.url, self.url)
+    @parameterized.expand([
+        ("instance"),
+        ("steem")
+    ])
+    def test_price(self, node_param):
+        if node_param == "instance":
+            stm = Steem(node="abc", autoconnect=False, num_retries=1)
+            set_shared_steem_instance(self.bts)
+            o = Price(10.0, "STEEM/SBD")
+            self.assertIn(o.steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                Price(10.0, "STEEM/SBD", steem_instance=stm)
+        else:
+            set_shared_steem_instance(Steem(node="abc", autoconnect=False, num_retries=1))
+            stm = self.bts
+            o = Price(10.0, "STEEM/SBD", steem_instance=stm)
+            self.assertIn(o.steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                Price(10.0, "STEEM/SBD")
 
-    def test_vote(self):
-        o = Vote("@gtg/ffdhu-gtg-witness-log|gandalf")
-        self.assertEqual(o.steem.rpc.url, self.url)
+    @parameterized.expand([
+        ("instance"),
+        ("steem")
+    ])
+    def test_vote(self, node_param):
+        if node_param == "instance":
+            stm = Steem(node="abc", autoconnect=False, num_retries=1)
+            set_shared_steem_instance(self.bts)
+            o = Vote("@gtg/ffdhu-gtg-witness-log|gandalf")
+            self.assertIn(o.steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                Vote("@gtg/ffdhu-gtg-witness-log|gandalf", steem_instance=stm)
+        else:
+            set_shared_steem_instance(Steem(node="abc", autoconnect=False, num_retries=1))
+            stm = self.bts
+            o = Vote("@gtg/ffdhu-gtg-witness-log|gandalf", steem_instance=stm)
+            self.assertIn(o.steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                Vote("@gtg/ffdhu-gtg-witness-log|gandalf")
 
-    def test_wallet(self):
-        o = Wallet()
-        self.assertEqual(o.steem.rpc.url, self.url)
+    @parameterized.expand([
+        ("instance"),
+        ("steem")
+    ])
+    def test_wallet(self, node_param):
+        if node_param == "instance":
+            stm = Steem(node="abc", autoconnect=False, num_retries=1)
+            set_shared_steem_instance(self.bts)
+            o = Wallet()
+            self.assertIn(o.steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                o = Wallet(steem_instance=stm)
+                o.steem.get_config()
+        else:
+            set_shared_steem_instance(Steem(node="abc", autoconnect=False, num_retries=1))
+            stm = self.bts
+            o = Wallet(steem_instance=stm)
+            self.assertIn(o.steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                o = Wallet()
+                o.steem.get_config()
 
-    def test_witness(self):
-        o = Witness("gtg")
-        self.assertEqual(o.steem.rpc.url, self.url)
+    @parameterized.expand([
+        ("instance"),
+        ("steem")
+    ])
+    def test_witness(self, node_param):
+        if node_param == "instance":
+            stm = Steem(node="abc", autoconnect=False, num_retries=1)
+            set_shared_steem_instance(self.bts)
+            o = Witness("gtg")
+            self.assertIn(o.steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                Witness("gtg", steem_instance=stm)
+        else:
+            set_shared_steem_instance(Steem(node="abc", autoconnect=False, num_retries=1))
+            stm = self.bts
+            o = Witness("gtg", steem_instance=stm)
+            self.assertIn(o.steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                Witness("gtg")
 
-    def test_transactionbuilder(self):
-        o = TransactionBuilder()
-        self.assertEqual(o.steem.rpc.url, self.url)
+    @parameterized.expand([
+        ("instance"),
+        ("steem")
+    ])
+    def test_transactionbuilder(self, node_param):
+        if node_param == "instance":
+            stm = Steem(node="abc", autoconnect=False, num_retries=1)
+            set_shared_steem_instance(self.bts)
+            o = TransactionBuilder()
+            self.assertIn(o.steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                o = TransactionBuilder(steem_instance=stm)
+                o.steem.get_config()
+        else:
+            set_shared_steem_instance(Steem(node="abc", autoconnect=False, num_retries=1))
+            stm = self.bts
+            o = TransactionBuilder(steem_instance=stm)
+            self.assertIn(o.steem.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                o = TransactionBuilder()
+                o.steem.get_config()
 
-    def test_steem(self):
-        stm = shared_steem_instance()
-        stm = Steem()
-        del stm
-        o = shared_steem_instance()
-        self.assertEqual(o.rpc.url, self.url)
+    @parameterized.expand([
+        ("instance"),
+        ("steem")
+    ])
+    def test_steem(self, node_param):
+        if node_param == "instance":
+            stm = Steem(node="abc", autoconnect=False, num_retries=1)
+            set_shared_steem_instance(self.bts)
+            o = Steem(node=self.urls)
+            o.get_config()
+            self.assertIn(o.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                stm.get_config()
+        else:
+            set_shared_steem_instance(Steem(node="abc", autoconnect=False, num_retries=1))
+            stm = self.bts
+            o = stm
+            o.get_config()
+            self.assertIn(o.rpc.url, self.urls)
+            with self.assertRaises(
+                NumRetriesReached
+            ):
+                stm = shared_steem_instance()
+                stm.get_config()
 
     def test_config(self):
-        set_shared_config({"node": [self.url]})
+        set_shared_config({"node": self.urls})
         set_shared_steem_instance(None)
         o = shared_steem_instance()
-        self.assertEqual(o.rpc.url, self.url)
+        self.assertIn(o.rpc.url, self.urls)
-- 
GitLab