From ad9dc230d1121cb1b418a30e90d4d6dace467868 Mon Sep 17 00:00:00 2001
From: Holger Nahrstaedt <holger@nahrstaedt.de>
Date: Mon, 23 Apr 2018 13:52:31 +0200
Subject: [PATCH] Add votes command to cli

cli
* add votes command to view outgoing/incoming  votes of an account
Unit tests
* improve unit tess for account and vote
* Add test_instance to check if set_shared_steem_instance, shared_steem_instance is working
* Add new command to test_cli
---
 beem/cli.py                 |  25 ++++++++
 tests/beem/test_account.py  |  22 +++----
 tests/beem/test_cli.py      |   7 +++
 tests/beem/test_instance.py | 112 ++++++++++++++++++++++++++++++++++++
 tests/beem/test_vote.py     |   2 +
 5 files changed, 154 insertions(+), 14 deletions(-)
 create mode 100644 tests/beem/test_instance.py

diff --git a/beem/cli.py b/beem/cli.py
index 86d365f8..4de008cb 100644
--- a/beem/cli.py
+++ b/beem/cli.py
@@ -16,6 +16,7 @@ from beem.profile import Profile
 from beem.witness import Witness, WitnessesRankedByVote, WitnessesVotedByAccount
 from beem.blockchain import Blockchain
 from beem.utils import formatTimeString
+from beem.vote import AccountVotes, ActiveVotes
 from beem import exceptions
 from beem.version import version as __version__
 from datetime import datetime, timedelta
@@ -1215,6 +1216,30 @@ def witnesses(account, limit):
     witnesses.printAsTable()
 
 
+@cli.command()
+@click.argument('account', nargs=1, required=False)
+@click.option('--direction', default="in", help="in or out (default: in)")
+@click.option('--days', default=2, help="Limit shown vote history by this amount of days (default: 2)")
+def votes(account, direction, days):
+    """ List outgoing/incoming account votes
+    """
+    stm = shared_steem_instance()
+    if not account:
+        account = stm.config["default_account"]
+    utc = pytz.timezone('UTC')
+    limit_time = utc.localize(datetime.utcnow()) - timedelta(days=days)
+    if direction == "out":
+        votes = AccountVotes(account, steem_instance=stm)
+        votes.printAsTable(start=limit_time)
+    else:
+        account = Account(account, steem_instance=stm)
+        votes_list = []
+        for v in account.history(start=limit_time, only_ops=["vote"]):
+            votes_list.append(v)
+        votes = ActiveVotes(votes_list, steem_instance=stm)
+        votes.printAsTable(votee=account["name"])
+
+
 @cli.command()
 @click.argument('account', nargs=1, required=False)
 @click.option('--reward_steem', help='Amount of STEEM you would like to claim', default="0 STEEM")
diff --git a/tests/beem/test_account.py b/tests/beem/test_account.py
index 9ef30df0..2c0faa1e 100644
--- a/tests/beem/test_account.py
+++ b/tests/beem/test_account.py
@@ -200,31 +200,28 @@ class Testcases(unittest.TestCase):
         account = Account("gtg", steem_instance=stm)
         h_list = []
         max_index = account.virtual_op_count()
-        for h in account.history(start=max_index - 4, use_block_num=False, batch_size=2, raw_output=False):
+        for h in account.history(start=max_index - 4, stop=max_index, use_block_num=False, batch_size=2, raw_output=False):
             h_list.append(h)
         self.assertEqual(len(h_list), 5)
         for i in range(1, 5):
             self.assertEqual(h_list[i]["index"] - h_list[i - 1]["index"], 1)
 
         h_list = []
-        max_index = account.virtual_op_count()
-        for h in account.history(start=max_index - 4, use_block_num=False, batch_size=6, raw_output=False):
+        for h in account.history(start=max_index - 4, stop=max_index, use_block_num=False, batch_size=6, raw_output=False):
             h_list.append(h)
         self.assertEqual(len(h_list), 5)
         for i in range(1, 5):
             self.assertEqual(h_list[i]["index"] - h_list[i - 1]["index"], 1)
 
         h_list = []
-        max_index = account.virtual_op_count()
-        for h in account.history(start=max_index - 4, use_block_num=False, batch_size=2, raw_output=True):
+        for h in account.history(start=max_index - 4, stop=max_index, use_block_num=False, batch_size=2, raw_output=True):
             h_list.append(h)
         self.assertEqual(len(h_list), 5)
         for i in range(1, 5):
             self.assertEqual(h_list[i][0] - h_list[i - 1][0], 1)
 
         h_list = []
-        max_index = account.virtual_op_count()
-        for h in account.history(start=max_index - 4, use_block_num=False, batch_size=6, raw_output=True):
+        for h in account.history(start=max_index - 4, stop=max_index, use_block_num=False, batch_size=6, raw_output=True):
             h_list.append(h)
         self.assertEqual(len(h_list), 5)
         for i in range(1, 5):
@@ -242,31 +239,28 @@ class Testcases(unittest.TestCase):
         account = Account("gtg", steem_instance=stm)
         h_list = []
         max_index = account.virtual_op_count()
-        for h in account.history_reverse(stop=max_index - 4, use_block_num=False, batch_size=2, raw_output=False):
+        for h in account.history_reverse(start=max_index, stop=max_index - 4, use_block_num=False, batch_size=2, raw_output=False):
             h_list.append(h)
         self.assertEqual(len(h_list), 5)
         for i in range(1, 5):
             self.assertEqual(h_list[i]["index"] - h_list[i - 1]["index"], -1)
 
         h_list = []
-        max_index = account.virtual_op_count()
-        for h in account.history_reverse(stop=max_index - 4, use_block_num=False, batch_size=6, raw_output=False):
+        for h in account.history_reverse(start=max_index, stop=max_index - 4, use_block_num=False, batch_size=6, raw_output=False):
             h_list.append(h)
         self.assertEqual(len(h_list), 5)
         for i in range(1, 5):
             self.assertEqual(h_list[i]["index"] - h_list[i - 1]["index"], -1)
 
         h_list = []
-        max_index = account.virtual_op_count()
-        for h in account.history_reverse(stop=max_index - 4, use_block_num=False, batch_size=6, raw_output=True):
+        for h in account.history_reverse(start=max_index, stop=max_index - 4, use_block_num=False, batch_size=6, raw_output=True):
             h_list.append(h)
         self.assertEqual(len(h_list), 5)
         for i in range(1, 5):
             self.assertEqual(h_list[i][0] - h_list[i - 1][0], -1)
 
         h_list = []
-        max_index = account.virtual_op_count()
-        for h in account.history_reverse(stop=max_index - 4, use_block_num=False, batch_size=2, raw_output=True):
+        for h in account.history_reverse(start=max_index, stop=max_index - 4, use_block_num=False, batch_size=2, raw_output=True):
             h_list.append(h)
         self.assertEqual(len(h_list), 5)
         for i in range(1, 5):
diff --git a/tests/beem/test_cli.py b/tests/beem/test_cli.py
index c17313ad..a31b6add 100644
--- a/tests/beem/test_cli.py
+++ b/tests/beem/test_cli.py
@@ -217,6 +217,13 @@ class Testcases(unittest.TestCase):
         result = runner.invoke(cli, ['witnesses'])
         self.assertEqual(result.exit_code, 0)
 
+    def test_votes(self):
+        runner = CliRunner()
+        result = runner.invoke(cli, ['votes', '--direction', 'out'])
+        self.assertEqual(result.exit_code, 0)
+        result = runner.invoke(cli, ['votes', '--direction', 'in'])
+        self.assertEqual(result.exit_code, 0)
+
     def test_approvewitness(self):
         runner = CliRunner()
         result = runner.invoke(cli, ['-o', 'approvewitness', 'beem1'], input="test\n")
diff --git a/tests/beem/test_instance.py b/tests/beem/test_instance.py
new file mode 100644
index 00000000..ce1f3830
--- /dev/null
+++ b/tests/beem/test_instance.py
@@ -0,0 +1,112 @@
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+from builtins import range
+from builtins import super
+import mock
+import string
+import unittest
+import random
+from pprint import pprint
+from beem import Steem
+from beem.amount import Amount
+from beem.witness import Witness
+from beem.account import Account
+from beem.instance import set_shared_steem_instance, shared_steem_instance, set_shared_config
+from beem.blockchain import Blockchain
+from beem.block import Block
+from beem.market import Market
+from beem.price import Price
+from beem.comment import Comment
+from beem.vote import Vote
+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 beemgrapheneapi.rpcutils import NumRetriesReached
+
+# Py3 compatibility
+import sys
+
+core_unit = "STM"
+
+
+class Testcases(unittest.TestCase):
+    @classmethod
+    def setUpClass(cls):
+        stm = shared_steem_instance()
+        stm.config.refreshBackup()
+        stm.set_default_nodes("")
+        del stm
+        cls.url = "https://api.steemitdev.com"
+        bts = Steem(
+            node=[cls.url],
+            nobroadcast=True,
+            num_retries=10
+        )
+        set_shared_steem_instance(bts)
+
+    @classmethod
+    def tearDownClass(cls):
+        stm = shared_steem_instance()
+        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)
+
+    def test_amount(self):
+        o = Amount("1 SBD")
+        self.assertEqual(o.steem.rpc.url, self.url)
+
+    def test_block(self):
+        o = Block(1)
+        self.assertEqual(o.steem.rpc.url, self.url)
+
+    def test_blockchain(self):
+        o = Blockchain()
+        self.assertEqual(o.steem.rpc.url, self.url)
+
+    def test_comment(self):
+        o = Comment("@gtg/witness-gtg-log")
+        self.assertEqual(o.steem.rpc.url, self.url)
+
+    def test_market(self):
+        o = Market()
+        self.assertEqual(o.steem.rpc.url, self.url)
+
+    def test_price(self):
+        o = Price(10.0, "STEEM/SBD")
+        self.assertEqual(o.steem.rpc.url, self.url)
+
+    def test_vote(self):
+        o = Vote("@gtg/ffdhu-gtg-witness-log|gandalf")
+        self.assertEqual(o.steem.rpc.url, self.url)
+
+    def test_wallet(self):
+        o = Wallet()
+        self.assertEqual(o.steem.rpc.url, self.url)
+
+    def test_witness(self):
+        o = Witness("gtg")
+        self.assertEqual(o.steem.rpc.url, self.url)
+
+    def test_transactionbuilder(self):
+        o = TransactionBuilder()
+        self.assertEqual(o.steem.rpc.url, self.url)
+
+    def test_steem(self):
+        stm = shared_steem_instance()
+        stm = Steem()
+        del stm
+        o = shared_steem_instance()
+        self.assertEqual(o.rpc.url, self.url)
+
+    def test_config(self):
+        set_shared_config({"node": [self.url]})
+        set_shared_steem_instance(None)
+        o = shared_steem_instance()
+        self.assertEqual(o.rpc.url, self.url)
diff --git a/tests/beem/test_vote.py b/tests/beem/test_vote.py
index c93c1cdd..df7b611b 100644
--- a/tests/beem/test_vote.py
+++ b/tests/beem/test_vote.py
@@ -120,6 +120,8 @@ class Testcases(unittest.TestCase):
             bts = self.appbase
         votes = ActiveVotes(self.authorperm, steem_instance=bts)
         votes.printAsTable()
+        vote_list = votes.get_list()
+        self.assertTrue(isinstance(vote_list, list))
 
     @parameterized.expand([
         ("non_appbase"),
-- 
GitLab